Вы можете использовать макросы:
.macro multiply A B C
{body}
.endm
Значения параметров в теле доступны по \A, \B, \C
есть небольшая ошибка в вашем коде:
Multiply:
stmfd sp!,{r0-r2, lr}
mov R2, #1
mov R3, #0
repeat:
add R3, R1, R3
add R2, R2, #1
cmp R2, R0
ble repeat
mov R2, R3
LDMFD sp!,{r0-r1, pc}
Когда R0 равно 0, результатом будет R1 вместо 0. Поэтому вы должны проверить его, прежде чем он войдет в цикл. Правильный код будет:
stmfd sp!,{r0-r2, lr}
mov R2, #0
mov R3, #0
repeat:
cmp R2, R0
be exit_loop
add R3, R1, R3
add R2, R2, #1
b repeat
exit_loop:
mov R2, R3
LDMFD sp!,{r0-r1, pc}
Но это не самый оптимальный метод, потому что в теле цикла есть 5 инструкций вместо 4 и 2 ветви вместо 1, поэтому будет трудно предсказать их обе. Вот почему мы собираемся сделать следующее:
stmfd sp!,{r0-r2, lr}
mov R2, #-1
rsb R3, R1, #0
repeat:
add R3, R1, R3
add R2, R2, #1
cmp R2, R0
bne repeat
mov R2, R3
LDMFD sp!,{r0-r1, pc}
И, наконец, с макросами это будет выглядеть так:
.macro multiply C B A
stmfd sp!,{\A, \B, \C, r2, lr}
mov R2, #-1
rsb \C, \B, #0
repeat:
add \C, \B, \C
add R2, R2, #1
cmp R2, \A
bne repeat
LDMFD sp!,{\A, \B, \C, r2, pc}
.endm
multiply R3 R2 R1 will save the result into R3
Но я не знаю, почему вы хотите написать свой собственный макрос умножения, надеюсь, вы знаете, что есть набор команд умножения ...