Ошибка умножения не дает должного результата?
Что я пытаюсь сделать?
Я беру у пользователя два целых числа и пытаюсь их умножить, используя mul
инструкция.
В чем проблема?
Каждый раз, когда я пытаюсь умножить 2 целых числа и пытаться отобразить результат, я получаю алфавит T в качестве вывода.
data segment
msg1 db "Enter first number:$"
msg2 db 10, 13,"Enter second number:$"
msg3 db 10, 13,"The product is:$"
n1 db ?
n2 db ?
pkey db "press any key...$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start: ; set segment registers: mov ax, data mov ds, ax mov es, ax
; add your code here
mov ax, @data
mov ds, ax
mov dx, offset msg1
mov ah,09h
int 21h
mov ah, 01h
int 21h
sub al, 48
mov n1, al
mov dx, offset msg2
mov ah, 09h
int 21h
mov ah, 01h
int 21h
sub al, 48
mov n2, al
mul n1
mov bl, al
mov dx, offset msg3
mov ah, 09h
int 21h
add bl, 48
mov dl, bl
mov ah, 02h
int 21h
mov ah, 4ch
int 21h
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system. int 21h
ends
end start ; set entry point and stop the assembler.
1 ответ
Почему вы получаете алфавит T в качестве вывода?
Эти инструкции:
mov dx, offset msg3
mov ah, 09h
int 21h
вызывает значение AL
быть изменены на 24
(Это на самом деле INT 21h
инструкция, которая изменяет значение AL на 24
) и инструкция mov ah, 09h
устанавливает содержание AH
в 09
, Тогда следующая инструкция
add ax, 48
добавлять 48
к содержимому AX, который дает 84
(54
в шестнадцатеричном) в AL, который является значением ASCII T
а затем вы отображаете содержимое AL
со следующим кодом:
mov dl, al
mov ah, 02h
int 21h
который отображает алфавит T
,
Чтобы это исправить, сделайте следующее:
После mul
Инструкция добавить это:
mov bl, al ; save the content of AL to BL
и после отображения msg3
измените вхождение al на bl следующим образом:
add bl, 48
mov dl, bl
mov ah, 02h
int 21h