assembly - 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
解决方案
我感谢您将程序分解为更小的部分 - 程序。然而, AGOOD PROGRAMMING ETIQUTTE
是用注释来完成每个过程:它做什么,它对输入的期望,它的输出是什么,它记录了它的变化。例如:
PROC READHEXA ; 从键盘读取两个字符。如果它们都是六进制数字0
..9
或A
.. F
,则返回AL
..
PROC DISPHEXA ; 将内存中字节的内容显示DS:SI
为两个十六进制数字。寄存器AX
, CX
,DX
被破坏。
程序 GCD ; (未写) 计算内存变量中两个 WORD 数的 GCD N1
,N2
并将结果存储在内存变量中A
。
然后更容易调试。您应该发现,当计算完成MAIN: CMP BX, AX
并且两个寄存器相等时,您忘记将结果存储AX
到内存变量A
中。或者更改合约PROC GCD
并让它返回结果AX
。
推荐阅读
- jquery - 数据表自定义过滤器不搜索
- java - 使用现有的文本视图设计以编程方式在另一个文本视图下方显示文本视图
- javascript - 阻止 Object.keys 迭代自定义全局方法?
- python - 尝试使用 pip 安装 mod_wsgi 时遇到退出状态 1120
- vb.net - 有没有一种方法可以添加到列表(列表(字符串))byVal?
- java - 如何使用分隔符并在我的文本文件中创建所有注释的输出
- javascript - 对象字面量中的静态成员
- android - 加载带有数据的 jbitmap
- javascript - 使用按钮触发 Apache Velocity #set 参数 (HTML / JS)
- javascript - 在 .then() 中向函数添加参数会破坏 JS 中 Promise 的行为