Solved

Assembly programming Fibonacci Number

Posted on 2006-11-30
9
3,302 Views
Last Modified: 2016-02-10
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
0
Comment
Question by:HasanChowdhury
  • 2
  • 2
  • 2
  • +1
9 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 18051744
                 DEC Edx          ; N-2
shouldn't this be EBX?
0
 
LVL 8

Expert Comment

by:doraiswamy
ID: 18052089
              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
 
LVL 4

Expert Comment

by:hclgroup
ID: 18054122
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
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.

 

Author Comment

by:HasanChowdhury
ID: 18078666
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
 
LVL 84

Accepted Solution

by:
ozo earned 63 total points
ID: 18079642
                       PUSH EDX     ; save edx
                        POP EBX
Shouldn't this be done in the opposite order?
0
 

Author Comment

by:HasanChowdhury
ID: 18079949
I reversed, but no output

Please review my full code
0
 
LVL 8

Assisted Solution

by:doraiswamy
doraiswamy earned 62 total points
ID: 18087142
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

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

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.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
Entering a date in Microsoft Access can be tricky. A typo can cause month and day to be shuffled, entering the day only causes an error, as does entering, say, day 31 in June. This article shows how an inputmask supported by code can help the user a…

831 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question