2013-06-27 142 views
1

汇编代码是相同x86汇编指令的不同

mov eax, 0x3a14a5 
jmp eax 

GAS产生的

0x66, 0xB8, 0xA5, 0x14, 0x3A, 0x00 
0x66, 0xFF, 0xE0 

所以你的

0xB8, 0xA5, 0x14, 0x3A, 0x00 
0xFF, 0xE0 

而NASM产生的操作码和操作码看到NASM在代码之前会出现一个0x66。在我的程序中(我不会详细讨论),GAS操作码正常工作,并且NASM代码导致崩溃,表明这两个操作码不相等。为什么NA​​SM提前0x66,我该如何摆脱它?

更新:bits 32指令工作。感谢您的快速回复,链接和解释!

回答

3

bits 32指令放在程序集文件的开始位置,NASM应为此指令生成与GAS相同的机器码。在the NASM manual

更多信息:

在BITS 32模式...... 32位指令不需要前缀,而使用16位数据指令需要一个0x66和那些在16位地址的工作需要一个0×67。

3

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

的代码O16和O32指示指令 的给定形式应与操作数尺寸16或32位被组装。换句话说, o16在BITS 32状态中指示66前缀,但在 BITS 16状态中不产生代码; 和O32表示66前缀BITS 16状态,但 产生没有在BITS 32

MOV指令编码:

MOV reg32,IMM32; o32 B8 + r id

所以显然你是位16模式。 尝试在比特标志前添加文件,例如。

bits 32