Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 172

Unknown Author

Данный модуль должен быть подсоединен к программе на этапе ее компоновки. Для этого надо вызвать компоновщик по следующему приказу (считаем, что программа одномодульна и хранится в файле Р):

LINK P.OBJ+IOPROC.OBJ, Р.ЕХЕ;

Таким образом, полный цикл обработки программы (трансляция, компоновка и счет) реализуется следующими тремя приказами ОС:

MASM P.ASM,P.OBJ,P.LST;

LINK P.OBJ+IOPROC.OBJ, Р.ЕХЕ; Р.ЕХЕ

Если бы были только процедуры из модуля IOPROC, тогда в программах пришлось бы выписывать по несколько комацд обращения к этим процедурам. Например, обращение к процедуре вывода знакового числа выглядит так:

MOV АХ,Х MOV DL,H CALL PROCOUTINT

;выводимое число ;ширина поля вывода ;вызов процедуры

Это достаточно громоздко и не очень удобно, т. к. нужно помнить о том, через какой регистр какой параметр надо передавать. Для того чтобы сделать вызовы этих процедур более короткими и наглядными, обращения ко всем этим процедурам оформлены как макросы. Например, указанные три команды описаны в виде макроса OUTINT, поэтому вместо них достаточно выписать только одну строчку - макрокоманду

OUTINT х,п

которая при трансляции программы автоматически заменится на эти команды.

Отметим, что некоторые операции (например, FINISH) столь просты, в них всего две-три команды, что их невыгодно реализовывать в виде процедур. Так вот, и эти операции описаны в виде макросов, только в этом случае макрос определяет не обращение к процедуре, а саму операцию. Описание всех этих макросов собрано в отдельном файле с названием IO.ASM (текст его также приведен ниже).

Поскольку в этом файле собраны только макроопределения, а по ним, как известно, не формируются никакие машинные команды, то данный файл не образует модуль, который можно было бы транслировать отдельно. Поэтому данный файл подключается к программе не. на- этапе компоновки, как модуль IOPROC.OBJ, а еще на этапе трансляции - по директиве INCLUDE IO.ASM. По ней в текст программы вставляются все макроопределения из файла, после чего в программе уже можно пользователя макрокомандами типа OUTINT х,п и FINISH.

Далее приводятся тексты файлов IOPROC.ASM и IO.ASM без дополнительных пояснений, поскольку все используемые в них приемы программирования так или иначе были рассмотрены в предыдущих частях книги, а кроме того, эти тексты снабжены необходимыми комментариями. Отметим лишь, что директивы .XUST и .LIST, используемые в файле IO.ASM, объясняются в разд. 14.4.

133,2* Текст файла IOPROCASM

; Модуль IOPROC: Процедуры ввода-вывода    v

public procnl, procoutnum, procflush, procinch, procinint

iocode segment

assume cs:iocode

; ************************************************

;    ВЫВОД НА ЭКРАН

;************************************************

Перевод курсора ва новую строку экрана Обращение: call procnl Параметров нет

Procnl proc far push dx

(курсор на начало строки) (курсор на следующую строку)

push ах

mov ah,2

mov dl,13

; CR

int 21h

mov dl,10

; LF

int 21h

pop ax

pop dx

ret

procnl endp

Вывод целого числа-слова со знаком или без знака Обращение: call procoutnum На входе: ах - выводимое число