将变量与寄存器一起使用:错误 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 位,但 my1337Sk1LLz
和 Difference
都是 16 位。
有两种方法可以解决这个问题:
更改my1337Sk1LLz
和Difference
的大小。 现在您的类型分别为WORD
和SWORD
。您可以将它们更改为 DWORD
和 SDWORD
以使其成为 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:指令操作数必须相同大小的主要内容,如果未能解决你的问题,请参考以下文章