首页 > 解决方案 > 存储两个数字的 LCM 的变量 ans 的值不正确(8086 程序)

问题描述

以下是我编写的用于在 EMU8086 中查找两个数字的 LCM 的代码。当我运行它时,我在 Ans 变量中得到值 0。

.MODEL SMALL 
.DATA 
Num1 DW 250 
Num2 DW 100
Ans DW ? 
.CODE 
MOV AX,@DATA 
MOV DS, AX 
MOV AX, Num1 
MOV BX, Num2 
MOV DX, 0000h 
NEXT: PUSH AX 
PUSH DX 
DIV BX 
CMP DX, 0000h 
JZ LAST 
POP DX 
POP AX 
ADD AX, Num1 
JNC NEXT 
INC DX 
JMP NEXT 
LAST: POP Ans+2 
POP Ans 
MOV AH, 4Ch 
INT 21h 
END

标签: x86-16emu8086lcm

解决方案


LCM(a, b) = a * b / GCD(a, b)

由于这个方程,您可以使用欧几里得算法找到 GCD,然后计算 LCM。假设数字 a 和 b 在 al 和 dl 中,此代码计算 LCM。

; Save multiplication value
MOV AL, DL ; This 2 lines is AL * DH
MUL DH
PUSH AX ; Store result in stack

FINDBCD: ; General idea is : LCM(a, b) = a*b/BCD(a,b)
    ; We calculate BCD with euclidean algorithm
    CMP DH, DL
    JNS CALCULATE ; Jump if DL < DH else swap them
    MOV CL, DL ; This 3 line swap DL and DH
    MOV DL, DH
    MOV DH, CL
    CALCULATE:
    MOV AL, DH ; Move greater number in AL
    XOR AH, AH ; Zero AX 8 second bits
    DIV DL ; This is AL/DL
    CMP AH, 0 ; If remainder is zero so we found BCD
    JE AFTERFINDBCD
    SUB DH, DL ; Else substract smaller number from greater number
    JMP FINDBCD ; Do this until find BCD

AFTERFINDBCD:
    CMP DH, DL 
    JNS FINDLCM ; Jump if DL < DH
    MOV CL, DL ; This 3 line swap DL and DH
    MOV DL, DH
    MOV DH, CL

FINDLCM:
    POP AX ; Retreive multiplication result
    DIV DL ; This is AX/DL
    AND AX, 0000000011111111B ; Ignore remainder


推荐阅读