Читать «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,' • je prinintl ; проверка на знак mov dx,0 mov cx,0 cmp al, je prinint2 cmp al,' jne prinint3 mov cl,l ; цикл no цифрам prinint2:

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

1333. Текст файла IO.ASM

.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