3

测试.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]use eax[BITS 32]use ax,为什么?结果该不该翻?

4

2 回答 2

12

.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 位代码,甚至只是数据,因此您需要帮助它。

于 2013-01-21T15:29:59.313 回答
-1

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

即使用 -o0 标志。

自 2.0.9 版起默认开启优化

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

于 2013-01-21T14:59:40.040 回答