如何编写x64 MASM程序计算0到1e6间奇数斐波那契数之和
x64 MASM计算0~1×10^6之间奇数斐波那契数的和出错排查
我需要编写x64 MASM程序,计算0到1×10^6之间所有奇数斐波那契数的和,预期结果应存在RAX寄存器中,值为109E82h(十进制1089154)。但当前代码运行后RAX中的结果不正确,无法定位问题。
附上我的代码:
extrn ExitProcess: proc .data fib1 QWORD 0 fib2 QWORD 1 sum QWORD 0 .code _main PROC ; calculate the Fibonacci sequence up to 10^7 mov rax, 10000000 mov rcx, fib1 mov rdx, fib2 FIB_LOOP: add rcx, rdx mov fib1, rdx mov fib2, rcx cmp rcx, rax jle FIB_LOOP ; add odd numbers to the sum mov rcx, fib1 add rcx, rdx ; rdx contains the last even Fibonacci number SUM_LOOP: test cl, 1 ; check if the current number is odd jz SKIP_ADD add sum, rcx SKIP_ADD: add rcx, rdx mov rdx, rcx cmp rcx, rax jle SUM_LOOP ; exit the program mov rax, sum call ExitProcess _main ENDP END
代码中的核心问题
- 上限数值错误:需求是计算到1×106,但代码中设置的上限是`10000000`(1×107),超出了目标范围。
- 逻辑拆分错误:先单独生成所有斐波那契数再回头求和的逻辑完全错误,SUM_LOOP中的递推方式根本不符合斐波那契序列的生成规则,导致遍历的数值完全不对。
- 初始值遗漏:初始的斐波那契数
1是奇数,但没有被加入sum中。 - 寄存器操作逻辑混乱:FIB_LOOP结束后,寄存器中的值已经是超出上限的斐波那契数,此时再初始化SUM_LOOP的起始值完全错误。
修正后的代码
正确的做法是在生成斐波那契数的同时,直接判断奇偶并累加,避免逻辑拆分带来的错误:
extrn ExitProcess: proc .data sum QWORD 0 .code _main PROC ; 初始化斐波那契前两项:fib_prev = 0,fib_curr = 1 mov rbx, 0 ; fib_prev mov rcx, 1 ; fib_curr mov rdx, 1000000 ; 上限:1×10^6 ; 初始的1是奇数,先加入sum add sum, rcx FIB_LOOP: ; 计算下一个斐波那契数:fib_next = fib_prev + fib_curr mov rax, rbx add rax, rcx ; 判断是否超过上限 cmp rax, rdx jg EXIT_LOOP ; 判断当前fib_next是否为奇数 test al, 1 jz SKIP_ADD add sum, rax SKIP_ADD: ; 更新前两项的值,准备下一次循环 mov rbx, rcx mov rcx, rax jmp FIB_LOOP EXIT_LOOP: ; 将结果存入RAX并退出 mov rax, sum call ExitProcess _main ENDP END
修正逻辑说明
- 直接在生成斐波那契数的循环内完成奇偶判断和累加,避免二次遍历的逻辑错误。
- 修正了上限值为
1000000,符合需求。 - 初始的奇数
1被正确加入sum。 - 使用寄存器
rbx(fib_prev)和rcx(fib_curr)保存前两项,递推逻辑清晰,减少不必要的全局变量操作。
内容的提问来源于stack exchange,提问作者denisse galvan
相关产品推荐
相关产品推荐

