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
相关产品推荐
相关产品推荐

