ARM程序集递归功率函数

时间:2018-04-03 16:52:12

标签: c recursion assembly arm

需要将以下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

1 个答案:

答案 0 :(得分:-1)

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

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

如果您重复BL来电,那么您希望在循环外的堆栈上STR / LDR