我在Linux amd64上运行NASM时遇到了问题。
在单个指令nasm上运行mov eax, 0x12345678会产生6个字节:
00000000 <.data>:
0: 66 b8 78 56 mov $0x5678,%ax
4: 34 12 xor $0x12,%al但是,在AT&T格式的同一指令上使用as,mov $0x12345678, %eax会产生5个字节的正确结果:
0000000000000000 <.text>:
0: b8 78 56 34 12 mov $0x12345678,%eax我错过了NASM的什么?
发布于 2022-11-01 01:48:31
NASM认为你正在组装16位代码,看到一条32位指令,并在上面打一个大小覆盖前缀。然后反汇编程序认为您正在拆卸32位代码,被大小覆盖前缀弄糊涂了,并假设它是2条指令。
GAS认为您正在组装32位代码,所以它不会生成大小覆盖前缀。
您可以通过弄清NASM为什么认为您正在组装16位代码来修复NASM。它是“平面二进制”输出文件格式的默认格式,如果是这样的话,您可以在32位指令/s之前放置一个bits 32指令来修复它。
或者,也许你试图组装16位代码和气体是错误的。在这种情况下,您可能需要在16位代码之前的某个地方使用.code16指令。
注意,大小覆盖前缀的工作方式类似于切换--如果默认大小为16位,则前缀将使指令32位;如果默认大小为32位,则相同的前缀将使指令16位。
https://stackoverflow.com/questions/74270600
复制相似问题