问题是当我构建一个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
构建我在控制台中编写的应用程序
然后我有一个带有16位机器代码的EXEcutable文件:
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位代码组装一个应用程序,或者我想了解我做错了什么。
感谢您的关注。
答案 0 :(得分:4)
除非你告诉反汇编程序你的代码是16位(或32位),除非它能以某种方式猜测它(例如基于可执行文件的格式,如果有的话),反汇编程序无法知道哪一个两个是。
我从16位反汇编中取出了指令字节,并将它们拆解为32位代码:
00000000:i33DB xor ebx,ebx
00000002:i53 push ebx
00000003:i53 push ebx
00000004:i53 push ebx
00000005:i6800000000 push 00000000
0000000A:i53 push ebx
0000000B:i53 push ebx
0000000C:i53 push ebx
0000000D:i0000 add [eax],al ; 0s between code & data
0000000F:i006874 add [eax+74],ch ; db 0,"ht"
00000012:i7470 je ; db "tp"
这是从汇编源生成的正确的32位机器代码,并且您没有正确地解决它。不知怎的,你把它解雇为16位,这是错误的。
答案 1 :(得分:2)
你应该告诉你的反汇编程序你已经创建了32位代码。
证明:
从:
push offset URL
反汇编者证明了这一点:
09E4:0005 680000 PUSH 0000h
09E4:0008 0000 ADD [BX+SI],AL
你看到第二个命令OP-code是0000h,这是第一个操作的参数。 反汇编程序认为这是4字节(我不知道OP代码中参数大小的确切差异,确定这是因为16 - 32位)。