gpt4 book ai didi

assembly - nasm 中的第 16 位和第 32 位

转载 作者:行者123 更新时间:2023-12-03 23:24:29 27 4
gpt4 key购买 nike

测试.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 文件基本上是代码(和数据)的二进制 block 。它没有关于其内部结构的任何高级信息。所以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 位代码,甚至只是数据,因此您需要帮助它。

关于assembly - nasm 中的第 16 位和第 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14441215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com