【发布时间】:2013-02-07 02:03:37
【问题描述】:
问题是当我构建一个 32 位的 application.exe 时,我得到一个具有 16 位机器代码的应用程序。
这是代码(摘自一本书):
.386
.model flat
.const
URL db "http://www.lionking.org/`cubbi/", 0
.code
_start:
xor ebx, ebx
push ebx
push ebx
push ebx
push offset URL
push ebx
push ebx
; call ShellExecute
push ebx
; call ExitProcess
end _start
构建我在控制台中编写的应用程序
- ml winurl.asm(我试过ml /c winurl.asm但没有其他结果)
- 链接winurl.obj
然后我有一个 16 位机器码的可执行文件:
PU = ?86, Uirtual 8086 Mode, Id/Step = 0F62, A20 enabled
09E4:0000 33DB XOR BX,BX
09E4:0002 53 PUSH BX
09E4:0003 53 PUSH BX
09E4:0004 53 PUSH BX
09E4:0005 680000 PUSH 0000h
09E4:0008 0000 ADD [BX+SI],AL
09E4:000A 53 PUSH BX
09E4:000B 53 PUSH BX
09E4:000C 53 PUSH BX
09E4:000D 0000 ADD [BX+SI],AL
09E4:000F 006874 ADD [BX+SI+74h],CH
09E4:0012 7470 JZ Short 0084
我不需要正常工作的代码。我只想用 32 位代码组装一个应用程序,或者我想了解我做错了什么。
感谢您的关注。
【问题讨论】:
-
您确定不只是您的反汇编程序误解了可执行文件吗?如果您在例如打开文件怎么办? PE 资源管理器?
-
@Michael,我已经反汇编了我的其他程序,该程序可以在相同的汇编器和调试器(分别为 masm611 和 Debug32)上正常工作。机器代码不正确。这就是问题所在。
-
不,
push bx和push ebx的机器码完全一样。不同之处在于它将被加载到什么样的代码段中。 -
组装后的代码是正确的(它是 32 位的),无论出于何种原因,都是您的反汇编器/模拟器试图将其解释为 16 位代码。
-
push bx的代码在 16 位模式下为 53。push ebx的代码在 32 位模式下为 53。所以你不能用它来区分。
标签: assembly x86 32-bit masm32