.MODEL small
.STACK 100h
.DATA
A dw 0
B dw 0
C Dw 0
.CODE
MAIN PROC
mov AX,@DATA
mov DS,AX
PROMPT:
mov AH,1
int 21h
mov A,Ax
mov AH,2
mov DL,20H
int 21H
mov AH,1
int 21h
mov B,Ax
mov AH,2
mov DL,20H
int 21H
mov Ax,A
;sub AL,'0'
mov Bx,B
;sub BL,'0'
cmp Ax,Bx
JE EXIT
JA GCD
JB EXCG
GCD:
MOV AH,0D
DIV AL
CMP AH,0D
JE EXIT
MOV Bx,Ax
MOV bL,AL
JMP GCD
EXCG:
MOV AH,0D
XCHG Ax,Bx
JMP GCD
EXIT:
MOV Dx,Ax
MOV AH,2
;MOV DL,AL
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
END MAIN
我希望输出将是两个数字的最大公约数。 但是我的代码显示了一些意外字符的ASCII值。
答案 0 :(得分:3)
mov AH,1 int 21h mov A,Ax
此DOS函数在AL
中返回一个字符。您不应将整个AX
存储为第一个数字!您需要的是:
mov ah, 1
int 21h
sub al, '0' ;Convert to a true number, no longer a character
mov A, al
与您的第二个号码相同。
cmp Ax,Bx
在这里比较字节。写下cmp al, bl
。
MOV AH,0D DIV AL CMP AH,0D JE EXIT
将分红设为零是可以的,但请思考一下DIV AL
的作用。它将AX
除以AL
。由于AL
只是AX
的低位部分,因此该除法将始终返回1且余数为0的商。不太有用,因为将始终选择EXIT。
EXIT: MOV Dx,Ax MOV AH,2 ;MOV DL,AL INT 21H
要显示结果,您必须将其转换回字符。您必须添加48才能执行此操作:
EXIT:
mov dl, al
add dl, '0'
mov ah, 02h
int 21h