[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

Объяснение кода листинга программы

  1. Импортируемые функции: MessageBoxA, wsprintfA, ExitProcess.
  2. Объявление константы MB_EXCLAMATION.
  3. Сегменты данных и кода для размещения переменных и процедур.
  4. Переменные B, C, Buffer и X для выполнения вычислений и хранения результатов.
  5. Макросы invoke_stdcall и invoke_cdecl для вызова процедур с разными соглашениями о вызове.
  6. Макрос start, который является точкой входа в программу.
  7. Вычисление значения X как произведения B и C.
  8. Использование макроса invoke_cdecl для вызова функции wsprintfA для форматирования строки в буфере.
  9. Использование макроса invoke_stdcall для вызова функции MessageBoxA для отображения сообщения на экране.
  10. Вызов функции ExitProcess для завершения программы.
  11. Возврат 0, что означает успешный результат выполнения программы.

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы