Nasm和Disasm问题与32/64位

时间:2013-01-16 08:59:10

标签: assembly x86 x86-64 nasm

我是一个新手,我想将这个小片段编译成32位和64位代码:

pop bx
ret

使用" nasm.exe asm.asm"组装到0x5b 0xc3。这应该是32位代码(默认为nasm)但是" ndisasm.exe asm -b 32"错误地反汇编它以弹出 ebx 并返回。

但是

bits 64
pop bx
ret

汇编到0x66 0x5b 0xc3与" nasm.exe asm.asm"和" ndisasm.exe asm -b 64"正确地将其拆解为pop bx和ret。

我哪里出错了?我现在很困惑

2 个答案:

答案 0 :(得分:4)

非常抱歉发布了这个,但似乎nasm默认为16位。

通过使用32位代码的“位32”,我解决了所有问题。

答案 1 :(得分:3)

这取决于您使用的输出格式。如果未指定-f foo的输出格式,将使用默认输出格式,通常为bin,并使用bin作为输出格式选择16位模式,除非{ {1}}是明确定义的。

正如它所说in the section 2.1.2 of NASM manual:“如果您没有向NASM提供BITS选项,它将为您自己选择输出文件格式。在NASM的分发版本中,默认值始终为-f ;如果您编译了自己的NASM副本,则可以在编译时重新定义bin并选择默认值。“

因此,假设您尚未重新定义OF_DEFAULT,nasm默认使用OF_DEFAULT作为输出格式。

然后,in the section 7.1 of NASM manual表示以下内容:“bin格式不会生成目标文件:除了您编写的代码外,它不会在输出文件中生成任何内容。使用此类”纯二进制“文件通过MS-DOS:bin可执行文件和.COM设备驱动程序是纯二进制文件。纯二进制输出对操作系统和引导加载程序开发也很有用。“ ... “使用.SYS格式将NASM默认设置为16位模式(参见第6.1节)。为了使用bin编写32位或64位代码,例如OS内核,您需要明确发出binBITS 32指令。“

然后,正如它所说in the section 6.1 of NASM manual:“在大多数情况下,您不需要明确使用BITS 64 BITSaout,{{ 1}},coffelfmacho对象格式,设计用于32位或64位操作系统,都会导致NASM选择32位或64位默认为“比特模式”。“

因此,除非明确定义win32,否则这一切都取决于使用的输出格式。