Mobonacci - 汇编代码中的斐波那契操纵

时间:2015-03-15 04:11:27

标签: assembly recursion masm fibonacci irvine32

大家好,我一直在做这项任务并且在苦苦挣扎。它是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

1 个答案:

答案 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