【问题标题】:bits 16 and bits 32 in nasmnasm 中的第 16 位和第 32 位
【发布时间】:2013-01-21 14:53:24
【问题描述】:

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,为什么?结果该不该翻?

【问题讨论】:

  • 当您混合 16 位和 32 位代码时,不只是 ndisasm 混乱吗? B800000000 在 32 位模式下将是 mov eax, 0

标签: assembly x86 nasm disassembly


【解决方案1】:

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

>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 位代码,甚至只是数据,所以你需要帮助它。

【讨论】:

    【解决方案2】:

    我猜你需要关闭优化。

    即使用 -o0 标志。

    Optimization on by default since version 2.0.9

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

    【讨论】:

    • 但是在命令中添加'-O0'对改变结果没有任何帮助。
    • 对 Nasm 中“优化”的作用存在一些严重误解。它不会在这里做任何事情。
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多