Пример организации ввода/вывода численных данных.

;===========================

   .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