1

汇编代码是

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指令有效。感谢您的快速回复、链接和解释!

4

2 回答 2

3

在汇编文件的开头放置一个bits 32指令,NASM 应该为该指令生成与 GAS 相同的机器代码。

NASM 手册中的更多信息:

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

于 2013-06-27T16:45:08.530 回答
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指令编码:

移动 reg32,imm32 ; o32 B8+r id

所以显然你处于 16 位模式。尝试在您的文件前面加上一个位标志,例如。

bits 32
于 2013-06-27T16:46:34.473 回答