将变量与寄存器一起使用:错误 A2022:指令操作数必须具有相同大小

1 x86 assembly masm

当我尝试构建此代码时出现此错误:

1>------ Build started: Project: Project, Configuration: Debug Win32 ------
1>  Assembling [Inputs]...
1>assign2.asm(12): error A2022: instruction operands must be the same size
1>assign2.asm(13): error A2022: instruction operands must be the same size
Run Code Online (Sandbox Code Playgroud)

当我尝试ml1337skillz从 中减去usPop结果并将其存储到 中时,就会发生这种情况Difference。我用eax它作为临时寄存器。

TITLE Learning      (learning.asm)
INCLUDE Irvine32.inc

.data
usPop DWORD 313900000d               ; 32-bit
my1337Sk1LLz WORD 1337h              ; 16-bit
Difference SWORD ?                   ; 16-bit

.code
main PROC
 FillRegs:
    mov eax,usPop           ;load 3139000000d into eax    ; fine
    sub eax,my1337Sk1LLz    ;subtracts 1337h from usPop in eax  ; error #1
    mov Difference, eax     ;stores eax into Difference         ; error #2

    call DumpRegs           ;shows Registers

    exit                    ;exits
    main ENDP
END main
Run Code Online (Sandbox Code Playgroud)

ick*_*fay 7

这两行是你的问题:

sub eax,my1337Sk1LLz    ;subtracts 1337h from usPop in eax
mov Difference, eax     ;stores eax into Difference
Run Code Online (Sandbox Code Playgroud)

eax是 32 位,但 和my1337Sk1LLz都是Difference16 位。

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

  1. my1337Sk1LLz更改和的大小Difference现在您的类型分别为 asWORDSWORD。您可以将它们更改为DWORD32SDWORD位。

  2. 零扩展和截断。您将需要另一个寄存器。我会使用,edx因为你在那里似乎没有使用它。首先,您需要签名扩展my1337Sk1LLz

    movzx edx, my1337Sk1LLz  ; move, zero-extended, my1337Sk1LLz into EDX
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以做减法:

    sub eax, edx  ; they're the same size now so we can do this
    
    Run Code Online (Sandbox Code Playgroud)

    然后您可以将 的低位字存储eax到 中Difference,并丢弃高位字:

    mov Difference, ax
    
    Run Code Online (Sandbox Code Playgroud)

  • 和往常一样,问题正是汇编器所说的:P (2认同)