在nasm中的位16和位32

Sea*_*ene 2 x86 assembly nasm disassembly

TEST.ASM:

org 0100h
[BITS 16]
mov eax, 0
[BITS 32]
mov eax, 0
Run Code Online (Sandbox Code Playgroud)

然后编译和反汇编如下:

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
Run Code Online (Sandbox Code Playgroud)

那么从结果来看,我们可以看到[BITS 16]使用eax,[BITS 32]使用ax,为什么?结果会翻身吗?

Igo*_*sky 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
Run Code Online (Sandbox Code Playgroud)

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