需要将以下C代码转换为ARM汇编子例程:

 int power(int x, unsigned int n)
 {
   int y;
   if (n == 0)
     return 1;
   if (n & 1)
     return x * power(x, n - 1);
   else
   { y = power(x, n >> 1);
     return y * y;
   }
 }


这是我到目前为止的内容,但无法弄清楚如何使链接寄存器在每次返回后递增(基普循环回到同一点)

pow             CMP             r0, #0
                MOVEQ           r0, #1
                BXEQ            lr
                TST             r0, #1
                BEQ             skip
                SUB             r0, r0, #1
                BL              pow
                MUL             r0, r1, r0
                BX              lr
skip            LSR             r0, #1
                BL              pow
                MUL             r3, r0, r3
                BX              lr

最佳答案

BL指令不会自动从堆栈中压入或弹出任何内容。这样可以节省内存访问。这是它与RISC处理器一起工作的方式(部分原因是它们提供30个通用寄存器)。

STR   lr, [sp, #-4]!   ; "PUSH lr"
BL    pow
LDR   lr, [sp], #4     ; "POP lr"


如果重复BL调用,那么您想在循环外部的堆栈上STR / LDR

关于c - ARM汇编递归功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49635351/

10-11 21:54