[英]bits 16 and bits 32 in nasm
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
,为什么? 结果会翻身吗?
.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位代码,甚至只是数据,因此您需要帮助它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.