两个数字的 GCD 的汇编代码计算不起作用
Assembly code calculation of the GCD of two numbers is not working
.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 值。
mov AH,1
int 21h
mov A,Ax
此 DOS 函数 return 是 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
的低位部分,此除法将始终 return 商为 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
.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 值。
mov AH,1 int 21h mov A,Ax
此 DOS 函数 return 是 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
的低位部分,此除法将始终 return 商为 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