[NASM] Вычислить выражение и вывести результат при помощи макроса - Assembler
Формулировка задачи:
Задали написать уравнение x=b*c+36
b,c-любые числа, что инициализированы, х-не инициализирована и ответ нужно вывести через макрос.
Такие задания будут на экзамене, а язык мы на практике не учили, теперь сижу и пытаюсь его разобрать.
Решение задачи: «[NASM] Вычислить выражение и вывести результат при помощи макроса»
textual
Листинг программы
;Импортируемые функции: extern MessageBoxA extern wsprintfA extern ExitProcess %define MB_EXCLAMATION 48 ;Объявление константы [segment data public use32 class='DATA'] ;Сегмент кода msg_title: db "X=B*C+36", 0 fmt_str: db "Result = %d", 0 B dd 12 C dd 32 [segment bss public use32 class='DATA?'] ;Сегмент кода Buffer: resb 1024 X resd 1 [segment code public use32 class='CODE'] ;Сегмент кода ;----------------------------------------------- ;макро для вызова процедур с соглашением stdcall ;----------------------------------------------- %imacro invoke_stdcall 1-* %rep %0 - 1 %rotate -1 push dword %1 %endrep %rotate -1 call %1 %endmacro ;----------------------------------------------- ;макро для вызова процедур с соглашением cdecl ;----------------------------------------------- %imacro invoke_cdecl 1-* %rep %0 - 1 %rotate -1 push dword %1 %endrep %rotate -1 call %1 sub esp, (%0-1)*4 %endmacro ;----------------------------------------------- ;макро для замены служебного слова WHIT на запятую ;----------------------------------------------- %idefine WITH, ..start: ;Точка входа mov eax, [B] mul dword [C] mov [X], eax invoke_cdecl wsprintfA WITH Buffer, fmt_str, [X] invoke_stdcall MessageBoxA WITH 0, Buffer, msg_title, MB_EXCLAMATION push dword 0 call ExitProcess
Объяснение кода листинга программы
- Импортируемые функции: MessageBoxA, wsprintfA, ExitProcess.
- Объявление константы MB_EXCLAMATION.
- Сегменты данных и кода для размещения переменных и процедур.
- Переменные B, C, Buffer и X для выполнения вычислений и хранения результатов.
- Макросы invoke_stdcall и invoke_cdecl для вызова процедур с разными соглашениями о вызове.
- Макрос start, который является точкой входа в программу.
- Вычисление значения X как произведения B и C.
- Использование макроса invoke_cdecl для вызова функции wsprintfA для форматирования строки в буфере.
- Использование макроса invoke_stdcall для вызова функции MessageBoxA для отображения сообщения на экране.
- Вызов функции ExitProcess для завершения программы.
- Возврат 0, что означает успешный результат выполнения программы.