汇编代码是
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代码导致崩溃,表明这两个操作码不相等。为什么NASM会预先设置0x66,我该如何摆脱它呢?
更新:bits 32
指令有效。感谢您的快速回复,链接和解释!
答案 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