1

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

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

から減算してその結果を に格納しようとすると発生ml1337skillzusPopます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
4

1 に答える 1

6

次の 2 行が問題です。

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

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

これを回避するには、次の 2 つの方法があります。

  1. my1337Sk1LLzとのサイズを変更しDifferenceます。現在、それぞれ asWORDとのタイプがありSWORDます。これらを 32 ビットに変更したり、32 ビットにすることができDWORDますSDWORD

  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
    

    次に、 の下位ワードを に格納し、上位ワードを破棄できeaxますDifference

    mov Difference, ax
    
于 2013-04-29T02:14:43.547 に答える