45 lines
920 B
NASM
45 lines
920 B
NASM
.cpu cortex-m4
|
|
.thumb
|
|
.syntax unified
|
|
.globl power
|
|
.text
|
|
.thumb_func
|
|
// R5 = n, R6 = m, R4 = result (p)
|
|
power:
|
|
PUSH.N {R4, R5, R6}
|
|
SUB.N SP, SP, #4
|
|
STR LR, [SP, #0] // push LR to the stack
|
|
MOVS.N R4, #1 // set result to 1
|
|
CMP.N R1, #0
|
|
BEQ.N exit // goto exit if m == 0
|
|
MOVS.N R5, R0 // move n to R5
|
|
MOVS.N R6, R1 // move m to R6
|
|
loop:
|
|
CMP.N R6, #1
|
|
BEQ.N exit // goto exit if m == 1
|
|
MOVS.N R3, #1
|
|
ANDS.N R3, R6 // R3 = m & 0x1
|
|
BEQ.N even
|
|
MOVS.N R0, R4
|
|
MOVS.N R1, R5
|
|
LDR.N R3, =multiply
|
|
BLX.N R3 // p * n
|
|
MOVS.N R4, R0 // move multiply result to p
|
|
even:
|
|
MOVS.N R0, R5
|
|
MOVS.N R1, R5
|
|
LDR.N R3, =multiply
|
|
BLX.N R3 // p * n
|
|
MOVS.N R5, R0 // move multiply result to n
|
|
LSRS.N R6, R6, #1 // m = m >> 1
|
|
B.N loop
|
|
exit:
|
|
MOVS.N R0, R4
|
|
MOVS.N R1, R5
|
|
LDR.N R3, =multiply
|
|
BLX.N R3 // p * n
|
|
LDR LR, [SP, #0] // pop LR from the stack
|
|
ADD.N SP, SP, #4
|
|
POP.N {R4, R5, R6}
|
|
BX.N LR
|