|
|
|
|
Структуры как параметры подпрограмм
Мы ввели структуры, как способ решения задачи по написанию универсальной процедуры вызова подпрограмм. Разрешите вернуться к этой проблеме.
Наилучший вариант передачи параметров подпрограмме - через адрес структуры. В качестве примера передадим данные нашей подпрограмме в одном из элементов
списка чисел, определенного при рассмотрении структур. Адреса всегда состоят из сегмента и смещения. Таким образом, макро, вызывающее подпрограмму и
передающее параметры, будет выглядеть так:
@FcnCall MACRO Fnctn,StrucAddr ;адрес подпрограммы и
;структуры
push offset StrucAddr
push segment StrucAddr
call Fnctn
|
Иногда случается, что Вам необходимо ассемблировать команду, которую ассемблер не поддерживает. Такое необходимо в ранних версиях MASM, где из-за
ошибки не ассемблируется конкретный тип команды перехода. Подобная проблема может также возникнуть при работе на новом процессоре, некоторые команды
которого MASM еще не поддерживает. Один из путей решения этой проблемы заключается в использовании макро, которое ассемблирует данные, как если бы
выполнялась команда из Руководства фирмы Intel. Например, следующее макро имитирует выполнение команды ближнего перехода.
@JmpShort MACRO destin
db 0EBh ;1-ый байт команды перехода
n = destin - * ;вычислить расстояние перехода
IFE (n LE 255) ;в байт поместится?
db n ;расстояние перехода
ELSE
.ERR ;выдать сообщение об ошибке
%OUT Ошибка в макро @JumpShort.
ENDIF ;конец проверки условия
db 90h ;3-ий байт команды
;короткого перехода
ENDM
|
Такой пример был выбран для простоты. При создании более сложных команд необходимы и более сложные макросы. Чтобы подбодрить Вас, сообщим, что
некоторые программисты создавали полные кроссассемблеры, используя немногим больше, чем описано в данном методе.
|
|