2013-01-16 101 views
1

我是一个新手NASM,我想编译这个小片段为32位和64位代码:NASM和DISASM问题与32/64位

pop bx 
ret 

获得组装0x5b 0xc3与“NASM。 exe文件asm.asm“。这应该是32位代码(默认为nasm),但是“ndisasm.exe asm -b 32”错误地将其反汇编为pop ebx和ret。

bits 64 
pop bx 
ret 

被组装到0x66 0x5b 0xc3与 “nasm.exe asm.asm” 和 “ndisasm.exe ASM -b 64” 正确地拆卸本流行BX和RET。

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

回答

3

这取决于您使用的输出格式。如果您没有使用-f foo指定输出格式,则将使用默认输出格式,通常为bin,使用bin作为输出格式将选择16位模式,除非另有明确规定BITS。 。

,因为它说in the section 2.1.2 of NASM manual:“如果你不提供-f选项NASM,它会选择一个输出文件格式,你本身在NASM的分布版本中,默认总是bin;如果”已经编译了你自己的NASM副本,你可以在编译时重新定义OF_DEFAULT并选择你想要的默认值。“

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

然后,in the section 7.1 of NASM manual它说以下内容:“该bin格式不产生目标文件:它会产生什么输出文件,除非你写的代码这样的‘纯二进制’文件是由MS-DOS使用:.COM可执行文件和.SYS设备驱动程序是纯二进制文件,纯二进制输出对于操作系统和引导加载程序开发也非常有用。“ ... “使用bin格式将NASM默认设置为16位模式(请参阅第6.1节)。要使用bin编写32位或64位代码(例如OS内核),请需要明确发布BITS 32BITS 64指令。“

然后,因为它说in the section 6.1 of NASM manual:“在大多数情况下,你不应该需要使用BITS明确aoutcoffelfmachowin32win64目标文件格式,它是专为使用32位。或64位操作系统,都会导致NASM默认分别选择32位或64位模式。“

所以,这一切都取决于使用的输出格式,除非明确定义了BITS

+0

谢谢你的工作,我将奖励点给你,因为你花时间在这个答案。顺便说一句,我的答案也解决了我的问题。 –

+0

感谢您接受我的回答。我看到了你的答案,但因为它不是全部真相(因为通常是组装一些对象格式,而不是一个平面二进制文件),我也一直在想自己的NASM输出的16/32/64比特问题,我想更完整的解释也可能对其他人有帮助。 – nrz

4

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

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