两个数字的 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