1. ホーム
  2. assembly

[解決済み] error A2022: 命令オペランドは同じサイズでなければなりません。

2022-01-29 20:19:11

質問

このコードを実行すると、次のようなエラーが発生します。

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

解決方法は?

この2行があなたの問題です。

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

eax は32ビットですが、どちらも my1337Sk1LLzDifference は16ビットです。

これを回避する方法は2つあります。

  1. のサイズを変更する my1337Sk1LLzDifference . 今、あなたが持っているタイプは WORDSWORD それぞれ これらを DWORDSDWORD を使用して32ビット化します。

  2. ゼロ伸長と切り捨て。 別のレジスターが必要です。使うのは 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
    
    

    そして、その下位ワードに eaxDifference で、上位の単語は破棄されます。

    mov Difference, ax