#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 с выбором и просто скомпилировал две программы, используя константы в качестве аргумента для этого макроса.