Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 174
Unknown Author
Ввод целого числа (со знаком в без) размером в слово Обращение: call procinint На входе: нет
На выходе: ах - введенное число
procinint proc far push bx push cx push dx
; пропуск пробелов и prinintl:
mov al,0 call procinch crap al,'
mov al,l call procinch
концов строк вначале
al - очередной символ пробел?
(с пропуском Enter)
dx -
вводимое число - нет цифры, cl"
с1=1 - минус
О - плюс
al - очередной символ (Enter - символ)
pr±n±nt3:
cmp al,'9'
; проверка на цифру
ja prin±nt4 sub al,'0'
; >'9' ?
jb pr±nint4 mov ch,l mov ah,0
; <'0' ?
; ch=l - есть цифра
mov bx,ax mov ax,dx mul cs:prten jc provfl add ax,bx jc provfl
; bx - цифра как число ; ах - предыдущее число ; *10
• >FFFFh (dx<>0) -> переполнение ; +цифра
mov dx,ax jmp pr±n±nt2
; спасти число в dx ; к след, символу
; кончились цифры (число в dx) prinint4:
mov ax,dx crop ch,l jne prnodig
; были цифры?
cmp cl,l jne prinint5
; был минус?
cmp ax,8000h ja provfl
; модуль отриц. числа > 8000h ?
neg ax pr±nint5:
; взять с минусом
pop dx pop cx pop bx ret
; выход
prten dv 10
;----------реакция на ошибки при вводе числа
provfl: lea cx,prmsgovfl ; переполнение jmp prerr
prnodig: lea cx,prmsgnodig ; нет цифр
prerr: push cs ; печать сообщения об ошибке
pop ds
lea dx,prmsg
; ds=cs
mov ah,9 int 21h
; outstr
mov dx,cx mov ah,9 int 21h call procnl
; outstr
roov ah,4Ch ; finish
int 21h
prmsg db 'Ошибка при вводе числа: prmsgovf1 db 'переполнение','$' prmsgnodig db 'нет цифры','$' procinint endp iocode ends
end ; конец модуля ioproc
13
.xlist ;запрет записи этого файла в листинг
; Файл с макросами ввода-вывода, подключаемый к ; программе по директиве: include io.asm
; ОКОНЧАНИЕ СЧЕТА ПРОГРАММЫ
.***********************************************************
Окончание счета программы обращение: finish
на входе: а1 - код завершения (можно игнорировать)
finish macro
mov ah,4Ch int 21h endm
•
Переход на новую строху обращение: newline
extrn procnlrfar newline macro
call procnl endm
Вывод символа
обращение: outch с где с - i8, г8 или т8
outch macro с push dx push ax mov dl,c mov ah,2 int 21h pop ax pop dx endm
Вывод строки символов
обращение: outstr
иа входе: ds:dx - начальный адрес строки (в конце строки д.б. символ $, код 36 (24h))
outstr macro
push ax mov ah,9 int 21h pop ax endm
Вывод целого со знаком размером в слово обращение: outint num [,leng] где num - выводимое число: ±16, rl6, ml6
>в0)
leng - ширина поля вывода: 18, г8, т8 (со значением Особенности вывода:
если поле больше, чем надо, то слева добавляются пробелы, если меньше - выводится только число (целихом); по умолчанию leng**0
extrn procoutnum:far outint macro num, leng
outnum <num>,<leng>,l endm