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

MASM x86程序问题:求0到1000000间奇数斐波那契数之和

问题排查与修复方案

你的代码核心问题在于斐波那契序列生成逻辑错误,同时循环判断时机也存在问题,导致求和完全偏离预期。以下是具体分析和修复后的代码:

核心错误分析

  1. 斐波那契序列生成逻辑错误:循环中仅执行add eax, ebx生成新数,但从未更新ebx的值,导致ebx始终为1,eax最终变成0+1=1、1+1=2、2+1=3...这是自然数序列,而非斐波那契序列,直接导致求和结果异常。
  2. 循环条件判断时机错误:当前代码先计算新数、判断奇偶并累加,再判断是否小于1000000,这会导致当生成的数超过1000000时,若它是奇数,仍会被错误累加到总和中。

修复后的代码

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
INCLUDE irvine32.inc
.data
    odd_sum DWORD 0     

.code
main PROC
    mov eax, 0          ; 斐波那契数列的前前项 F(n-2),初始为0
    mov ebx, 1          ; 斐波那契数列的前项 F(n-1),初始为1
    mov ecx, 0          ; 存储奇数斐波那契数的和,初始为0

    ; 先计入第一个奇数斐波那契数1
    add ecx, ebx

fibonacci_loop:
    ; 生成下一个斐波那契数:F(n) = F(n-2) + F(n-1)
    mov edx, eax        ; 临时保存前前项F(n-2)
    add eax, ebx        ; 计算新的斐波那契数F(n)
    mov ebx, edx        ; 更新前前项为原来的前项F(n-1)
    
    ; 判断新数是否超出范围,超出则退出循环
    cmp eax, 1000000
    jg exit_loop

    ; 判断是否为奇数,是则累加到总和
    test eax, 1
    jz skip_add
    add ecx, eax
skip_add:
    jmp fibonacci_loop

exit_loop:
    mov odd_sum, ecx
    call WriteInt       ; 输出预期结果:+1089154

    INVOKE ExitProcess, 0
main ENDP
END main

修复说明

  • 修正斐波那契生成逻辑:通过临时寄存器edx保存前前项,更新eax为新生成的斐波那契数,ebx更新为之前的前项,确保生成的是正确的斐波那契序列(0,1,1,2,3,5,8,...)。
  • 调整循环判断时机:生成新数后先判断是否超过1000000,避免将超出范围的数错误累加。
  • 初始值正确处理:提前将第一个奇数斐波那契数1计入总和,确保序列起始的奇数被正确统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:43:21