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

Unknown Author

dh - число со знаком (1) или без знака (0) dl - ширина поля вывода (>~0)

(если поле больше, чем надо, то слева добавляются пробелы, если меньше - выводится только число)

; отвести 6 байтов в стеке под число ; вывод со знаком (dh-1)?

; если вывод со знаком и ах<0,

; то dh:=2, ах:-abs(ax)

; спасти dh (знак) и dl (ширину) стек (в обратном порядке)

; si - кол-во цифр в числе ; ах -> (dx,ax)

; ax-ax div 10; dxsax mod 10

procoutnum proc far push bp mov bp,sp push ax push dx push si sub sp,6 ; учет знака

crop dh, 1 jne ponO crop ax,0 jge ponO mov dh,2 neg ax

ponO: push dx ; запись цифр числа в xor si,si ponl: mov dx,0

div cs:ten

add dl,'0'

mov [bp-8+si],dl ; цифра -> стек inc si or ax,ax

jnz ponl    ; еще не 0

; запись минуса, если есть, в стек

pop dx cmp dh,2 jne pon2

mov byte ptr [bp-8+si],• inc si

; печать пробелов впереди

pon2: mov dh,0    ; dx - ширина поля вывода

mov ah,2    ; функция 02 прерывания 21h

pon21: cmp dx,s±

jle ропЗ    ; ширина <= длина числа

push dx

mov dl,' '

int 21h

pop dx

dec dx

jmp pon21

; печать (минуса и) цифр ропЗ: dec si

mov dl,[bp-8+si] int 21h or si,si jnz ропЗ

; выход из процедуры add sp,6 pop si pop dx pop ax pop bp ret

ten dw 10 procoutnum endp

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

;    ВВОД С КЛАВИАТУРЫ

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

: буфер ввода с клавиатуры (для работы с функцией OAh) maxb db    128    ;    макс,    размер буфера ввода

sizeb db    0    ;    число    введенных символов в    буфере

buf db    128 dup(?) ;    сам буфер ввода

posb db    0    ;    номер    послед, считан, символа    из    buf

вспомогательная процедура ввода строки символов (включая Enter) в буфер buf (ввод без приглашения)

readbuf proc near push ax push dx push ds roov dx,cs . roov ds,dx lea dx,buf-2 roov ah,0Ah int 21h call procnl inc csisizeb roov cs:posb,0 pop ds pop dx pop ax ret

; ds:dx - адрес buf[-2]

; ввод строки в буфер (включая Enter)

; курсор иа новую строку экрана ; в длине учесть Enter ; сколько символов ухе считано из buf

readbuf endp

Очистка буфера ввода с< клавиатуры Обращение: call procflush Параметров нет

procflush proc far push ax

roov cs:sizeb,0 ; очистка buf roov cs:posb,0

roov ah,0Ch    ; очистка DOS-буфера

mov al,0

int 21h

pop ax

ret

procflush endp

гагвеа&кз&агггз:г8::г=гаввввве8аБ&вае8в8&вава8яавявяевваза1еввва1ввезга

Ввод символа (с пропуском или без пропуска Enter)

Обращение: call procinch

На входе: al - Enter пропустить (0) или выдать как символ (1)

На выходе: al - введенный символ (ah не меняется)

procinch proc far push bx princhl:

mov bl,cs:posb ; номер последнего считанного символа inc bl    ; след, номер

cmp bl,cs:sizeb jb princh2 jne princhlO crap al,0 jne princh2 princhlO:

не последний символ буфера?

буфер не считан до конца? считывать ли конец строки (Enter)?

; доввод в буфер ; повторить

;запомнить номер считываемого символа

call readbuf jmp princhl princh2:

mov ce:poeb,bl mov bh,0

mov al,cs:buf[bx-l] ;а1:всимвол

pop bx

ret

procinch endp

IEESSKEe3SXEEBB==SS=E=KSEEeSKSaBESaBEESECaBESESOS8aBEa