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

Posted

技术标签:

【中文标题】将变量与寄存器一起使用:错误 A2022:指令操作数必须相同大小【英文标题】:Using variable with register: error A2022: instruction operands must be the same size 【发布时间】:2013-04-29 02:11:16 【问题描述】:

我在尝试构建此代码时收到此错误:

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

当我尝试从usPop 中减去ml1337skillz 并将结果存储到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

【问题讨论】:

【参考方案1】:

这两行是你的问题:

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

eax 是 32 位,但 my1337Sk1LLzDifference 都是 16 位。

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

    更改my1337Sk1LLzDifference 的大小。 现在您的类型分别为WORDSWORD。您可以将它们更改为 DWORDSDWORD 以使其成为 32 位。

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

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

    然后你可以做减法:

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

    然后可以将eax的低位字存入Difference,丢弃高位字:

    mov Difference, ax
    

【讨论】:

像往常一样,问题正是汇编程序所说的:P 那么我需要做些什么来解决这个问题?有没有办法让 16 位的变量接受 32 位的变量? @Shawn:您不能将 32 位放入 16 位而不丢失其他 16 位,但您可以将 16 位值放入 32 位寄存器。我已经编辑了我的答案以显示两个可能的修复。 @icktoofay 谢谢,您提供了很大的帮助,非常感谢。现在效果很好:) Related: Subtract a variable from a register? error A2022: instruction operands must be the same size 也解释了操作数大小的问题。 (但与此 Q&A 不同的是,它没有讨论之后的存储。请注意,在这种情况下,减法结果不适合 16 位,因此您 实际上截断了一些非零高位。)

以上是关于将变量与寄存器一起使用:错误 A2022:指令操作数必须相同大小的主要内容,如果未能解决你的问题,请参考以下文章

汇编指令

xmm 指令 - 内存源操作数的分段错误

Dalvik与jvm区别

Day350.字节码指令集与解析举例 -JVM

计算机组成原理--MIPS指令的表示和逻辑操作

计算机基础——指令与程序