Dvocifren:
mov bx, 10
div bx
Когда ваш код переходит сюда, DX
оказывается равным нулю ( Только если запрошенная операция была умножением! ), что хорошо, если вам нужнодля этого деления размера WORD.
НО когда ваша программа проваливается, DX
больше не равен нулю.DL
содержит символ, который вы напечатали в DOS.
Решите его, используя вместо этого деление по размеру BYTE, или напишите:
Dvocifren:
XOR DX, DX
mov bx, 10
div bx
Возможно, вы этого не пойметено умножение 2-значных 2-значных чисел может привести к результату 4-значное , при котором сумма 2-значных 2-значных чисел может дать только 3-значное результат.Как следствие, ваша программа не будет работать, например, 32 * 32 = 1024 (4 цифры!)
. В связи с тем, что требуется для этой задачи, я предлагаю вам использовать умножение в байтах и деление в байтах везде.
Следующий код может отображать 4-значный результат:
Multiply:
mov al, x
mov bl, y
mul bl
mov rez, ax
Print:
mov ax, rez
cmp ax, 100
jl Dvocifren
mov bl, 100
div bl
mov cl, ah ;Remainder [0,99]
mov ch, 0
push cx ;Preserve the lowest 2 digits
mov ah, 0 ;Quotient [0,98]
mov bl, 10
div bl
mov cl, ah ;Remainder [0,9]
mov dl, al ;Quotient [0,9]
add dl, 48
mov ah, 02h
int 21h
mov dl, cl
add dl, 48
mov ah, 02h
int 21h
pop ax ;Restore lowest 2 digits
Dvocifren:
mov bl, 10
div bl
mov cl, ah ;Remainder [0,9]
mov dl, al ;Quotient [0,9]
add dl, 48
mov ah, 02h
int 21h
mov dl, cl
add dl, 48
mov ah, 02h
int 21h