代码之家  ›  专栏  ›  技术社区  ›  Jishan

为什么添加3个字节失败,但DWORDs成功[duplicate]

  •  0
  • Jishan  · 技术社区  · 8 年前

    嘿,所以当我运行以下代码时,会出现此错误:

    1>------ Build started: Project: Project, Configuration: Debug Win32 ------
    1>  Assembling [Inputs]...
    
    1>assign2.asm(32): error A2022: instruction operands must be the same size
    
    1>assign2.asm(33): error A2022: instruction operands must be the same size
    
    1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\masm.targets(49,5):
    
     error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\assign2.obj" /Fl"Project.lst" 
    
    /I "c:\Irvine" /W3 /errorReport:prompt  /Taassign2.asm" exited with code 1.
    
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    下面是代码,当我试图从usPop中减去ml1337skillz并将结果存储到Difference中时会发生这种情况。(请记住,我刚刚开始学习这个领域:)

    TITLE Learning      (learning.asm)
    
    INCLUDE Irvine32.inc
    
    secondE = 00000000010001010000000000000000b
    
    .data
    
    myName BYTE "John Smith"
    
    nameLen = ($ - myName)
    
    nationalDebt QWORD 7975482431119.47d
    
    usPop DWORD 313900000d
    
    kindaNegative SDWORD -2147483648d
    
    my1337Sk1LLz WORD 1337h
    
    negUnit SBYTE -1
    
    half BYTE 0.5d
    
    Difference SWORD ?
    
    starField BYTE 2000 DUP("*")
    
    bigLoss SDWORD -50000
    
    .code
    main PROC
    
    FillRegs:
    
        mov eax,usPop           ;store 3139000000d into eax
        sub eax,my1337Sk1LLz    ;subtracts 1337h from usPop in eax
        mov Difference, eax     ;stores eax into Difference
    
        mov edx,bigLoss         ;stores -50000 into edx
    
        mov eax,secondE         ;store 0E00 into eax
        mov ah,'A'              ;store string A into ah 
        mov al,'X'              ;store string X into al
    
        mov ebx,secondE         ;store 0E00 into ebx
        mov bh,'B'              ;store string B into bh
        mov bl,'X'              ;store string X into bl
    
        call DumpRegs           ;shows Registers
    
        exit                    ;exits
        main ENDP
    
    END main
    
    0 回复  |  直到 10 年前
        1
  •  3
  •   icktoofay pcp    13 年前

    这两行是你的问题:

    sub eax,my1337Sk1LLz    ;subtracts 1337h from usPop in eax
    mov Difference, eax     ;stores eax into Difference
    

    eax 是32位,但都是 my1337Sk1LLz Difference 是16位。

    有两种方法可以解决这个问题:

    1. 更改的大小 1337SK1LZ马来西亚令吉 差异 . 现在你的类型是 WORD SWORD ,分别是。你可以把它们改成 DWORD SDWORD 使它们变成32位。

    2. 零扩展和截断。 你需要另一个登记册。我会用 edx 因为你好像不在那里用。首先,你需要签延期 1337SK1LZ马来西亚令吉 :

      movzx edx, my1337Sk1LLz  ; move, zero-extended, my1337Sk1LLz into EDX
      

      然后你可以做减法运算:

      sub eax, edx  ; they're the same size now so we can do this
      

      那么你就可以把 eax公司 进入之内 差异 ,丢弃高位字:

      mov Difference, ax
      
    推荐文章