Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 / МУ_ЭВМ+ПУ_ч1 / 11-МУ_ЭВМ+ПУ-прилA.docx
Скачиваний:
34
Добавлен:
28.05.2015
Размер:
42.8 Кб
Скачать

Как подключать модуль

Пусть основная программа имеет имя prog.asm

  1. В программу prog.asm необходимо добавить директиву include io.asm

Например: model small

Include io.Asm

.data

...

  1. Поместить файлы io.asm и ioproc.obj в каталог с программой prog.asm

  2. Процесс трансляции:

  • 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

Соседние файлы в папке МУ_ЭВМ+ПУ_ч1