1

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

pop bx
ret

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

bits 64
pop bx
ret

使用“nasm.exe asm.asm”和“ndisasm.exe asm -b 64”正确组装成 0x66 0x5b 0xc3 以将其反汇编以弹出 bx 和 ret。

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

4

2 回答 2

4

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

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

于 2013-01-16T09:17:52.427 回答
3

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

正如NASM 手册第 2.1.2 节中所说:“如果您不-f向 NASM 提供选项,它将为您自己选择一种输出文件格式。在 NASM 的分发版本中,默认值始终为bin;如果您”已经编译了您自己的 NASM 副本,您可以OF_DEFAULT在编译时重新定义并选择您想要的默认值。”

因此,假设您没有重新定义OF_DEFAULT,nasmbin默认用作输出格式。

然后,在 NASM 手册的第 7.1 节中,它说:“该bin格式不生成目标文件:它在输出文件中除了您编写的代码之外什么都不生成。MS-DOS 使用这种“纯二进制”文件:.COM可执行文件和.SYS设备驱动程序是纯二进制文件。纯二进制输出对于操作系统和引导加载程序开发也很有用。” ... "使用该bin格式将 NASM 默认设置为 16 位模式(请参阅第 6.1 节)。为了使用bin编写 32 位或 64 位代码,例如 OS 内核,您需要显式发出BITS 32orBITS 64指示。”

然后,正如NASM 手册第 6.1 节所述:“在大多数情况下,您不需要BITS显式使用。设计用于 32 位或 64 位操作系统aoutcoffelfmachoobject格式,默认情况下,所有这些都会导致 NASM 分别选择 32 位或 64 位模式win32win64。”

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

于 2013-01-16T11:39:32.357 回答