我已经制作了一个代码,用于找出8086汇编语言中给定数字的所有因子。但问题是,如果因子超过9,我输出错误。例如:当输入为54时,我得到正确的结果但是当输入为72时,输出错误。如果结果大于9,我将如何显示输出?
这是我的代码:
.MODEL SMALL
.STACK 100
.DATA
NUMBER DW 72
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV AX,NUMBER ; storing the dividend
MOV BX,1 ; storing the divisor (starting from 1)
MOV CX,0 ; initially all factors are zero
WHILE_:
XOR DX,DX ;clearing the bit fields
DIV BX
CMP DX,0 ; checking if remainder is 0
JE CHECK
MOV AX,NUMBER
INC BX ;incrementing divisor
CMP BX,AX ; checking if dividend is less then divisor
JL WHILE_ ;
JMP END_ ; if so then ends
CHECK:
CMP AX,BX
JG INC_ ;jump if divisor is smaller than dividend
JE INC2_ ;jump if divisor= dividend
JMP END_
INC_:
ADD CX,2 ; incrementing by 2 as we are getting to factors: divisor and the quotient
MOV AX,NUMBER
INC BX ;incrementing divisor
CMP BX,AX ;checking if dividend is less then divisor
JL WHILE_:
JMP END_
INC2_:
INC CX ; incrementing counter single time as we are getting two same factors
JMP END_
END_:
CMP CX,10
JL PRINT1:
JMP PRINT2
PRINT1:
ADD CX,48 ; printing decimal value
MOV AH,2
MOV DX,CX
INT 21H
MOV AH,4CH
INT 21H
PRINT2:
ADD CX,48 ; printing decimal value
MOV AH,2
MOV DX,CX
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
RET
我将如何改进此代码?有没有办法在这种情况下显示输出?
答案 0 :(得分:1)
这已经足够长了,我不打算尝试自己解决你的Int 21h电话。但是,无论如何,我看到了你的失败:
两个打印功能完全相同,只打印一个数字 - 如果该数字实际上大于9,则它会超过数字到下面的字符 - IIRC标点符号,然后是大写字母。
你需要将数字分开并将每个数字发送到屏幕 - 如果你感兴趣的是两位数字,你需要几个电话,如果它们变长,那么建立一个通用的话会更好目的例程。
我个人不会使用INC_或INC2_作为标签名称 - 它们看起来太像INC命令了。不要害怕使用更长的标签名称,可读性比你必须击中的键数要重要得多。