【发布时间】:2022-11-01 13:48:32
【问题描述】:
我在 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 我缺少什么?
【问题讨论】:
-
我抓住了——谢谢。
-
你是如何运行 NASM 的?像
nasm foo.asm一样,没有指定 32 位或 64 位目标文件格式?默认为nasm -fbin,其中默认为bits 16。如果我想看看某些东西是如何组装的,我有一个运行nasm -felf64 foo.asm/objdump -drwC -Mintel foo.o的asm-linkshell 脚本,所以我可以运行asm-link -dn foo.asm。它包含在我对Assembling 32-bit binaries on a 64-bit system (GNU toolchain) 的回答中 -
如果是这样,则几乎是 nasm: error: instruction not supported in 16-bit mode 的副本,但 Brendan 的回答在这里解释了具体症状。 Why does `add cx, 1234` in NASM 16 bit mode produce with objdump? 更密切相关,但显式使用
bits 16将16 位机器码放入-f macho64目标文件,这更明显是错误的。 Compiling assembly program to flat-form binary includes extraneous 'f' chars that don't exist in other formats 是一个精确的副本
标签: assembly x86 nasm machine-code instruction-encoding