Assembler: сложение десятичных чисел

Печать E-mail
(33 голосов)
Автор Administrator   
01:08:2008 г.
Задача: Составить программу, выводящую на экран запрос на ввод двух чисел, с выводом результата их сложения в десятичном коде.

Листинг программы:


.model tiny
.code
org 100h
.286
start:
mov dx,offset mes1
mov ah,9
int 21h ; вывести приглашение ко вводу message1
;читаем введенную строку и преводим её в 16-ное число в регистре ах
mov dx,offset buffer
mov ah,0Ah
int 21h ; считать строку символов в буфер
mov dx,offset crlf
mov ah,9
int 21h ; перевод строки
; 76 перевод числа в ASCII-формате из буфера в бинарное число в АХ
xor di,di ; DI = 0 - номер байта в буфере
;mov ах,0h ; АХ = 0 - текущее значение результата
mov ax,0h
mov cl,blength
xor ch,ch
xor bx,bx
mov si,cx ; SI - длина буфера
mov cl,10 ; CL = 10, множитель для MUL
asc2hex:
mov bl,byte ptr bcontents[di]
sub bl,'0' ; цифра = код цифры - код символа "0",
mul cx ; иначе: умножить текущий результат на 10,
add ax,bx ; добавить к нему новую цифру,
inc di ; 90 увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb asc2hex ; продолжить (счетчик считается от 0)
push ax
mov dx,offset mes2
mov ah,9
int 21h ; вывести приглашение ко вводу message1
;читаем введенную строку и преводим её в 16-ное число в регистре ах
mov dx,offset buffer
mov ah,0Ah
int 21h ; считать строку символов в буфер
mov dx,offset crlf
mov ah,9
int 21h ; перевод строки
; 76 перевод числа в ASCII-формате из буфера в бинарное число в АХ
xor di,di ; DI = 0 - номер байта в буфере
;mov ах,0h ; АХ = 0 - текущее значение результата
mov ax,0h
mov cl,blength
xor ch,ch
xor bx,bx
mov si,cx ; SI - длина буфера
mov cl,10 ; CL = 10, множитель для MUL
asc2hex2:
mov bl,byte ptr bcontents[di]
sub bl,'0' ; цифра = код цифры - код символа "0",
mul cx ; иначе: умножить текущий результат на 10,
add ax,bx ; добавить к нему новую цифру,
inc di ; 90 увеличить счетчик
cmp di,si ; если счетчик+1 меньше числа символов -
jb asc2hex2 ; продолжить (счетчик считается от 0)
mov bx,ax
mov dx,offset mes3
mov ah,9
int 21h
pop ax
add ax,bx
mov bx,10
xor di,di
l2:
xor dx,dx
div bx
add dl,030h
dec di
mov buf_end[di],dl
cmp ax,00h
jnz l2
lea dx,buf_end[di]
mov ah,09h
int 21h
e1:
mov ah, 0; ожидание символа
int 16h
int 20
ret
buf db 16 dup (?)
buf_end db'$'

mes1 db "Vvedite pervoe chislo: $"
mes2 db "Vvedite vtoroe chislo: $"
mes3 db "Summa chisel ravna: $"
crlf db 0Dh,0Ah,'$'
buffer db 6 ; максимальный размер буфера ввода
blength db ? ; размер буфера после считывания
bcontents: ; содержимое буфера располагается за
; концом СОМ-файла
a dw 0
b dw 0
end start

Результаты работы программы:

Vvedite pervoe chislo: 23
Vvedite vtoroe chislo: 17
Summa chisel ravna: 40


 
« Assembler: работа в текстовом режиме   Определение размера памяти компьютера »
 
 
 
 

казино вулкан