Как подключать модуль
Пусть основная программа имеет имя prog.asm
В программу prog.asm необходимо добавить директиву include io.asm
Например: model small
Include io.Asm
.data
...
Поместить файлы io.asm и ioproc.obj в каталог с программой prog.asm
Процесс трансляции:
tasm.exe /zi prog.asm ,,,
tlink.exe /v prog.obj + ioproc.obj
td.exe prog.exe
А.2 Листинг модуля io.Asm
.xlist ; запрет записи этого файла в листинг
; Файл с макросами ввода-вывода, подключаемый к
; программе по директиве: include io.asm
;*****************************************************
; ВЫВОД НА ЭКРАН (в текстовом режиме)
;*****************************************************
;=================================
; переход на новую строку
; обращение: newline
;---------------------------------
extrn procnl: far
newline macro
call procnl
endm
;=====================================================
; Вывод целого со знаком размером в слово
; Обращение: outint num [,leng]
; где num - выводимое число: i16, r16, m16
; leng - ширина поля вывода: i8, r8, m8 (>=0)
; Особенности вывода:
;если поле больше, чем надо, то слева добавляются пробелы,
;если меньше - выводится только число (целиком);
; по умолчанию leng = 0
;-----------------------------------------------------
extrn procoutnum: far
outint macro num,leng
outnum <num>,<leng>,1
endm
;=================================
; Вывод целого без знака размером в слово
; Обращение: outword num [,leng]
; num и leng - как в outint
;---------------------------------
outword macro num,leng
outnum <num>,<leng>,0
endm
;---------------------------------
; Вспомогательный макрос проверки написания имени
; разными (большими и малыми) буквами
;---------------------------------
same macro name, variants, ans
ans=0
irp v,<variants>
ifidn <name>,<v>
ans=1
exitm
endif
endm
endm
;----------------------------------------------------------
; Вспомогательный макрос для outint (sign=1) и outword (=0)
;----------------------------------------------------------
outnum macro num, leng, sign
local regdx?
push ax
push dx
same <num>,<dx,DX,Dx,dX>,regdx?
if regdx? ;; out dx,leng->
ifb <leng> ;; mov al,leng
mov al,0 ;; xchg ax,dx
else
move al,leng
endif
xchg ax,dx
else ;;out num,leng(num<>dx)->
ifb <leng> ;; mov dl,leng
mov dl,0 ;; mov ax,num
else
mov dl,leng
endif
mov ax,num
endif
mov dh,sign
call procoutnum ;; ax=num, dl=leng, dh=sign
pop dx
pop ax
endm
;*****************************************************
; ВВОД С КЛАВИАТУРЫ
;*****************************************************
;=================================
;Очистка буфера ввода с клавиатуры
; обращение : flush
;---------------------------------
extrn procflush: far
flush macro
call procflush
endm
;=====================================================
;Ввод символа (с пропуском ENTER)
; обращение: inch x
; где x - r8, m8
; на выходе: x - введенный символ
;-----------------------------------------------------
extrn procinch: far
inch macro x
local regax?
same <x>,<ah,AH,Ah,aH>,regax?
if regax?
xchg ah,al ;;x=ah
mov al,0
call procinch
xchg ah,al
else
same <x>,<al,AL,Al,aL>,regax?
if regax?
mov al,0 ;;x=al
call procinch
else
push ax ;;x - не ah и не al
mov al,0
call procinch
mov x,al
pop ax
endif
endif
endm
;=====================================================
;Ввод целого числа (со знаком и без) размером в слово
; Обращение: inint x
; где x - r16, m16
; на выходе: x - введенное число
; Особенности ввода:
; пропускаются все пробелы и концы строк перед числом
; число должно начинаться с цифры,перед ней возможен знак
; при минусе число вводится как отрицательное
; ввод идет до первой нецифры,(в т.ч. до ENTER),она глотается
; При ошибке будет печать сообщения и останов программы
; Ошибки: "нет цифры"-в числе нет ни одной цифры
; "переполнение"- большое по модулю число
;-----------------------------------------------------
extrn procinint:far
inint macro x
local regax?
same <x>,<ax,AX,Ax,aX>,regax?
if regax?
call procinint ;;x=ax
else
push ax ;;x<>ax
call procinint
mov x,ax
pop ax
endif
endm
;=====================================================
; восстановить запись в листинг:
.list