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

Hmmm汇编斐波那契序列陷入无限循环问题排查

Hmmm汇编斐波那契序列无限循环问题排查

我用Hmmm汇编写了一段代码,功能是读取用户输入的整数,输出对应长度的斐波那契序列,但现在代码陷入无限循环,没法正常终止。比如输入10时,本该输出10个斐波那契数,结果会一直打印下去。

当前代码

00 read r4          # 读取用户输入
01 setn r4 -1       # 试图给r4减1,这里写错了!
02 setn r1 1        # r1初始值1
03 setn r2 0        # r2初始值0
04 setn r5 1        # 斐波那契序列第一个数
05 write r5         # 输出第一个数1
06 jeqzn r4 13      # 如果r4为0,跳转到halt终止
07 add r3 r1 r2     # r3 = r1 + r2,计算下一个斐波那契数
08 addn r4 -1       # r4减1
09 copy r2 r1       # 更新r2为之前的r1
10 copy r1 r3       # 更新r1为新计算的斐波那契数
11 write r3         # 输出新的斐波那契数
12 jumpn 06         # 跳回判断r4是否为0
13 halt             # 程序终止

当前输出(输入r4=10时)

1
1
2
3
5
8
13
21
34
55
89
144
233
377
..
..

期望输出(输入r4=10时)

1
1
2
3
5
8
13
21
34
55

问题原因分析

核心错误在指令01:Hmmm的setn指令是直接把寄存器的值设置为后面的立即数,不是做加法。你本来想让输入的r4(比如10)减1,结果用setn r4 -1直接把r4改成了-1。之后每次循环执行addn r4 -1,r4会变成-2、-3……永远不会等于0,jeqzn r4 13这个终止条件永远触发不了,自然陷入无限循环。

修正方案

把指令01的setn r4 -1改成addn r4 -1,这样是在用户输入的数值基础上减1(因为已经提前输出了第一个数,后续只需要循环输入值-1次)。

修正后的代码

00 read r4          # 读取用户输入
01 addn r4 -1       # 正确给r4减1,匹配提前输出的第一个数
02 setn r1 1        # r1初始值1
03 setn r2 0        # r2初始值0
04 setn r5 1        # 斐波那契序列第一个数
05 write r5         # 输出第一个数1
06 jeqzn r4 13      # 如果r4为0,跳转到halt终止
07 add r3 r1 r2     # r3 = r1 + r2,计算下一个斐波那契数
08 addn r4 -1       # r4减1
09 copy r2 r1       # 更新r2为之前的r1
10 copy r1 r3       # 更新r1为新计算的斐波那契数
11 write r3         # 输出新的斐波那契数
12 jumpn 06         # 跳回判断r4是否为0
13 halt             # 程序终止

这样输入10时,r4初始变成9,循环执行9次,加上第一次的输出,正好是10个斐波那契数,到r4减到0时触发jeqzn跳转终止程序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:40:46