nasm汇编一些需要注意的地方

经常用msam或tasm的童鞋一下转换到nasm下可能觉得不怎么适应,它们应该先去晓习一下gas的语法,然后就适应了…that‘s only a joke! :)

section .data
v101 dq 0x1234567811223344

;代码中有
mov rdx,[v101]
mov [rax*2],rdx

看一下生成的机器指令:

0x4000b0 <_start>: 0x4000ba <_start+10>:    mov    0x600170,%rdx
   0x4000c2 <_start+18>:    mov    %rdx,(%rax,%rax,1)

有2个地方有“惊奇”,首先机器码生产的貌似是将一个常量赋给rdx寄存器,实际上该常量是一个地址,是将该地址的内容赋给rdx,这从机器码上是一个容易混淆的地方;如果你要将地址的值赋给rdx,就可以看到生成的机器码会有不同,在整形数前有一个$,而且mov变为movabs:

mov rdx,v101
0x4000b0 <_start>:  movabs $0x600170,%rdx

注意nasm操作数的顺序是intel样式的:从右到左,而gdb默认是at&t样式的:从左到右.你可用:

//默认是att
set disassembly-flavor intel

来改变为intel语法。

其次代码中需要生成的是[eax*2]的相对寻址,结果机器码是[eax+eax],这是编译器有意而为之的:为了省略偏移而节省空间。你可以增加NOSPLIT关键字改变这种行为:

mov [nosplit rax*2],rdx

生成的机器码为:

//原来的机器码为:QWORD PTR [rax+rax*1],rdx
//没有偏移域
mov    QWORD PTR [rax*2+0x0],rdx
时间: 2024-12-07 23:50:08

nasm汇编一些需要注意的地方的相关文章

机器码-nasm汇编全局字符串变量的声明问题

问题描述 nasm汇编全局字符串变量的声明问题 功能:提示MessageBox消息 1: bits 32 call func0 db 'user32.dll',0 func0: mov eax,7c801d7bH ;LOADLIBRARYA CALL eax push 0 call Func1 db "Infomation",0 Func1: call Func1_1 Func1_1: call Func2 db "This exe was Injected Code.&qu

TCPMP编译方法

      本文主要讲解TCPMP播放器到WINDOWS CE平台的移植编译过程,硬件平台以ARMV4为主,结束部分会讲解到ARMV4I编译中需要注意的问题       这几天为公司一个项目做准备,准备编译移植来自linux系统的超级开源媒体播放器TCPMP(商业版名称:The Core Player)到Windwos CE平台,tcpmp是目前支持最多可以用在嵌入式设备中多媒体播放器.除了rm,rmvb等少数几种格式不支持外,其它常见视.音频格式几乎都支持.好东西是好定西,可是编译起来十分麻烦

再看知名应用背后的第三方开源项目【转】

转自http://blog.csdn.net/guojin08/article/details/42222637 http://www.cocoachina.com/iOS/20141017/9955.html iOS第三方开源库的吐槽和备忘>中作者ibireme列举了国内多款知名应用所使用的开源框架并对其中一些框架进行了分析同样国外开发者@iOSCowboy也在博客中给我们列出了国外多款知名应用使用的开源框架.另外txx's blog中详细介绍了Facebook Paper使用的第三方库. 

学计算机的值得一看的文章,跟帖也很有水平啊

从csdn上转来的,n手货,原始作者大概是04年发表的,已经无从查找原文出处了. 希望纠结要不要读研的人,看到后有所帮助. 回复CSDN和KAOYAN诸位网友的几点看法,(为避免吵架,郑重声明,本人不是高手,只是有感而发的一点个人陋见,欢迎指正,事先感谢): 就我自己的理解,谈谈我对读研和软件学院的看法,不妥之处一笑了之即可. 如果你有实际开发工作经验,感觉自己的水平和实力进入了一个高原期,迫切需要从理论上提高,那么计算机学院是唯一选择.因为计算机学院才能让你在理论上更上一层楼.软件学院从教学计

[原创]汇编初学者问题合集

几个简单的汇编初学者问题总结    0 关于指令时间的问题   上次有兄弟问关于 指令时间的问题,答复查看 intel 手册是一个办法.但很多人没有那个东东吧!,所以可以用另一招,在编译时加入 /Sc  选项: ML /Fl /Sc Kinds.asm 还有有位兄弟问过 为什么 mov ax,offset table 比 lea ax,table 速度 要快?但到底快到什么程度,恐怕也没法感性认识.下面让偶们来 看看实际效果: 首先在源文件 Kinds.asm 中敲入: data    segm

汇编基础:程序返回操作系统

上一篇聊了下汇编的伪指令,本人也是学汇编没多长时间,所以难免有些不对的地方,如果你在阅读过程中发现了错误,还希望不辞吝教呀,这一篇我们一起来看看汇编语言的程序返回操作系统这部分是怎么实现的. 我们都知道,汇编语言源程序要进过汇编和连接两个步骤才能生成一个可以在DOS下直接执行的.exe文件,在DOS下执行这个文件时,DOS像调用子程序一样,把控制权交给它,而这个exe文件执行完成后也要像子程序返回调用程序一样返回DOS, 一.用4CH系统功能调用实现返回 4CH系统调用功能是结束程序执行返回DO

汇编源代码之汇编语言制作的光带菜单及源程序(1.0)

这个是我上大二的时候的汇编语言课程设计.自己做得很满意.现在拿出来,给大家看看.我对部分代码又从新做了调整.编译后大小比原来大了一点,不过速度上去了.其实就是一个图形接口.你只要在中间加上自己的实用功能,就可以直接用了.代码我都有注释,读起来应该不会有什么问题.当然,汇编的代码本身就很难读.所以有什么不是很好懂的地方,可以直接同我联系. 我还给同学做过一个C语言版的光带菜单,不过很可惜的是自己做得不是很满意,就把程序给删掉了.大家也就看不到了 本程序用 tasm 进行编译,tlink 进行连接.

汇编源码系列之cldoc12

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ;************************************************************************;* *;* CleanDoc 1.2 (C) 1997 RonSoft. *;* *;* This is a simple litte assembler program that clean

汇编源码系列之showmem

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ;************************************************************************;*;* SHOWMEM (C) 1997 RonSoft. *;* *;* A little utility thats shows what's in a given mem positio