MASM x86程序问题:求0到1000000间奇数斐波那契数之和
问题排查与修复方案
你的代码核心问题在于斐波那契序列生成逻辑错误,同时循环判断时机也存在问题,导致求和完全偏离预期。以下是具体分析和修复后的代码:
核心错误分析
- 斐波那契序列生成逻辑错误:循环中仅执行
add eax, ebx生成新数,但从未更新ebx的值,导致ebx始终为1,eax最终变成0+1=1、1+1=2、2+1=3...这是自然数序列,而非斐波那契序列,直接导致求和结果异常。 - 循环条件判断时机错误:当前代码先计算新数、判断奇偶并累加,再判断是否小于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
相关产品推荐
相关产品推荐

