Вот. Наколбасил прогу. Прогнал в TurboDebugger'е - усё пашет:
Код:
stak segment stack
db 128 dup (?)
stak ends
data segment
rs dw 0 ; результат преобразования
dg dw 0 ; введенная цифра
sm dw 0 ; введенный символ
data ends
code segment
assume ds:data,cs:code
start:
mov ax, data
mov ds, ax
; ----------------------------------------------
ent_beg: ; начало ввода и преобразования
mov ah, 07h ; вводим с
int 21h ; клавиатуры
mov ah, 00h ; символ в
mov sm, ax ; переменную 'sm'
cmp ax, 0Dh ; если 'sm' = #13 (ENTER)
je ent_end ; то конец ввода => ent_end
cmp ax, 08h ; если 'sm' = #8 (BACKSPACE)
je ent_bsp ; то => ent_bsp
cmp ax, 30h ; если 'sm' < #48 ('0')
jb ent_beg ; или
cmp ax, 39h ; если 'sm' > #57 ('9')
ja ent_beg ; то повторяем ввод => ent_beg
sub ax, 30h ; преобразуем символ 'sm'
mov dg, ax ; в цифру 'dg' = ord('sm') - 48
mov ax, rs ; вычисляем значение
mov bx, 10 ; выражения 10*'rs'+'dg'
mul bx ; и если результат вызывает
jo ent_beg ; переполнение при умножении
add ax, dg ; или перенос при сложении
jc ent_beg ; то повторяем ввод => ent_beg
mov rs, ax ; сохраняем результат
mov dx, sm ; выводим на экран
mov ah, 02h ; введенный с клавиатуры
int 21h ; символ 'sm' и
jmp ent_beg ; возврат на начало => ent_beg
ent_bsp: ; обработка нажатия 'backspace'
mov ax, rs ; если 'rs' = 0, т.е.
cmp ax, 0 ; строка ввода пуста, то
je ent_beg ; возврат на начало => ent_beg
mov dl, 08h ; возвращаем указатель
mov ah, 02h ; курсора на предыдущую
int 21h ; позицию
mov dl, 20h ; стираем предыдущий
mov ah, 02h ; введенный символ, выведя
int 21h ; на его место пробел
mov dl, 08h ; возвращаем указатель
mov ah, 02h ; курсора на предыдущую
int 21h ; позицию
mov dx, 0 ; делим нацело текущий
mov ax, rs ; результат преобразования
mov bx, 10 ; на 10 и запоминаем
div bx ; частное как новый
mov rs, ax ; результат преобразования
jmp ent_beg ; возврат на начало => ent_beg
ent_end: ; конец ввода и преобразования
; ----------------------------------------------
mov ah, 4ch
int 21h
code ends
end start