ошибка A2094: операнд должен быть перемещаемым MASM32

#assembly #masm32

Вопрос:

То, что делает код, вызывает окно сообщений, затем зависит от того, что я нажимаю ДА/НЕТ/ОТМЕНА, я получаю 6/7/2 в реестре eax. Если я нажму «ОТМЕНА», он перейдет к концу программы, если я нажму » ДА » или «НЕТ», он перейдет в макросы «cond», где находится оператор IF ELSE. Основной код:

 TITLE <Зовнішні процедури>
.686
.model flat, stdcall
option casemap: none
include C:masm32includekernel32.inc
include C:masm32includewindows.inc
include C:masm32includeuser32.inc
includelib C:masm32libuser32.lib 
includelib C:masm32libkernel32.lib
include lab51.inc
include lab52.inc
include ifelse.inc

.data
MsgBoxText db "Yes-lab1 No-lab2 Cancel-Exit", 0
MsgBoxCaption db "Вибір", 0

MsgBoxTextLab1 db "Data transfer and modification", 0
MsgBoxCaptionLab1 db "Lab1", 0

MsgBoxTextLab2 db "y=a^4-3b/2d", 0
MsgBoxCaptionLab2 db "Lab2", 0

X dd 32127212h, 43121153h, 21344214h, 0064216340h, 23243245h, 51542145h
Y1 db 12 DUP(0FFh)
Y2 db 12 DUP(0FFh)
Y3 db 12 DUP(0FFh)
Y4 db 12 DUP(0FFh)
sumres dd 0


a SDWORD 3,-2,-4,5,10
b DWORD 5,7,10,15,25
d SDWORD -7,-2,-4,-12,-34
y SWORD 5 DUP (7777h)
td dd 0
res dw 0

cvar db 0


.code

start:
xor eax, eax
INVOKE MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, 
                    MB_YESNOCANCEL MB_SYSTEMMODAL MB_ICONQUESTION

cmp eax, 2
je exitp    
sub eax, 6
mov cvar, al
cond cvar    
exitp:
INVOKE ExitProcess, 0 
end start
 

ifelse.inc:

 cond MACRO bo
IF bo eq 0
    labOne offset X, offset Y1, offset Y2, offset Y3, offset Y4, offset sumres
    EXITM
ELSE
    labTwo offset a, offset b, offset d, offset y, offset td, offset res
    EXITM
ENDIF
ENDM
 

Проблема в том, что я получаю «ошибка A2094: операнд должен быть перемещаемым» в строке, где я вызываю макросы. Как я могу это исправить? С другими переменными в других макроскопах проблем не было.

Ошибка, из-за которой я получаю экран

Комментарии:

1. Для начала вы используете конструкцию времени компиляции, когда вам нужно условие выполнения, чтобы это не сработало. Кроме того, вы пытаетесь поместить данные в середину кода.

2. .if является ли среда выполнения, которая выдает инструкции cmp/jcc для вас, if директивой времени сборки, такой как CPP #if ( docs.microsoft.com/en-us/cpp/assembler/masm/… )

3. Да, спасибо за ваши ответы. Для моей лаборатории было задачей использовать оператор IFELSE в макросе, и я решил отказаться от идеи MessageBox с выбором и просто скомпилировал две программы, используя константы в качестве аргумента для этого макроса.