Сборка ARM x ^ n с использованием рекурсии и стеков - PullRequest
1 голос
/ 27 марта 2019

У меня есть задание, которое просит меня решить x ^ n с помощью рекурсии.Исходный код C для функции power предоставлен, и я должен перевести его на язык ассемблера, однако я новичок в сборке и немного застрял, поэтому не уверен, что делать.

Вот мой код такдалеко:

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

1 Ответ

1 голос
/ 27 марта 2019

Вы, кажется, более знакомы с C, поэтому я предлагаю перейти к https://godbolt.org/ и попробовать их функцию C-to-ассемблер. Все, что вам нужно сделать, это выбрать правильный компилятор (есть опции для ARM GCC) и просмотреть код на ассемблере. Конечно, я категорически не согласен с простым копированием кода, не пытаясь сначала понять его, но этот веб-сайт должен дать вам хотя бы представление о том, что делать. В настоящее время я изучаю ассемблер x86 с помощью FASM, и этот веб-сайт мне нужен во время исследований.

...