Пример организации ввода/вывода численных
данных.
;===========================
.model small
.stack 100h
.data
S db 'Пример ввода
данных и вывода результата.$'
S2 db 13,10,'Введите
число x:$'
S3 db 13,10,'Введите
число y:$'
S4 db 13,10,'Результат: x+y =$'
;параметры для
поля ввода
Enter_String db 8 ;максимальная длина
Len_S db ? ;реальная длина
Str_Field db 8 dup(' ') ;поле ввода
N db
'$' ;поле для размещения числа в
;строковом представлении для последующего вывода
x dw ? ;исходные данные для вычисления
y dw ?
z dw ?
desw dw 10
znak dw ?
;================
.code
begin: mov ax,@data
mov ds,ax
;очистка экрана
;===============
mov ax,0600h ;ah=06 - прокрутка, al=00 - весь экран.
mov bh,07 ;нормальный атрибут (черно-белый)
mov cx,0000 ;верхняя левая позиция
mov dx,1850h ;нижняя правая позиция
int 10h ;передача управления BIOS
;установка курсора
;=================
mov ah,02 ;код операции
mov bh,0 ;номер экрана (страницы)
mov dh,05 ;номер строки
mov dl,10 ;номер столбца
int 10h
;вывод строки сообщения
;======================
mov ah,9 ;код операции
lea dx,S ;загрузка адреса
сообщения
int 21h ;вызов DOS
mov ah,9 ;вывод подсказки ввода
lea dx,S2
int 21h
call read ;вызов
подпрограммы ввода числа
mov x,ax
mov ah,9 ;вывод подсказки ввода
lea dx,S3
int 21h
call read ;вызов
подпрограммы ввода числа
mov y,ax
;вычисление и вывод численного результата на
экран
;N:=x+y
;===============
mov ax,x ;вычисление
add ax,y
mov z,ax ;z:=x+y
mov ah,9 ;вывод текстовой части результата
lea dx,S4
int 21h
mov ax,z
call write ;вызов
подпрограммы вывода числа на экран
mov ah,4ch ;выход из программы
int 21h
;===================
read proc
public read
;процедура для ввода числа
;число вводится как строка в поле Enter_String
;строка переводится в число и возвращается в ax.
;используются дополнительные переменные znak, desw.
;==========================
mov ah,10 ;ввод числа в виде строки
lea dx,Enter_String
int 21h
;перевод строки в число
lea si,Str_Field;
mov cl,Len_S
mov ax,0
mov bx,0
jcxz break ;выход из
цикла, если введена пустая строка
mov al,[si]
cmp al,45 ;проверка на минус.
jne
plus
mov znak,-1
inc si
dec cl
jmp for2
plus: mov
znak,1
for2: mov al,[si]
sub al,48 ;преобразование цифры к числу
push cx
dec cl
jcxz break1
for3: mul desw
loop for3
break1: add bx,ax
pop cx
inc si
mov ax,0
loop for2
mov ax,bx
imul znak
;результат в ax
break: ret
read endp
;====================================
write proc
public write
;перевод числа в строку N и ее вывод
;число находится в ax
(параметр)
;если число отрицательное, сохранить его в
стек и взять модуль
push ax
cmp ax,0
jge m1
neg ax
m1: lea bx,N
add bx,5
for1:
cwd ;подготовка
к делению
div desw ;частное в ax, остаток в dx
;остаток и есть последняя цифра числа
add dl,48
mov [bx],dl ;преобразование
последней цифры в символ
dec bx ;и запись в память по адресу в bx
cmp ax,0
jne for1 ;если в ax не 0 - повторить для
следующей цифры.
;проверка на отрицательность числа
pop ax
cmp
ax,0
jge vyvod
mov al,45
mov [bx],al
vyvod:
mov dx,bx ;загрузка в dx начала строкового представления числа
mov ah,9
int 21h ;вывод строкового
представления числа
ret
write endp
;================
end begin