在MASM上构建16位代码而不是32位代码

时间:2013-02-21 16:34:41

标签: assembly x86 32-bit masm32

问题是当我构建一个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,但没有其他结果)
  • link winurl.obj

然后我有一个带有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位代码组装一个应用程序,或者我想了解我做错了什么。

感谢您的关注。

2 个答案:

答案 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位)。