Fibonacci Series in Assembly x86

Finally after a long session of countless errors , hope this is the final one.

No Compile or runtime errors, Just a logical error.

EDIT: (Fixed Pseudocode)

My Pseudocode:

first  = 1;
second = 1;
third  = 0;

 for i from 1 to n{

    third=first+second
    first=second
    second=third

}
return third

This would print the final result of the series.

My Assembly Code:

I have 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 i.e 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 runs well but the output doesn't satisfies me:

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

First of all i am not really sure that Final number is in decimal or hex form.

  • Assuming it as decimal : Fibonacci Series doesn't have 11
  • Assuming it as hex : Fibonacci Series doesn't have 17 (11 hex = 17 dec)
  • What am i doing wrong?


    The problem was that my Actual code was not matching with my Pseudocode which resulted in the Logical error.

    This Part

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

    This gives first value of second , but my PseudoCode says "first=second", which means give value of second to first .

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

    Final Working Code for x86 Intel Processor:

    For any further referrers , i am posting a 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 i.e 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
    
    链接地址: http://www.djcxy.com/p/90484.html

    上一篇: 克隆GitHub仓库的内容(不包含文件夹本身)

    下一篇: 装配x86中的斐波纳契系列