You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义汇编环境下通用最大公约数(GCD)代码实现求助

通用GCD实现方案(基于自定义汇编指令集)

我来帮你搞定这个通用GCD的汇编实现问题!首先得指出你原代码的核心问题:当前逻辑只针对特定数值的大小关系做了硬编码处理,没有形成通用的辗转相减循环逻辑,所以没法适配所有正整数对。

我们可以基于欧几里得算法的辗转相减版本来实现通用GCD,你的指令集只有加减、跳转和寄存器操作,正好适配这个思路:

欧几里得算法核心:GCD(a, b) = GCD(b, a-b)(当a > b时);GCD(a, b) = GCD(a-b, b)(当b > a时);直到其中一个数为0,另一个数就是最大公约数。

通用实现代码

; 初始化:读取两个输入数到R0和R1(测试固定值可替换为LI指令)
INP R0          ; 读取第一个数到R0
INP R1          ; 读取第二个数到R1

loop_start:
    ; 检查终止条件:R0为0则R1是GCD
    JEQ R0, output_r1
    ; 检查终止条件:R1为0则R0是GCD
    JEQ R1, output_r0

    ; 比较R0和R1的大小
    MOV R3, R0   ; 暂存R0到R3用于差值计算
    SUB R3, R1   ; R3 = R0 - R1
    JGT R3, r0_gt_r1  ; R0 > R1时跳转
    JLT R3, r1_gt_r0  ; R1 > R0时跳转

    ; R0 == R1时直接输出结果
    MOV R2, R0
    JMP end_program

r0_gt_r1:
    SUB R0, R1   ; R0 = R0 - R1,缩小较大值
    JMP loop_start

r1_gt_r0:
    SUB R1, R0   ; R1 = R1 - R0,缩小较大值
    JMP loop_start

output_r1:
    MOV R2, R1   ; 结果存入输出寄存器R2(A0-A7引脚)
    JMP end_program

output_r0:
    MOV R2, R0   ; 结果存入输出寄存器R2(A0-A7引脚)
    JMP end_program

end_program:
    JMP end_program  ; 程序终止循环

代码解释

  1. 输入初始化:用INP指令读取两个待计算的数到R0和R1,测试固定值时可以把INP替换为LI R0, 0xXX和LI R1, 0xXX。
  2. 终止条件判断:每次循环先检查R0或R1是否为0,一旦满足,直接输出非零的那个数作为GCD。
  3. 大小比较与迭代:通过暂存R0到R3并减去R1,根据差值的正负判断两个数的大小,对较大的数执行减法操作,逐步缩小数值规模。
  4. 输出与终止:把最终结果存入你定义的输出寄存器R2,然后进入无限循环终止程序。

测试示例

  • 测试R0=0x09(9)和R1=0x06(6):经过两次减法迭代后,R0和R1都等于3,输出结果正确。
  • 测试R0=0x1d(29)和R1=0x07(7):经过多次减法迭代后,最终R0和R1都等于1,输出结果正确。

内容的提问来源于stack exchange,提问作者tibiv111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:19