如何在程序集8086语言中打印大于9的结果

时间:2014-09-03 03:13:34

标签: assembly

我已经制作了一个代码,用于找出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

我将如何改进此代码?有没有办法在这种情况下显示输出?

1 个答案:

答案 0 :(得分:1)

这已经足够长了,我不打算尝试自己解决你的Int 21h电话。但是,无论如何,我看到了你的失败:

两个打印功能完全相同,只打印一个数字 - 如果该数字实际上大于9,则它会超过数字到下面的字符 - IIRC标点符号,然后是大写字母。

你需要将数字分开并将每个数字发送到屏幕 - 如果你感兴趣的是两位数字,你需要几个电话,如果它们变长,那么建立一个通用的话会更好目的例程。

我个人不会使用INC_或INC2_作为标签名称 - 它们看起来太像INC命令了。不要害怕使用更长的标签名称,可读性比你必须击中的键数要重要得多。