Solved

# Assembly programming Fibonacci Number

Posted on 2006-11-30
3,297 Views
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
Question by:HasanChowdhury
• 2
• 2
• 2
• +1

LVL 84

Expert Comment

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

LVL 8

Expert Comment

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

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

Author Comment

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

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

ID: 18079949
I reversed, but no output

Please review my full code
0

LVL 8

Assisted Solution

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

Question has a verified solution.

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

This is about my first experience with programming Arduino.
This article will inform Clients about common and important expectations from the freelancers (Experts) who are looking at your Gig.
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
Simple Linear Regression

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

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