Ошибка умножения не дает должного результата?

Что я пытаюсь сделать?

Я беру у пользователя два целых числа и пытаюсь их умножить, используя 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
Другие вопросы по тегам