我是一个新手,我想将这个小片段编译成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。
我哪里出错了?我现在很困惑
答案 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内核,您需要明确发出bin
或BITS 32
指令。“
然后,正如它所说in the section 6.1 of NASM manual:“在大多数情况下,您不需要明确使用BITS 64
。 BITS
,aout
,{{ 1}},coff
,elf
和macho
对象格式,设计用于32位或64位操作系统,都会导致NASM选择32位或64位默认为“比特模式”。“
因此,除非明确定义win32
,否则这一切都取决于使用的输出格式。