assembly NASM产生意外的额外操作数大小前缀[重复]

e0uiprwp  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(149)

此问题在此处已有答案

Compiling assembly program to flat-form binary includes extraneous 'f' chars that don't exist in other formats(2个答案)
11天前关闭。
我在Linux amd64上运行NASM时遇到问题。
对单个指令mov eax, 0x12345678运行nasm产生6个字节:

00000000 <.data>:
   0:   66 b8 78 56             mov    $0x5678,%ax
   4:   34 12                   xor    $0x12,%al

但是,在AT&T格式为mov $0x12345678, %eax得同一条指令上使用as时,会产生5个字节得正确结果:

0000000000000000 <.text>:
   0:   b8 78 56 34 12          mov    $0x12345678,%eax

我错过了什么与NASM?

eoxn13cs

eoxn13cs1#

NASM认为你在汇编16位代码,看到一条32位指令,就在上面加上一个大小覆盖前缀,然后反汇编器认为你在反汇编32位代码,被大小覆盖前缀搞糊涂了,就认为是2条指令。
GAS认为您正在汇编32位代码,因此它不会生成大小覆盖前缀。
你可以通过弄清楚为什么NASM认为你在汇编16位代码来修复NASM。这是“平面二进制”输出文件格式的默认值,如果是这种情况,你可以通过在32位指令之前的某个地方放置bits 32指令来修复它。
或者,也许你正在尝试汇编16位代码,而GAS是错误的。在这种情况下,也许你需要在16位代码之前的某个地方使用.code16指令。
注意,大小覆盖前缀像切换一样工作-如果默认大小是16位,则前缀使指令为32位;且如果默认大小为32位,那么相同前缀使指令为16位。

相关问题