相同的x86汇编指令在NASM和GAS之间有所不同

时间:2013-06-27 16:35:06

标签: assembly x86 nasm gas opcode

汇编代码是

mov eax, 0x3a14a5
jmp eax

GAS生成

的操作码
0xB8, 0xA5, 0x14, 0x3A, 0x00 
0xFF, 0xE0

而NASM生成

的操作码
0x66, 0xB8, 0xA5, 0x14, 0x3A, 0x00 
0x66, 0xFF, 0xE0

所以你看到NASM在代码之前预先出现了0x66。在我的程序中(我不会详细介绍),GAS操作码正常工作,并且NASM代码导致崩溃,表明这两个操作码不相等。为什么NA​​SM会预先设置0x66,我该如何摆脱它呢?

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

2 个答案:

答案 0 :(得分:3)

在汇编文件的开头加上bits 32指令,NASM应为此指令生成与GAS相同的机器代码。

the NASM manual中的更多信息:

  

在BITS 32模式下... 32位指令不需要前缀,而使用16位数据的指令需要0x66,而在16位地址上工作的指令需要0x67。

答案 1 :(得分:3)

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

  

代码o16和o32表示给定形式的指令   应该用16或32位的操作数组合。换一种说法,   o16表示BITS 32状态中的66前缀,但不生成代码   BITS 16州; 和o32表示BITS 16状态中的66前缀但是   在BITS 32中没有生成任何内容

MOV指令编码:

  

MOV reg32,imm32; o32 B8 + r id

显然你处于16位模式。 尝试使用位标志前置文件,例如

bits 32