在nasm中的位16和位32

时间:2013-01-21 14:53:25

标签: assembly x86 nasm disassembly

TEST.ASM:

org 0100h
[BITS 16]
mov eax, 0
[BITS 32]
mov eax, 0

然后按如下方式编译和反汇编:

nasm test.asm -o test.com

ndisasm -o 0x0100 test.com

结果:

00000100  66B800000000      mov eax,0x0
00000106  B80000            mov ax,0x0
00000109  0000              add [bx+si],al

从结果中我们可以看到[BITS 16]使用eax[BITS 32]使用ax,为什么?结果应该结束吗?

2 个答案:

答案 0 :(得分:8)

<。> .com文件基本上是一个二进制代码块(和数据)。它没有关于其内部的任何高级信息。所以ndisasm无法判断它是应该在16位还是32位模式下进行反汇编,它默认为16位。正如您所看到的,这确实为“BITS 16”部分产生了正确的结果,但是下面的代码已经组装成32位代码,但是ndisasm仍然将它拆解为16位,因此垃圾输出。如果指定“-b 32”,您将看到第二部分被正确拆解:

>ndisasm.exe -b 32 -o100h test.com
00000100  66B80000          mov ax,0x0
00000104  0000              add [eax],al
00000106  B800000000        mov eax,0x0

简而言之,ndisasm会将告诉您的内容,而不是想要的内容。由于.com格式,它无法判断给定的字节串是16位还是32位代码,甚至只是数据,所以你需要帮助它。

答案 1 :(得分:0)

我的猜测是你需要关闭优化。

即。使用-o0标志。

Optimization on by default since version 2.0.9

奇怪的是,我很惊讶它没有使用XOR eax,eax技巧将它设置为0,因为它曾经更快。