当我尝试构建此代码时出现此错误:
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)
这两行是你的问题:
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 位。
有两种方法可以解决这个问题:
my1337Sk1LLz更改和的大小Difference。现在您的类型分别为 asWORD和SWORD。您可以将它们更改为DWORD32SDWORD位。
零扩展和截断。您将需要另一个寄存器。我会使用,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)