X86 Fibonacci Series

Finally, after a long session of countless errors, I hope this is the last.

No compilation or execution errors, just a logical error.

EDIT: (Fixed Pseudocode)

My pseudo code:

first = 1; second = 1; third = 0; for i from 1 to n{ third=first+second first=second second=third } return third 

This will print the final result of the series.

My build code:

I added comments where ever possible

 .386 .model flat,stdcall option casemap:none .data timestell db "Loop Ran : %d Times -----",0 ;format string fmtd db "%d",0 finalprint db "Final Number is : %d ------",0 ;format string times dd 0Ah ;times to loop first dd 1h second dd 1h third dd 0h .data? retvalue1 dd ? ;we will initialize it later .code include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib includelib MSVCRT extrn printf:near extrn exit:near public main main proc mov ecx, times ;loop "times" times mov eax,0 ;just to store number of times loop ran top: ;body of loop cmp ecx, 0 ;test at top of loop je bottom ;loop exit when while condition false add eax,1 ;Just to test number of times loop ran mov ebx,first ;move first into ebx add ebx,second ;add ebx, [ first+second ] mov third,ebx ;Copy result ie ebx [first+second] to third xor ebx,ebx ;clear for further use mov ebx,first ;move first into ebx mov second,ebx ;copy ebx to second [NOW second=first] xor ebx,ebx ;clear for later use mov ebx,third ;move thirs into ebx mov second,ebx ;copy ebx to third [NOW second=third] xor ebx,ebx ;clear it dec ecx ;decrement loop jmp top ;Loop again bottom: mov retvalue1,eax ;store eax into a variable push retvalue1 ;pass this variable to printf push offset timestell ;pass Format string to printf call printf ;Print no. of times loop ran push third ;push value of third to printf push offset finalprint ;push the format string call printf ;Print the final number push 0 ;exit gracefully call exit ;exit system main endp end main 

The code works well, but the result does not satisfy me:

Output: Loop Ran : 10 Times -----Final Number is : 11 ------

First of all, I'm not sure if the final number is in decimal or hexadecimal.

  • Assuming this as a decimal: the Fibonacci series doesn't have 11
  • Assuming this as hex: the Fibonacci series does not have 17 (11 hex = 17 dec)

What am I doing wrong?

+7
assembly x86 fibonacci
source share
1 answer

The problem was that my Actual code did not match my pseudo code, which led to a Logical error.

This part

  mov ebx,first ;move first into ebx mov second,ebx ;copy ebx to second [NOW second=first] 

This gives the value of first second , but my PseudoCode says "first = second", which means that the value of second is first .

  mov ebx,second ;move second into ebx mov first,ebx ;copy ebx to second [NOW first=second] 

Final working code for Intel x86 processor:

For any other sources, I am posting working code for x86 intel

 .386 .model flat,stdcall option casemap:none .data timestell db "Loop Ran : %d Times -----",0 ;format string finalprint db "%d th Fibonacci number is %d",0 ;format string times dd 14h ;times to loop first dd 1h second dd 1h third dd 0h .code include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib includelib MSVCRT extrn printf:near extrn exit:near public main main proc mov ecx, times ;set loop counter to "times" time sub ecx,2 ;loop times-2 times top: cmp ecx, 0 ; test at top of loop je bottom ; loop exit when while condition false xor ebx,ebx ;Clear ebx mov ebx,first ;move first into ebx add ebx,second ;add ebx, [ first+second ] mov third,ebx ;Copy result ie ebx [first+second] to third xor ebx,ebx ;clear for further use mov ebx,second ;move second into ebx mov first,ebx ;copy ebx to second [NOW first=second] xor ebx,ebx ;clear for later use mov ebx,third ;move thirs into ebx mov second,ebx ;copy ebx to third [NOW second=third] xor ebx,ebx ;clear it dec ecx ;decrement loop jmp top ;Loop again bottom: push third push times ;push value of third to printf push offset finalprint ;push the format string call printf ;Print the final number push 0 ;exit gracefully call exit ;exit system main endp end main 
+4
source share

All Articles