4

问题是当我构建一个 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 位代码组装一个应用程序,或者我想了解我做错了什么。

感谢您的关注。

4

2 回答 2

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 位,这是错误的。

于 2013-02-21T18:28:35.697 回答
2

您应该告诉反汇编程序您已经创建了 32 位代码。证明:
来自:

push offset URL

反汇编程序显示了这一点:

09E4:0005 680000 PUSH   0000h  
09E4:0008 0000   ADD    [BX+SI],AL

你看到第二个命令 OP-code 是 0000h,这是第一个操作的参数。反汇编程序认为它是 4 字节(我不知道 OP 代码中参数大小的确切区别是什么,可以肯定这是因为 16 - 32 位)。

于 2013-02-22T14:48:24.217 回答