Assembly programming Fibonacci Number

I want to write an assembly program to generate Fibonnaci numbers. Following is the code, but it does not work.
Can anybody give me a hand

Masud

.386
.model flat
include cs266.inc
.code
      main:
            PUSH 8
            call fib
            jmp exit1
      exit1:
            putint eax
            ret
            
      fib:
            PUSH EBP
            MOV EBP, ESP
            MOV EBX, [EBP+8]      ; N
            CMP EBX, 0
            JNE notzero
            MOV EAX,1
            JMP exit
            notzero:
                  CMP EBX,1
                  Jne else
                  MOV EAX,1
                  JMP exit
                  else:
                        DEC EBX            ; N-1
                        PUSH EBX
                        CALL fib      ; fib(N-1)
                        MOV EDX, EAX       ; EDX contains fib(N-1)
                        ;PUSH EDX
                        DEC Edx            ; N-2
                        push ebx
                        CALL fib      ; fib(N-2)
                        ;POP EDX
                        ADD EAX, EDX      ; fib(n-1) + fib (n-2)
                  exit:
                        pop ebp
                        ret 4
      ret
end
HasanChowdhuryAsked:
Who is Participating?
 
ozoCommented:
                       PUSH EDX     ; save edx
                        POP EBX
Shouldn't this be done in the opposite order?
0
 
ozoCommented:
                 DEC Edx          ; N-2
shouldn't this be EBX?
0
 
doraiswamyCommented:
              else:                    ; here BX has N
                    DEC EBX          ; N-1
                    PUSH EBX        ; store it
                    CALL fib     ; fib(N-1) is returned in EAX
                    POP EBX
                    DEC EBX     ; n-2
                    PUSH EAX   ; store fib(n-1)
                    CALL fib     ; fib(N-2)
                    POP EDX    ; get back fib(n-1)                    
                    ADD EAX, EDX     ; fib(n-1) + fib (n-2)
               exit:
0
Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
hclgroupCommented:
2 examples I found on the web

http://www.beroset.com/asm/fibo-masm.asm
http://www.beroset.com/asm/fibo.asm

maybe you could get some ideas from there
0
 
HasanChowdhuryAuthor Commented:
Following the update version, but it still does not work


.386
.model flat
include cs266.inc
.code
main:
      PUSH 8
      call fib
      putint eax
      jmp exit1
      exit1:
            putint eax
            ret
      fib proc
            PUSH EBP
            MOV EBP, ESP
            MOV EBX, [EBP+8]      ; N
            CMP EBX, 0
            JNE notzero
            MOV EAX,1
            JMP exit
            notzero:
                  CMP EBX,1
                  Jne else
                  MOV EAX,1
                  JMP exit
                  else:
                        DEC EBX         ; N-1
                            PUSH EBX        ; store it
                            CALL fib        ; fib(N-1) is returned in EAX
                            MOV EDX, EAX      ; store fib(N-1) to edx
                            PUSH EDX      ; save edx
                            POP EBX
                            DEC EBX           ; n-2
                            PUSH EBX           ; store fib(n-1)
                            CALL fib           ; fib(N-2), fib(n-2) in EAX
                            POP EDX            ; get back fib(n-1)                    
                            ADD EAX, EDX    ; fib(n-1) + fib (n-2)
                            putint eax
                        exit:
                              pop ebp
                              ret 4
      endp
end            

0
 
HasanChowdhuryAuthor Commented:
I reversed, but no output

Please review my full code
0
 
doraiswamyCommented:
ozo => Shouldn't this be done in the opposite order? => Correct.

Hasan -> No output => what is the output function?

I found some other errors. Here is the corrected code:

.386
.model flat
include cs266.inc
.code
main:
     PUSH 8
     call fib
     putint eax
     jmp exit1
     exit1:
          putint eax
          ret
     fib proc
          PUSH EBP
          MOV EBP, ESP
          MOV EBX, [EBP+8]     ; N
          CMP EBX, 0
          JNE notzero
          MOV EAX,1
          JMP exit
          notzero:
               CMP EBX,1
               Jne else
               MOV EAX,1
               JMP exit
               else:
                    DEC EBX         ; N-1
                        PUSH EBX        ; store it
                        CALL fib        ; fib(N-1) is returned in EAX
                        MOV EDX, EAX     ; store fib(N-1) to edx
                        POP EBX    ; get (n-1)
                        PUSH EDX     ; save edx => fib(n-1)
                        DEC EBX          ; n-2
                        PUSH EBX          ;
                        CALL fib          ; fib(n-2) in EAX
                        POP EBX        ; balance stack
                        POP EDX           ; get back fib(n-1)                    
                        ADD EAX, EDX    ; fib(n-1) + fib (n-2)
                        putint eax
                    exit:
                         pop ebp
                         ret 4
     endp
end          
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.