Инструменты пользователя

Инструменты сайта


examination:asm:question26

Вопрос №26. Использование МО при программировании на ЯА. Библиотеки МО. Примеры

Макроопределения

Макроопределения Одно из самых мощных языковых средств ассемблера — макроопределения. Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой MACRO и заканчивается ENDM. Например: пусть описано макроопределение hex2ascii, переводящее шестнадцатеричное число, находящееся в регистре AL, в ASCII-код соответствующей шестнадцатеричной цифры:

hex2ascii macro

cmp al,10

sbb al,69h

das

endm

Теперь в программе можно использовать слово hex2ascii, как если бы это было имя команды, и ассемблер заменит каждое такое слово на три команды, содержащиеся в макроопределении. Разумеется, можно оформить этот же участок кода в виде процедуры и вызывать его командой CALL — если процедура вызывается больше одного раза, этот вариант программы займет меньше места, но вариант с макроопределением станет выполняться быстрее, так как в нем не будет лишних команд CALL и RET.

Где должны располагаться макроопределения? Есть три варианта:

1.В начале исходного текста программы до сегмента кода и данных с тем, чтобы не ухудшать читабельность программы. Этот вариант следует применять в случаях, если определяемые вами макрокоманды актуальны только в пределах одной этой программы.

2.В отдельном файле. Этот вариант подходит при работе над несколькими программами одной проблемной области. Чтобы сделать доступными эти макроопределения в конкретной программе, необходимо в начале исходного текста этой программы записать директиву include имя_файла, к примеру:

masm

model small

include show.inc

;в это место будет вставлен текст файла show.inc

3.В макробиблиотеке. Если у вас есть универсальные макрокоманды, которые используются практически во всех ваших программах, то их целесообразно записать в так называемую макробиблиотеку. Сделать актуальными макрокоманды из этой библиотеки можно с помощью все той же директивы include.

Макробиблиотека представляет собой файл с текстами макроопределений. Макроопределения записываются в этот файл точно в таком же виде, как и в текст программы. Ниже приведен текст файла макробиблиотеки с произвольным именем MYMACRO.MAC, содержащей две макрокоманды.

;Макрокоманда endpr завершения программы

endpr macro ;Макрокоманда без параметров

mov AX,4C00h

int 2 In

endm ;Конец макрокоманды

;Макрокоманда delay настраиваемой программной задержки

delay macro time ;Параметр - число шагов

locallabell,Iabel2 ;Локальные метки

push CX ;Сохраним внешний счетчик

mov CX,time ;Получим фактический параметр

Iabel2 : push CX ;Сохраним его в стеке

mov CX, 0 ;Пусть будет 64К шагов

labell: loop lanell ;Внутренний цикл

pop CX ;Извлечем внешний счетчик

loop Iabel2 ;Внешний цикл

pop CX ;Восстановим CX программы

endm ;Конец макрокоманды

Для того чтобы транслятору были доступны макрокоманды из файла MYMACRO.MAC, его следует на этапе трансляции подсоединить к исходному тексту программы директивой ассемблера include:

include my macro, mac

Все макрокоманды, включенные в этот файл, можно использовать в любом месте программы.

examination/asm/question26.txt · Последние изменения: 2014/01/15 08:12 (внешнее изменение)