首页 > 解决方案 > GCD 8086 程序

问题描述

我对 8086 编程有点陌生,它是我本学期课程的一部分。我觉得这有点困难,但还算可以。我们被要求做一个 GCD 程序,这就是我所做的,但我没有得到正确的答案,任何提高我知识的输入或建议都会非常有帮助。

;  Read a pair of 16bit numbers and compute their GCD.
.DATA
   N1 DW ?
   N2 DW ?
   A  DW ?

MSG1 DB 10,13, "ENTER 1ST 16 BIT HEXA NUMBER: $"
MSG2 DB 10,13, "ENTER 2ND 16 BIT HEXA NUMBER: $"
MSG3 DB 10,13, "GCD : $"



.CODE
START:
MOV AX, @DATA
MOV DS, AX 

MOV AH, 09H
LEA DX, MSG1
INT 21H  

LEA SI, N1
CALL READHEXA
MOV [SI+1], AL
CALL READHEXA
MOV [SI], AL
  

MOV AH, 09H
LEA DX, MSG2
INT 21H  

LEA SI, N2
CALL READHEXA
MOV [SI+1], AL
CALL READHEXA
MOV [SI], AL

MOV BX, N1
MOV AX, N2



   

; gcd start

   MAIN: CMP BX, AX
  JNE GCD

MOV AH, 09H
LEA DX, MSG3
INT 21H   

MOV AX, BX


LEA SI, AX
INC SI
CALL DISPHEXA
DEC SI
CALL DISPHEXA

MOV AH, 4CH
INT 21H

GCD: CMP BX,AX
 JC C1
 SUB BX,AX 
 
 JMP MAIN
C1:  SUB AX,BX
 DAS
 
 JMP MAIN
   



PROC READHEXA
PUSH CX ; GOOD PROGRAMMING ETIQUTTE

MOV AH, 01H ; INTERRUPT TO INPUT CHAR, INPUT IS IN AL
INT 21H             

SUB AL, 30H
CMP AL, 09H
JLE G1 ; IF HIGHER NIBBLE IS BETWEEN O TO 9 IT GOES TO G1
SUB AL, 07H

G1: MOV CL, 04H
    ROL AL, CL
    MOV CH, AL
    
MOV AH, 01H ; INTERRUPT TO INPUT CHAR, INPUT IS IN AL
INT 21H             

SUB AL, 30H
CMP AL, 09H
JLE G2 ; IF HIGHER NIBBLE IS BETWEEN O TO 9 IT GOES TO G1
SUB AL, 07H

G2: ADD AL,CH

POP CX

RET
   ENDP READHEXA  





DISPHEXA PROC NEAR
        
        MOV DL,[SI]   ;FIRST DIGIT
            
        MOV CL,04H
        SHR DL,CL
            
        CMP DL,09H
        JBE L1
        ADD DL,07H
                   
        L1: ADD DL,30H
            MOV AH,02H
            INT 21H
            
        
            
        MOV DL,[SI] ; SECOND DIGIT
        AND DL,0FH
            
        CMP DL,09H
        JBE L2
        ADD DL,07H
            
        L2: ADD DL,30H
            MOV AH,02H
            INT 21H 
            
            RET  ;RETURNS => MAIN PROGRAM
 ENDP  DISPHEXA 
  
    END START

标签: assemblyx86-16emu8086

解决方案


我感谢您将程序分解为更小的部分 - 程序。然而, AGOOD PROGRAMMING ETIQUTTE是用注释来完成每个过程:它做什么,它对输入的期望,它的输出是什么,它记录了它的变化。例如:

PROC READHEXA ; 从键盘读取两个字符。如果它们都是六进制数字0..9A.. F,则返回AL..

PROC DISPHEXA ; 将内存中字节的内容显示DS:SI为两个十六进制数字。寄存器AX, CX,DX被破坏。

程序 GCD ; (未) 计算内存变量中两个 WORD 数的 GCD N1N2并将结果存储在内存变量中A

然后更容易调试。您应该发现,当计算完成MAIN: CMP BX, AX并且两个寄存器相等时,您忘记将结果存储AX到内存变量A中。或者更改合约PROC GCD并让它返回结果AX


推荐阅读