2015-10-22 41 views
1

我是彙編語言的初學者。我正在使用Windows。我試着用從第二個答案這裏的代碼:Recursive Fibonacci in Assembly 給我的第n個Fibonacci數在nasm中打印斐波納契數字

Fibonacci: ; computes Fib(EAX) --> EAX; do not call with EAX==0 
    CMP EAX, 1  ; N<=1? 
    JBE exit  ; yes, we have the answer 
    DEC EAX   ; = N-1 
    PUSH EAX   ; save N-1 
    CALL Fibonacci ; computing FIB(n-1)to EAX 
    XCHG EAX,0[ESP] ; swap FIB(n-1) for saved N-1 
    DEC EAX   ; = N-2 
    CALL Fibonacci ; computing FIB(N-2) to EAX 
    POP ECX   ; = FIB(N-1) 
    ADD EAX,ECX  ; = FIB(N-1)+FIB(N-2) 
    exit: 
    RET 

那部分工作,但我不能打印序列F(0)到F(10)

mov ecx,10 
    mov ebx,0 
print_fib: 
    mov eax,ebx 
    call fibonacci 
    call print_int 
    inc ebx 
    loop print_fib 
+0

既然你已經在思考斐波那契數,你可能會發現http://stackoverflow.com/問題/ 32659715 /彙編語言-X86-如何創建一個循環到計算 - 斐波那契序列有趣。這是關於循環的非遞歸實現(因爲在O(n))時間內計算Fib(n)是愚蠢的,因爲如果在O(n)時間甚至O(log(n))時間內可以很容易計算它,如果你想變得更復雜)。作爲一個練習來編寫一個工作遞歸函數是有用的,但是我希望人們會選擇一個遞歸實現簡化的例子。 –

回答

4

更仔細地看看Fibonacci例程(或者在調試器中單步執行),並且您會注意到它修改了ECX,您將其作爲循環計數器使用。

這取決於你如何解決這個問題。你可以例如pushpopECX在呼叫Fibonacci之前/之後的循環中;或者你可以改變Fibonacci,以便它使用一個不同的寄存器:

pop edx 
add eax,edx 

甚至:

add eax,[esp] ; add the value at the top of the stack to eax 
add esp,4  ; move the stack pointer the same distance as if we'd done pop r32