Читать «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
; печать пробелов впереди
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