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

Assembly 在MASM上构建16位代码而不是32位代码,assembly,x86,32-bit,masm32,Assembly,X86,32 Bit,Masm32,问题是,当我构建一个32位的application.exe时,我会得到一个具有16位机器代码的应用程序 以下是代码(摘自一本书): 要构建我在控制台中编写的应用程序 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 0

问题是,当我构建一个32位的application.exe时,我会得到一个具有16位机器代码的应用程序

以下是代码(摘自一本书):

要构建我在控制台中编写的应用程序

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


谢谢你的关注

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

您应该告诉您的反汇编程序您已经创建了32位代码。 证据:
发件人:

反汇编程序显示:

09E4:0005 680000 PUSH   0000h  
09E4:0008 0000   ADD    [BX+SI],AL
您可以看到第二个命令的操作代码是0000h,这是第一个操作的参数。
反汇编程序认为这是4字节(我不知道操作码中参数的大小到底有什么不同,可以肯定这是因为16-32位)。

你确定不只是你的反汇编程序误解了可执行文件吗?如果您在PE Explorer中打开该文件会怎么样?@Michael,我已经反汇编了另一个程序,该程序使用相同的汇编程序和调试器(分别是masm611和Debug32)正常工作。机器代码不正确。这就是问题所在。不,推送bx和推送ebx的机器代码完全相同。不同之处在于它将被加载到什么样的代码段。汇编代码是正确的(它是32位的),无论出于什么原因,都是您的反汇编程序/模拟器试图将其解释为16位代码。
push bx
的代码在16位模式下为53。在32位模式下,推ebx的代码为53。所以你不能用它来区别。
push offset URL
09E4:0005 680000 PUSH   0000h  
09E4:0008 0000   ADD    [BX+SI],AL