pop cx
pop bx
pop ax
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;** @ExiToDos ********* Mакрокоманды общего назначения **
;; Завершить процесс с необязательными установками
;; значений переменной ERRORLEVEL
IF1 ;; Выполнять только в процессе прохода 1
@ExiToDOS MACRO errorcode
IFB ;; код ошибки был указан?
mov ax,4C00h ;; нет, загрузить функцию и значение
;; переменной ERRORLEVEL = "0" в AX
ELSE ;; в противном случае
mov ah,4Ch ;; загрузить функцию и значение
mov al,errorcode ;; переменной ERRORLEVEL отдельно
ENDIF
;;
@DosCall ;; вызвать MS-DOS
ENDM ;; конец макроопределения
ENDIF ;; конец выполнения прохода
;;
;;********************************************************
;; Конец макроопределений
;;********************************************************
.LIST ; восстановить выдачу листингов в нормальном виде
;; Kонец файла включения макроопределений
----------------------------------------------------------------
Использование стандартных библиотечных программ
Если вы используете стандартный набор немодифицированных
программ во всех Ваших программах, для Вас может оказаться по-
лезным поместить эти стандартные программы в библиотечный файл,
который всегда связан с Вашими программами. Использование этого
метода упрощает процесс трансляции с ассемблера и редактирования
связей, а также уменьшает размер исходных файлов вашей програм-
мы. Библиотечный файл создается путем трансляции файла, содержа-
щего Ваши стандартные программы, и последующей обработки .OBJ -
файла с помощью LIB - программы, помещенной на диске с макроас-
семблером MASM. В результате обработки LIB-программы получается
файл, содержащий корректно отформатированную объектную программу
с расширением .LIB. Внешние ссылки на эти стандартные программы
- П-27 -
должны быть описаны в исходном тексте данной программы, которая
должна вызывать эти стандартные программы. Эти стандартные прог-
раммы пишутся в формате:
EXTRN стандартная программа : расстояние
где EXTRN - управляющая команда, которая сообщает макроас-
семблеру MASM, что "стандартная подпрограмма" будет включаться
во время редактирования связей либо из объектного файла, либо из
библиотечного файла.
Параметр "расстояние" имеет значение или "близко" (near),
или "далеко" (far) в зависимости от того, как была описана стан-
дартная программа, на которую осуществляется ссылка. Для прог-
рамм с расширением типа .COM параметр и расстояние всегда имеют
значение "близко".
После того как внешние стандартные программы описаны, их
можно вызывать также, как и любые другие стандартные программы.
В листинге A-8 представлен полный исходный текст библиотеч-
ного файла STDLIB.LIB, о котором рассказывалось в предыдущих
главах.
Листинг A-8. Исходный текст библиотечного файла
STDLIB.LIB
----------------------------------------------------------------
PAGE 60,132
TITLE stdlib.asm/.ob Ўlib
.8086 ; позволяет только команды процессоров 8086/8088
.SALL ; запретить распечатку макрорасширений
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
;- - - - - - Равенства и макроопределения - - - - - - - -
;
INCLUDE stdmac.inc ; включить стандартные макробиблиотеки
; и равенства
;
;- - - - - - - - - - - Инициализация - - - - - - - - - -
;
; Инициализация, описанная ниже, представляет собой подм-
; ножество (и совместимое) с управляющей командой ".МОDEL
; SMALL" макроассемблера MASM версии 5.0 и выше.
;
_TEXT SEGMENT WORD PUBLIC 'CODE' ; сегмент программы
_TEXT ENDS
;
_DATA SEGMENT WORD PUBLIC 'DATA' ; сегмент данных
_DATA ENDS
;
DGROUP GROUP _DATA ; определить группу сегментов
;
ASSUME cs:_TEXT,ds:_DATA ; назначить физические сегменты
;
;
;********************************************************
; Начало библиотечных стандартных программ
;********************************************************
;
_TEXT SEGMENT ; начало сегмента текста программы
;
- П-28 -
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Новая строка : отображает новую строку (возврат каретки +
; + перевод строки)
;
; Вход : нет
;
; Выход : AX и DX восстанавливаются;
; другие регистры не используются.
;
; Bызываемых стандартных программ: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC NEWLINE ; библиотечная стандартная программа
;
newline PROC NEAR
push ax ; сохранить содержимое регистров
push dx
;
mov dl,CR ; отобразить возврат каретки
mov ah,02h
@DosCall
mov dl,LF ; отобразить перевод строки
mov ah,02h
@DosCall
;;
pop dx ; восстановить содержимое регистров
pop ax
ret
;
newline ENDP
;
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++
; CSAVE : Выполняет автоматическое сохранение и
; восстановление содержимого регистров : BX, CX, DI и
; SI внутри вызываемой стандартной программы. Она вызы-
; вается из другой вызываемой стандартной программы
; следующим образом :
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
; LOCALIZE EQU 10h
; routine PROC NEAR ; FAR, если средняя, большая
; ; или очень большая модель
;
; push bp
; mov bp,sp
; sub sp,LOCALIZE
; call csave
; :
; (текст стандартной программы)
; :
; ret ; всегда направляется в $cret
;
; routine ENDP
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
; Вход : смотри описание выше
;
- П-29 -
; Выход : смотри описание выше
;
; Используемые регистры: содержимое регистров BX, CX, DI и
; SI сохраняется; регистры AX и DX
; не трогаются.
;
; Вызываемые стандартные программы: идут обращения к
; "вызывающей" стандартной программе до тех пор, пока
; по ее команде возврата RET не осуществится возврат в
; эту программу, после чего по команде возврата RET
; этой программе осуществится возврат в исходную
; вызвавшую программу.
;
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC CSAVE ; библиотечная стандартная программа
;
csave PROC NEAR
push bp ; установить адресацию стека
mov bp,sp
xchg bx,[bp+2] ; сохранить содержимое регистров
; BX и получить адрес возврата
; вызвавшей стандартной программы
pop bp ; восстановить текущий адрес возврата
push cx ; сохранить содержимое остальных
; регистров
push si
push di
call bx ; продолжить обработку в
; вызвавшей стандартной программе
;
; Перейти сюда по команде возврата RET вызвавшей
; стандартной программы
$cret: pop di ; восстановить сохраненное
; содержимое регистров
pop si
pop sx
pop bx
mov sp,bp ; cбросить локальные переменные
pop bp
ret ; aвозвращает в то место, куда
; обычно идет возврат по команде
; возврата RET в вызывающую программу
;
csave ENDP
;
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++
; BIN2DEC - Преобразование из двоичной в десятичную сис-
; тему счисления. Отображает на экране дисплея в десятич-
; ном виде шестнадцатиразрядное число со знаком или без
; знака. Находит самый последний разряд справа путем деле-
; ния. Повторяет до тех пор, пока все не будет найдено.
; Может быть указано минимальное количество разрядов, под-
; лежащих отображению. Если минимальное количество указан-
; ных разрядов больше фактического количества разрядов,
; результирующее число дополняется начальными нулями.
;
- П-30 -
; Вход : AX = число, подлежащее отображению
; CH = минимальное число разрядов, подлежащих
; отображению
; DX = 0, если число, подлежащее обработке, не
; имеет знака или = 1, если число, под-
; лежащее обработке, имеет знак
;
; Выход : (регистры AX, CХ и DX восстанавливаются)
;
; Вызываемые стандартные программы: нет
;- - - - - - - - - - - - - - - - - - - - - - - - - - - -
PUBLIC BIN2DEC ; библиотечная стандартная программа
;
bin2dec PROC NEAR
push ax ; сохранить содержимое регистров
push bx
push cx
push dx
mov cl,0 ; очистить счетчик разрядов
mov bx,10 ; установить делитель = 10
cmp dx,0 ; всегда отображать номер, как
; положительное число?
je more_dec ; да, игнорировать проверку на
; отрицательное число
;
; Проверить на отрицательное число. Если число
; отрицательное, сделать его положительным.
or ax,ax ; число положительное ?
jnl more_dec ; да, игнорировать "отрицательное"
neg ax ; сделать число положительным
@DisChr '-' ; отобразить знак "минус"