[英]ARM assembly recursive power function
需要將以下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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.