input/division 计算的 ASM 问题
ASM Issue with input/division calculation
我不知道为什么我无法获得所需的除法输出(特别是 rediv)。对于乘法,我得到了我想要的输出。幸运的是,我得到了 recar/carry 所需的输出。伙计,这很令人沮丧,因为我不知道为什么我不能正确使用 rediv。下面是示例代码。提前致谢。
.model small
.stack 100h
.data
in1 db 'Enter number 1: $'
in3 db 0Ah,0Dh, 'Enter number 1 again (For division operation): $'
in2 db 0Ah,0Dh, 'Enter number 2: $'
temp1 db ?
temp2 db ?
temp3 dw ?
remul db ?
rediv db ?
recar db ?
output1 db 0Ah,0Dh, 'The multiplication result is : $'
output2 db 0Ah,0Dh, 'The division result is : $'
output3 db 0Ah,0Dh, 'The carry is : $'
.code
;Input
mov ax,@data
mov ds,ax
lea dx,in1
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp1,al
lea dx,in3
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp3,ax
lea dx,in2
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp2,al
;Multplication
mov al,temp1
sub al,48
mov bl,temp2
sub bl,48
mul bl
add al,48
mov remul,al
lea dx,output1
mov ah,9h
int 21h
mov ah,2
mov dl,remul
int 21h
;Division
mov ax,temp3
sub ax,48
mov bl,temp2
sub bl,48
div bl
add al,48
mov rediv,al
add ah,48
mov recar,ah
lea dx,output2
mov ah,9h
int 21h
mov ah,2
mov dl,rediv
int 21h
lea dx,output3
mov ah,9h
int 21h
mov ah,2
mov dl,recar
int 21h
mov ah,4ch
int 21h
end
mov ah,1
int 21h
mov temp3,ax <<<< This is the problem!
mov ax,temp3
sub ax,48
mov bl,temp2
sub bl,48
div bl
您的部门使用的 AX
寄存器太大了!
从 DOS.GetCharacter 调用返回,AH
寄存器仍然等于 1。你需要一个 0。
快速修复:
mov ah, 0
div bl
更好的解决方法是将 temp3 变量定义为 byte,甚至更好,不要使用第三个变量作为它与 temp1 变量基本相同。
我不知道为什么我无法获得所需的除法输出(特别是 rediv)。对于乘法,我得到了我想要的输出。幸运的是,我得到了 recar/carry 所需的输出。伙计,这很令人沮丧,因为我不知道为什么我不能正确使用 rediv。下面是示例代码。提前致谢。
.model small
.stack 100h
.data
in1 db 'Enter number 1: $'
in3 db 0Ah,0Dh, 'Enter number 1 again (For division operation): $'
in2 db 0Ah,0Dh, 'Enter number 2: $'
temp1 db ?
temp2 db ?
temp3 dw ?
remul db ?
rediv db ?
recar db ?
output1 db 0Ah,0Dh, 'The multiplication result is : $'
output2 db 0Ah,0Dh, 'The division result is : $'
output3 db 0Ah,0Dh, 'The carry is : $'
.code
;Input
mov ax,@data
mov ds,ax
lea dx,in1
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp1,al
lea dx,in3
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp3,ax
lea dx,in2
mov ah,9h
int 21h
mov ah,1
int 21h
mov temp2,al
;Multplication
mov al,temp1
sub al,48
mov bl,temp2
sub bl,48
mul bl
add al,48
mov remul,al
lea dx,output1
mov ah,9h
int 21h
mov ah,2
mov dl,remul
int 21h
;Division
mov ax,temp3
sub ax,48
mov bl,temp2
sub bl,48
div bl
add al,48
mov rediv,al
add ah,48
mov recar,ah
lea dx,output2
mov ah,9h
int 21h
mov ah,2
mov dl,rediv
int 21h
lea dx,output3
mov ah,9h
int 21h
mov ah,2
mov dl,recar
int 21h
mov ah,4ch
int 21h
end
mov ah,1 int 21h mov temp3,ax <<<< This is the problem!
mov ax,temp3 sub ax,48 mov bl,temp2 sub bl,48 div bl
您的部门使用的 AX
寄存器太大了!
从 DOS.GetCharacter 调用返回,AH
寄存器仍然等于 1。你需要一个 0。
快速修复:
mov ah, 0
div bl
更好的解决方法是将 temp3 变量定义为 byte,甚至更好,不要使用第三个变量作为它与 temp1 变量基本相同。