2013-04-29 6 views
1

Эй, так что я получаю эту ошибку, когда я запускаю этот код:ошибка A2022: операнды инструкции должны быть одинакового размера

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 ========== 

Вот следующий код, это происходит, когда я пытаюсь вычесть ml1337skillz из usPop и сохраните результат в разницу. (Имейте в виду, я только начинаю изучать эту область :))

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 
+0

может форматировать код? – tay10r

ответ

2

Эти две линии ваша проблема:

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

eax составляет 32 бита, но оба my1337Sk1LLz и Difference 16 бит.

Есть два способа вы можете обойти эту проблему:

  1. Изменение размера my1337Sk1LLz и Difference. Прямо сейчас у вас есть типы WORD и SWORD, соответственно. Вы можете изменить их на DWORD и SDWORD, чтобы сделать их 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 
    

    Тогда вы можете хранить младшее слово eax в Difference, отбрасывая старшее слово:

    mov Difference, ax 
    
+2

Как обычно, проблема в том, что сказал ассемблер: P – tay10r

+0

Итак, что мне нужно сделать, чтобы устранить это? Есть ли способ разрешить 16-битной системе принимать 32-битную переменную? – Shawn

+0

@Shawn: вы не можете поместить 32 бита в 16 бит, не потеряв остальные 16 бит, но вы можете поместить 16-битное значение в 32-разрядный регистр. Я отредактировал свой ответ, чтобы показать две возможные исправления. – icktoofay