У меня есть задание, которое просит меня решить 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;
}
}