我在创建一个x64 masm程序来计算奇数值之和的结果时遇到了麻烦。答案在RAX中为109E82h(1089154d).我正在努力弄清楚masm是如何工作的,但它是如此令人困惑,这是我到目前为止尝试过的,但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条答案
按热度按时间sulc1iza1#
但我不知道我错在哪里。
好吧,我不明白为什么你的程序的第一部分是计算斐波那契数列直到10^7,当标题提到你需要处理[0,10 ^6]范围内的数字时。这比需要的高10倍!在那之后,求和循环进入更大的数字,幸运的是RAX限制没有改变,所以这部分很快就退出了。
这可能是一个有趣的替代方案(未经测试):