大家好,我一直在做这项任务并且在苦苦挣扎。它是fib序列的重制,它的变化是f(n-2)/ 2 + f(n-1)* 2,起始的两个数是1和2所以一些序列如下。 1,2,4,9,20,44,98。我们要使用左移和右移(shl和shr)完成乘法和除法我觉得我非常接近,但由于某种原因,我的代码不能读取超过2或至少为#的数字# 39;我是如何看待它的。如果你可以看一下并告诉我一些可能导致这个问题的方向,无论是我的实际配方部分还是前后谢谢。第一个主要是我只是喷出结果的简单方法。
include Irvine32.inc
.code
main PROC
push 1
call fib
call WriteDec
call Crlf
push 2
call fib
call WriteDec
call Crlf
push 3
call fib
call WriteDec
call Crlf
push 4
call fib
call WriteDec
call Crlf
push 5
call fib
call WriteDec
call Crlf
push 7
call fib
call WriteDec
call Crlf
exit
main ENDP
fib PROC
push ebp
mov ebp, esp
mov ebx, [ebp+8] ;get number to calc that was pushed before
; if ((n == 1) || (n == 0)) return 1;
mov eax,1
cmp ebx,1
jle Quit
;else return fib(n-2)/2 + fib(n-1)*2;
valid:
;(n-2)/2
dec ebx ;n-1
dec ebx ; n-1 again so n-2
push ebx ; store the number
call fib ; calculate n-2
shr ebx,1 ;(n-2)/2
push eax ;store it away
mov ebx, [ebp+8] ;get number to calc
;(n-1)*2
dec ebx ;(n-1)
push ebx ;store the numebr
call fib ;calculate n-1
shl ebx,1 ;(n-1)*2
pop edx ;bring back the (n-2)*2 saved value
add eax,edx ;adds the n-2 and n-1 together
jmp Quit
Quit:
pop ebp ;return base pointer
ret 4 ;clean stack
fib ENDP
END main
答案 0 :(得分:2)
要计算f(n-2)/ 2,您需要使用SHR而不是SHL。
;(n-2)/2
sub ebx,2
shr ebx,1
要计算f(n-1)* 2,您需要使用SHL代替SHR。
;(n-1)*2
dec ebx
shl ebx,1
为什么不简化代码? (您不需要 ReturnFib 的代码。)
; if ((n == 1) || (n == 2)) return 1;
mov eax, 1 ;less than 3 so result is 1, no need to calculate Fibonacci
cmp ebx, 2
jle Quit
valid:
修改
以下是第一个学期的查找方式。
;f(n-2)/2
sub ebx,2
push ebx ; store the number
call fib ; calculate n-2
shr eax,1
push eax ;store it away