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