简体   繁体   中英

ARM assembly recursive power function

Need to convert the following C code into ARM assembly subroutine:

 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; 
   } 
 }     

Here's what I have so far but cant figure out how to get the link register to increment after each return (keeps looping back to the same point)

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

The BL instruction does not automatically push or pop anything from the stack. This saves a memory access. It's the way it works with RISC processors (in part because they offer 30 general purpose registers.)

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

If you repeat a BL call, then you want to STR / LDR on the stack outside of the loop.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM