两个数字的GCD的汇编代码计算不起作用

时间:2019-05-21 17:53:08

标签: assembly x86 dos x86-16

.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值。

1 个答案:

答案 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