Макрокоманды в ассемблере — это средство для упрощения и оптимизации кода, позволяющее группировать последовательности часто используемых команд под одним символическим именем. Макросы облегчают чтение, написание и поддержку программ, а также позволяют сократить объём исходного текста программы.
Определение макрокоманды
Макрокоманда начинается с псевдооперации MACRO
, после которой следует тело макрокоманды, заканчивающееся ENDM
(end macro). Пример простейшей макрокоманды, заменяющей логический сдвиг влево командой сложения:
SLL MACRO
ADD A
ENDM
Использование параметров в макрокомандах
Макрокоманды могут принимать параметры, что делает их гибкими и многократно применимыми. Например, макрокоманда для логической операции NAND:
NAND MACRO ADDR
AND ADDR
INVERT ACCUMULATOR
ENDM
При вызове NAND 100
ассемблер подставит в место вызова команды, определённые в макроопределении, с учётом переданного параметра.
Пример сложной макрокоманды
Макрокоманды могут быть очень сложными и содержать множество команд, условий и циклов. Пример макрокоманды для вычисления суммы элементов массива:
SUM MACRO TOTAL, ELEM, NUM
LOAD #0
LOAD INDEX REGISTER, NUM
LOOP:
ADD ELEM, X
DECREMENT INDEX REGISTER
JUMP NOT ZERO, LOOP
STORE RESULT IN TOTAL
ENDM
Эта макрокоманда принимает три параметра: адрес, куда будет помещён результат (TOTAL), начальный адрес элементов массива (ELEM) и число элементов в массиве (NUM).
Различия между макрокомандами и подпрограммами
Хотя макрокоманды и подпрограммы служат аналогичным целям — повторному использованию кода, между ними есть существенные различия:
- Макрокоманды расширяются непосредственно в месте вызова. Каждый вызов макрокоманды приводит к вставке её тела в код.
- Подпрограммы хранятся в памяти как единичный блок кода. Для их выполнения используются команды вызова (
CALL
) и возврата (RETURN
).
Макрокоманды удобны для коротких, часто используемых последовательностей команд, тогда как подпрограммы лучше подходят для более сложных и объёмных блоков кода, которые необходимо выполнять из множества мест программы.
Использование макрокоманд значительно упрощает программирование на ассемблере, делая код более читаемым и легким для обслуживания.