Могу дать немного другую программку, которая вводит два числа
умножает их сложением и выводит результат
Думаю, можете взять для себя многое.
Потом покажете, что получилось
[code lang=asm h=200]
;макро ввода строки с консоли
;параметры:
;str - адрес буфера, куда введем строку
;два байта перед адресом str указывают на максимальный размер буфера
;и на длину реально считанной строки, в конце буфера будет код 0dh
;второй параметр - имя строки приглашения
macro GETSTR str, sTitle
{
lea dx, [sTitle] ;пригласим ввести строку
PRINT ;выводим на экран
lea dx, [str-2] ;адрес параметра для функции 0ah
mov ah, 0ah ;вводим строку
int 21h
}
;макро преобразования строки в число
;параметр str - адрес строки
;результат в AX
macro GETNUM str
{
local .loop
local .end
lea si, [str] ;адрес строки
xor cx, cx ;здесь будем накапливать число
mov bx, 10 ;будем умножать на 10
.loop: ;цикл преобразования
lodsb ;читаем в AL байт по адресу ds:[si] с автоинкриментом SI
cmp al, 0x0d ;строка заканчивается кодом 0dh
je .end ;если встретили - строка закончилась
cmp al, '0' ;проверим на цифру
jl .loop ;нецифры игнорируем
cmp al, '9'
jg .loop
and ax, 000fh ;превратим символ цифры 30h-39h в число 0-9
xchg ax, cx ;ax = старшим разрядам, cx=очередному разряду
mul bx ;dx:ax = предыдущим разрядам числа, умноженному на 10
add cx, ax ;добавляем чередной разряд
jmp .loop ;и на повтор
.end: ;число преобразовано
mov ax, cx ;результат в AX
}
;макро собственно умножения, которое заменяется сложением
;умножается два числа в регистрах AX и DI
;будем складывать число AX DI раз
;результат в AX
macro CALCSUM
{
local .loop
local .result_0
local .end
cmp di, 0 ;проверим счетчик цикла на 0
je .result_0 ;в этом случае результат будет = 0
mov bx, ax ;запомним первое число
.loop:
dec di ;один раз число у нас уже сложено!
je .end ;поэтому начинаем с вычитания 1
add ax, bx ;складываем, пока второе число не 0
jmp .loop
.result_0:
mov ax, 0 ;второе число 0 - результат = 0
.end:
}
;макро формирования числовой строки
;параметр - адрес буфера
;число в регистре AX
macro FORMSTRING str
{
local .div_loop
local .form_loop
mov bx, 10 ;будем делить на 10
mov cx, 0 ;счетчик цифр
.div_loop: ;цикл получения десятичных разрядов
mov dx, 0 ;подготавливаемся к делению
div bx ;делим DX:AX/BX
push dx ;сохраняем остаток от деления (очередную цифру!) в стеке
inc cx ;и считаем!
test ax, ax ;дошли до нуля?
jne .div_loop ;нет - продолжаем
lea di, [str] ;адрес, куда запишем строку цифр
.form_loop: ;цикл формирования числовой строки
pop ax ;разряды извлекаем из стека в обратном порядке!
or al, '0' ;делаем из числа символ цифры
stosb ;сохраняем в буфере es:[di] с автоинкриментом di
loop .form_loop ;по всем разрядом из стека
mov al, '$' ;закрываем строку символом доллара для функции 9h
stosb
}
;макро вывода строки, адрес в dx
macro PRINT
{
mov ah, 9 ;выводим
int 21h
}
;макро ожидания нажатия на клавишу
macro WAITKEY
{
mov ah, 0 ;ждем нажатие на клавишу
int 16h
}
use16
org 100h
GETSTR string, sEnterX ;вводим число Х с консоли
GETNUM string ;преобразуем в число
mov di, ax ;сохраним число в DI
GETSTR string, sEnterY ;вводим число Y с консоли
GETNUM string ;преобразуем в число
CALCSUM ;умножаем AX=AX*DI
FORMSTRING sNum ;преобразуем число AX в строку
lea dx, [sResult] ;адрес строки результата, начиная с заголовка
PRINT ;выводим сообщение на экран
WAITKEY ;ожидаем нажатие на клавишу
mov ax, 4c00h
int 21h ;выход из программы
sEnterX db "Enter number X: $"
sEnterY db 0dh,0ah,"Enter number Y: $"
db 128
db 0
string db 128 dup(?)
sResult db 0dh,0ah,"Summa = "
sNum db 8 dup (?)
[/code]