ARM汇编使用递归和堆栈计算出x^n



我有一个作业,要求我使用递归计算出x^n。提供了函数电源的 C 源代码,我必须将其转换为汇编语言,但是我是汇编新手并且有点卡住了,所以不知道该怎么办。

这是我到目前为止的代码:

        AREA powerXn, CODE, READONLY
        ENTRY
        MOV r0, #2                      ;Value of x.
        MOV r1, #3                      ;Value of n.
        ADR sp, stack                   ;Points sp to start of stack.
        BL main
loop    B loop
main    STMFD sp!, {r0, r1, r2, r3, lr} ;Pushes registers on to stack.
        BL power
        LDMFD sp!, {r0, r1, r2, r3, pc} ;Pops values from stack.
power   STMFD sp!, {r0, r1, lr}         ;Pushes registers on to stack.
        CMP r1, #0                      ;Checks the base case
        MOVEQ r2, #1                    ;Sets r2 to be 1 if base case is reached
        BNE test                        ;If base case not reached, jump to test.
        MUL r3, r0, r2              
        LDMFD sp!, {r0, r1, pc}
test    TST r1, #1                      ;Checks if r1 (n) is odd
        BNE odd                         ;If it is odd, jump to odd
        BEQ even                        ;Otherwise jump to even
odd     SUB r1, r1, #1                  ;Subtract 1 from r1 (n).
        BL power                        ;Recurse back to power.
        MUL r3, r0, r2              
        LDMFD sp!, {r0, r1, pc}
even    ;Not sure what to do here and not sure if what i have done so far is right.

        AREA powerXn, DATA, READWRITE
        ALIGN
        space 0x200
stack   DCD 0x00
        END

我需要翻译的这个 C 源代码是:

int power(int x, unsigned int n){
 int y;
 if (n == 0)
      return 1;
 if (n & 1) // if n is odd
      return x * power(x, n - 1);
 else { // if n is even  
      y = power(x, n >> 1); // n >> 1 means n/2
      return y * y;
 }
}

你似乎更熟悉 C,所以我建议去 https://godbolt.org/并尝试他们的 C 到汇编器功能。您所要做的就是选择一个正确的编译器(有 ARM GCC 的选项(并查看汇编程序代码。当然,我强烈反对简单地复制代码而不先尝试理解它,但该网站至少应该给你一个关于该怎么做的线索。我目前正在学习 FASM 的 x86 汇编程序,这个网站是我在研究期间的首选。

最新更新