简体   繁体   中英

A variation of fibonacci assembly x86, have to call it from a c++ main method, kind of lost at few parts

This is the fibonacci code,

unsigned int fib(unsigned int n)
{
if (n==1 || n ==2)
return 1;
else
return fib(n-2) + fib(n-1);
} 

but instead for my code, I have to change formula to a new one, f(n-2)/2 + f(n-1) * 2, so the sequence is 1, 2, 4, 9, 20, 44, 98, 218

I need to write a recursive function called Mobonacci in assembly to calculate the nth number in sequence, and also a main function in c++ that reads a positive number n, then cals mobonacci assembly function with parameter n, then print our result

So I'm kind of confused, do I write the function in assembly like I did below, then write a c++ function to call it? and how would guys change my code from fibonacci to the new formula? Here is my code, what do I need to change and did I need create new part that let the code read input? Also is my code too short? do I need add anything else?

.code
    main PROC
        mov ecx,0
        push 4          ; calculate the nth fib
        call Fib            ; calculate fib (eax)
        call WriteDec
        call Crlf
        exit
    main ENDP

    Fib PROC
        add ecx,1
        push ebp
        mov  ebp,esp
        mov  eax,[ebp+8]    ; get n
        cmp  eax,2      ; n == 2?
        je   exception2     
        cmp  eax,1      ; n == 1?
        je   exception2         
        dec eax
        push eax            ; Fib(n-1)
        call fib

        add eax,
        jmp Quit


    Exception2:
        dec eax
    Quit:
        pop  ebp            ; return EAX
        ret  4          ; clean up stack
    Fib ENDP

    END main

Depends on where you are trying to insert asm code into your c++ code... For gcc/linux you can do something like :

    //Simple example:
    void *frame; /* Frame pointer */
    __asm__ ("mov %%ebp,%0":"=r"(frame));

   //Complicated example:
   int foo(void) {
     int joe=1234, fred;
     __asm__( 
        "  mov %1,%%eax\n"
        "  add $2,%%eax\n"
        "  mov %%eax,%0\n"
        :"=r" (fred) /* %0: Out */
        :"r" (joe) /* %1: In */
        :"%eax" /* Overwrite */
     );
     return fred;
  }

The important thing is to understand how to use your asm function in cpp. You can find some useful things about this subject here : https://www.cs.uaf.edu/2011/fall/cs301/lecture/10_12_asm_c.html

About the second part of your question. To multiple, you can use the command " mul " and to make a division " div ". So if you want to do f(n-1) * 2 You have to get you register %eax after the " call fib " and use mul.

Just have a look here: http://www.tutorialspoint.com/assembly_programming/assembly_arithmetic_instructions.htm

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM