【问题标题】:Recursive Fibonacci in ARMARM中的递归斐波那契
【发布时间】:2017-09-10 04:47:41
【问题描述】:

我正在尝试将此递归斐波那契代码转换为 arm 汇编语言。我是新手,不太确定该怎么做。我有一些我在下面玩过的东西的代码 sn-ps。

  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

非常感谢您的帮助

【问题讨论】:

    标签: recursion assembly arm fibonacci


    【解决方案1】:

    为了避免喂汤,我编写了一个 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                           
    

    【讨论】:

    • 非常感谢。当我将它转换为 ARM 时,我会回复你。
    猜你喜欢
    • 2010-12-03
    • 2014-04-02
    • 2017-12-12
    • 2019-04-23
    • 2017-11-18
    • 2014-01-08
    • 2011-12-14
    • 2012-11-29
    相关资源
    最近更新 更多