【问题标题】:Building 16-bit code instead of 32-bit one on MASM在 MASM 上构建 16 位代码而不是 32 位代码
【发布时间】: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 bxpush ebx 的机器码完全一样。不同之处在于它将被加载到什么样的代码段中。
  • 组装后的代码正确的(它是 32 位的),无论出于何种原因,都是您的反汇编器/模拟器试图将其解释为 16 位代码。
  • push bx 的代码在 16 位模式下为 53。 push ebx 的代码在 32 位模式下为 53。所以你不能用它来区分。

标签: assembly x86 32-bit masm32


【解决方案1】:

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

push offset URL

反汇编程序显示:

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

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

【讨论】:

    【解决方案2】:

    除非您告诉反汇编程序您的代码是 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 位,这是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-16
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多