Recursion ARM中的递归Fibonacci

Recursion ARM中的递归Fibonacci,recursion,assembly,arm,fibonacci,Recursion,Assembly,Arm,Fibonacci,我正在尝试将递归斐波那契代码转换为arm汇编语言。我是新手,不知道该怎么做。我有一些我在下面玩过的东西的代码片段 Fib (n) { if (n == 0 || n == 1) return 1; else return Fib(n-2) + Fib(n-1); } 以下是我迄今为止的尝试: RO = 1 CMP RO #1 BGT P2 MOV R7 #1 B END P2: END LDR LR [SO,#0]

我正在尝试将递归斐波那契代码转换为arm汇编语言。我是新手,不知道该怎么做。我有一些我在下面玩过的东西的代码片段

  Fib (n) {
    if (n == 0 || n == 1) return 1;
    else return Fib(n-2) + Fib(n-1);
    }
以下是我迄今为止的尝试:

    RO = 1
    CMP RO #1
    BGT P2
    MOV R7 #1
    B END
P2:
    END LDR LR [SO,#0]
    ADD SP SP, #8
    MOV PC, LR

非常感谢您的帮助

为了避免填鸭式进食,我编写了一个使用递归查找斐波那契序列的LEGv8程序。LEGv8与ARMv8稍有不同,但算法仍保持不变

请检查代码,并将命令/寄存器更改为ARMv8中相应的值

我假设n(斐波那契序列的范围)存储在寄存器X19中

我还假设我们应该将斐波那契序列存储在一个数组中,该数组的基址存储在X20中

    MOV X17, XZR // keep (previous) 0 in X17 for further use
    ADDI X18, XZR, #1  // keep (Current) 1 in X18 for further use
    ADDI X9, XZR, #0  // Assuming i = 0 is in register X9
fibo: 
    SUBI SP, SP, #24 // Adjust stack pointer for 3 items
    STUR LR, [SP, #16] // save the return address
    STUR X17, [SP, #8] //save content of X17 on the stack
    STUR X18, [SP, #0] //save content of X18 on the stack
    SUBS   X10, X9, X19 // test for i==n
    CBNZ X10, L1 // If i not equal to n, go to L1
    MOV X6, XZR // keep 0 on X6    
    ADDI X5, XZR, #1 // keep 1 on X5 
    ADDI X2, X9, #1 //X9 increased by 1 for further use
    STUR X6, [X20,#0] //store 0 in the array
    STUR X5, [X20, #8] //store 1 in the array  
    ADDI SP, SP, #24 // pop 3 items from the stack
    BR LR // return to the caller 
L1: 
    ADD X16, X17, X18 // Next_Num = previous + Current
    MOV X17, X18 // Previous = Current
    MOV X18, X16 // Current= Next_Num
    ADDI X9, X9, #1 // i++
    BL fibo // call fibo
    LDUR X18, [SP, #0] // return from BL; restore previous
    LDUR X17, [SP, #8] // restore current
    LDUR LR, [SP, #16] // restore the return address
    ADDI SP, SP, #24 // adjust stack pointer to pop 3 items
    ADD X7, X18, X17 // keep (previous + current) value on register X7 
    LSL X2, X2, #3 // Multiplying by 8 for offset    
    ADD X12, X20, X2 // address of the array increase by 8
    STUR X7, [X12, #0] // store (previous + current) value on the array
    SUBI X2, X2, #1 // X9 decreased by 1 
    BR LR // return                           

多谢各位。我把它换成手臂后再给你打电话。