需要将以下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
答案 0 :(得分:-1)
BL
指令不会自动从堆栈中推送或弹出任何内容。这样可以节省内存访问。这是它与RISC处理器一起工作的方式(部分原因是它们提供了30个通用寄存器。)
STR lr, [sp, #-4]! ; "PUSH lr"
BL pow
LDR lr, [sp], #4 ; "POP lr"
如果您重复BL
来电,那么您希望在循环外的堆栈上STR
/ LDR
。