添加 4 位数字并显示总和 - 汇编语言
Adding 4-digit numbers and displaying sum - Assembly Language
我正在编写一个程序,我想在其中从用户那里获取两个 4 位数字并显示它们的总和。
我知道如何从用户那里获取 4 位数字的输入,但我无法对 4 位数字求和并显示结果。
需要帮助了解如何添加和显示两个 4 位数字的总和。
我正在使用 emu8086 汇编程序
这是我目前所做的。总和计算不正确。控制台上不显示总和,而是显示一些符号,如“$”等。
.model small
.data
st9 db 13,10,"Enter First Number : ",'$'
st10 db 13,10,"Enter Second Number : ",'$'
st11 db 13,10,"Result = ",'$'
num dw ?
num2 dw ?
a dw 1000
b db 100
c db 10
.code
main proc
mov AX,@data
mov DS,AX
addition:
mov AH,9H
mov DX,offset st9
INT 21H
mov AH,1
INT 21H
SUB AL,30H
MUL a ;1st digit
mov num,AX
mov AH,1
INT 21H
SUB AL,30H
MUL b ;2nd digit
add num,AX
mov AH,1
INT 21H
SUB AL,30H
MUL c ;3rd digit
ADD num,AX
mov AH,1
INT 21H ;4th digit
SUB AL,30H
ADD num,AX
mov AH,9H
mov DX,offset st10
INT 21H
mov AH,1
INT 21H
SUB AL,30H
MUL a ;1st digit
mov num2,AX
mov AH,1
INT 21H
SUB AL,30H
MUL b ;2nd digit
ADD num2,AX
mov AH,1
INT 21H
SUB AL,30H
MUL c ;3rd digit
ADD num2,AX
mov AH,1
INT 21H ;4th digit
SUB AL,30H
ADD num2,AX
call addfunc
exit:
mov AH,4CH
INT 21H
addfunc proc near
mov BX,num2
ADD BX,num
SUB BX,48D
mov AH,9H
mov DX,offset st11
INT 21H
mov AH,2
mov DL,bH
INT 21H
mov AH,2
mov DL,bl
INT 21H
ret
end main
在担心总和之前,您需要确保输入正确。可惜他们错了!
计算第一个数字时使用 mul a
。由于 a 变量被定义为一个字(值为 1000),此乘法是一个字大小的运算,因此它实际上将 AX 寄存器与您的变量相乘。你的程序只在 AL 寄存器中获取一个值,它只是 AX 寄存器的低半部分。 您需要预先将上半部分AH
归零。
mov AH,1
INT 21H
SUB AL,30H
mov ah,0 <<<<<<<<<< Add this
MUL a ;1st digit
mov num,AX
第2和第3位的代码是正确的,但第4位又错了。 add num,ax
指令依赖于你没有设置的上半部分AH的内容
mov AH,1
INT 21H ;4th digit
SUB AL,30H
mov ah,0 <<<<<<<<<< Add this
ADD num,AX
您需要对 num 和 num2.
进行这些更正
addfunc proc near
mov BX,num2
ADD BX,num
SUB BX,48D
从您在 addfunc 过程中计算的总和中减去 48D 是没有意义的。
此外,在 BL 和 BH 中的字节上使用 DOS 中的 DisplayCharacter 函数不会显示结果数。
以下是如何在屏幕上显示 AX 中的 16 位数字的一种版本:
addfunc proc near
mov ax,num2
add ax,num
xor cx,cx ;Counts the digits
mov bx,10 ;Fixed divider
more:
xor dx,dx ;Word division needs to zero DX!
div bx
push dx ;Remainder [0,9]
inc cx ;One digit more
test ax,ax
jnz more ;Continu until AX is empty
next:
pop dx
add dl,48 ;Turn into a character, from [0,9] to ["0","9"]
mov ah,02h ;DOS DisplayCharacter function
int 21h
loop next ;Continu for all digits (*)
(*)由于两个4位数字的和从0到19998不等,所以显示的位数从1到5不等
我正在编写一个程序,我想在其中从用户那里获取两个 4 位数字并显示它们的总和。
我知道如何从用户那里获取 4 位数字的输入,但我无法对 4 位数字求和并显示结果。
需要帮助了解如何添加和显示两个 4 位数字的总和。
我正在使用 emu8086 汇编程序
这是我目前所做的。总和计算不正确。控制台上不显示总和,而是显示一些符号,如“$”等。
.model small
.data
st9 db 13,10,"Enter First Number : ",'$'
st10 db 13,10,"Enter Second Number : ",'$'
st11 db 13,10,"Result = ",'$'
num dw ?
num2 dw ?
a dw 1000
b db 100
c db 10
.code
main proc
mov AX,@data
mov DS,AX
addition:
mov AH,9H
mov DX,offset st9
INT 21H
mov AH,1
INT 21H
SUB AL,30H
MUL a ;1st digit
mov num,AX
mov AH,1
INT 21H
SUB AL,30H
MUL b ;2nd digit
add num,AX
mov AH,1
INT 21H
SUB AL,30H
MUL c ;3rd digit
ADD num,AX
mov AH,1
INT 21H ;4th digit
SUB AL,30H
ADD num,AX
mov AH,9H
mov DX,offset st10
INT 21H
mov AH,1
INT 21H
SUB AL,30H
MUL a ;1st digit
mov num2,AX
mov AH,1
INT 21H
SUB AL,30H
MUL b ;2nd digit
ADD num2,AX
mov AH,1
INT 21H
SUB AL,30H
MUL c ;3rd digit
ADD num2,AX
mov AH,1
INT 21H ;4th digit
SUB AL,30H
ADD num2,AX
call addfunc
exit:
mov AH,4CH
INT 21H
addfunc proc near
mov BX,num2
ADD BX,num
SUB BX,48D
mov AH,9H
mov DX,offset st11
INT 21H
mov AH,2
mov DL,bH
INT 21H
mov AH,2
mov DL,bl
INT 21H
ret
end main
在担心总和之前,您需要确保输入正确。可惜他们错了!
计算第一个数字时使用 mul a
。由于 a 变量被定义为一个字(值为 1000),此乘法是一个字大小的运算,因此它实际上将 AX 寄存器与您的变量相乘。你的程序只在 AL 寄存器中获取一个值,它只是 AX 寄存器的低半部分。 您需要预先将上半部分AH
归零。
mov AH,1
INT 21H
SUB AL,30H
mov ah,0 <<<<<<<<<< Add this
MUL a ;1st digit
mov num,AX
第2和第3位的代码是正确的,但第4位又错了。 add num,ax
指令依赖于你没有设置的上半部分AH的内容
mov AH,1
INT 21H ;4th digit
SUB AL,30H
mov ah,0 <<<<<<<<<< Add this
ADD num,AX
您需要对 num 和 num2.
进行这些更正addfunc proc near mov BX,num2 ADD BX,num SUB BX,48D
从您在 addfunc 过程中计算的总和中减去 48D 是没有意义的。
此外,在 BL 和 BH 中的字节上使用 DOS 中的 DisplayCharacter 函数不会显示结果数。
以下是如何在屏幕上显示 AX 中的 16 位数字的一种版本:
addfunc proc near
mov ax,num2
add ax,num
xor cx,cx ;Counts the digits
mov bx,10 ;Fixed divider
more:
xor dx,dx ;Word division needs to zero DX!
div bx
push dx ;Remainder [0,9]
inc cx ;One digit more
test ax,ax
jnz more ;Continu until AX is empty
next:
pop dx
add dl,48 ;Turn into a character, from [0,9] to ["0","9"]
mov ah,02h ;DOS DisplayCharacter function
int 21h
loop next ;Continu for all digits (*)
(*)由于两个4位数字的和从0到19998不等,所以显示的位数从1到5不等