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

8086汇编实现46项及以上斐波那契数列计算问题求助

8086汇编计算46项斐波那契数列的问题排查与修复

我在大学课程学习8086汇编时,尝试计算46项斐波那契数列,因为16位寄存器存不下大数,所以用两个寄存器组合成32位来计算,但代码运行到某一阶段出现错误,用EMU8086模拟,需要排查修复。

当前代码

.model small
.stack 100h
.data
FibArray dw 92 dup(0)

.code
main proc
mov ax, @data
mov ds, ax

mov word ptr FibArray[0], 0
mov word ptr FibArray[2], 0
mov word ptr FibArray[4], 1
mov word ptr FibArray[6], 0

mov cx, 44
mov si, 0
mov di, 4
lea bx, FibArray + 8

fib_loop:
mov ax, word ptr FibArray[si]
mov dx, word ptr FibArray[si+2]

add ax, word ptr FibArray[di]
adc dx, word ptr FibArray[di+2]

mov word ptr [bx], ax
mov word ptr [bx+2], dx

add si, 4
add di, 4
add bx, 4

loop fib_loop

mov ax, 4C00h
int 21h
main endp
end main

当前无符号输出

0, 0, 1, 0, 1, 0, 2, 0, 3, 0, 5, 0, 8, 0, 13, 0, 21, 0, 34, 0, 55, 0,
89, 0, 144, 0, 233, 0, 377, 0, 610, 0, 987, 0, 1597, 0, 2584, 0, 4181,
0, 6765, 0, 10946, 0, 17711, 0, 28657, 0, 46368, 0, 9489, 1, 55857, 1,
65346, 2, 55667, 4, 55477, 7, 45608, 12, 35549, 20, 15621, 33, 51170,
53, 1255, 87, 52425, 140, 53680, 227, 40569, 368, 28713, 596, 3746,
965, 32459, 1561, 36205, 2526, 3128, 4088, 39333, 6614, 42461, 10702,
16258, 17317

问题排查与修复

核心逻辑验证

你的代码核心的32位无符号加法逻辑是正确的:用add处理低16位相加,adc处理高16位加进位,能正确计算大数斐波那契值。前30多项的计算结果完全符合斐波那契数列,说明加法逻辑没有问题。

可能的误解点

  1. 项数定义混淆:
    • 如果你要计算的是从F₀(0)开始的46项,当前代码完全正确:初始设置F₀、F₁,循环44次得到F₂到F₄₅,刚好46项,输出的最后一项16258, 17317对应F₄₅的32位值(17317×65536 + 16258 = 1134903170),与标准斐波那契值一致。
    • 如果你要计算的是从F₁(1)开始的46项(到F₄₆),需要调整初始值和循环次数:
      ; 初始化F₁=1、F₂=1
      mov word ptr FibArray[0], 1
      mov word ptr FibArray[2], 0
      mov word ptr FibArray[4], 1
      mov word ptr FibArray[6], 0
      ; 循环44次,得到F₃到F₄₆,共46项
      mov cx, 44
      
  2. 输出顺序解读:
    你的输出将每个32位数拆为「低16位、高16位」依次输出,这和代码中存储逻辑一致(低16位存在数组前半段,高16位在后半段)。如果误以为是高16位在前,会导致数值解读错误,比如F₂₅的正确值是75025,对应输出9489, 1(1×65536 + 9489 = 75025),而非1, 9489。

修复后完整代码(F₀到F₄₅共46项)

.model small
.stack 100h
.data
; 46项斐波那契数,每项占2个16位寄存器,共92个dw
FibArray dw 92 dup(0)

.code
main proc
mov ax, @data
mov ds, ax

; 初始化F₀ = 0(低16位0,高16位0)
mov word ptr FibArray[0], 0
mov word ptr FibArray[2], 0
; 初始化F₁ = 1(低16位1,高16位0)
mov word ptr FibArray[4], 1
mov word ptr FibArray[6], 0

; 循环44次,计算F₂到F₄₅
mov cx, 44
mov si, 0       ; si指向Fₙ₋₂的低16位
mov di, 4       ; di指向Fₙ₋₁的低16位
lea bx, FibArray + 8  ; bx指向当前Fₙ的低16位存储位置

fib_loop:
; 加载Fₙ₋₂的32位值
mov ax, word ptr FibArray[si]
mov dx, word ptr FibArray[si+2]

; 32位无符号加法:Fₙ = Fₙ₋₂ + Fₙ₋₁
add ax, word ptr FibArray[di]
adc dx, word ptr FibArray[di+2]

; 存储计算结果
mov word ptr [bx], ax
mov word ptr [bx+2], dx

; 指针移动到下一组
add si, 4
add di, 4
add bx, 4

loop fib_loop

; 程序退出
mov ax, 4C00h
int 21h
main endp
end main

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:39:55