Можно ли определить функцию, чтобы она перезаписывала один из аргументов? - PullRequest
0 голосов
/ 06 декабря 2011

Я определил функцию с именем multiply, которая принимает аргументы R0 и R1 и сохраняет результат в R3. Это отстой, потому что всякий раз, когда я вызываю умножение, я должен поместить операнды в R0 и R1 и переместить то, что было в R0, R1 и R3, куда-нибудь еще. Есть ли способ заставить функцию принять форму умножения R4, R5, R6 аналогично тому, как добавить R1, R2, R3

ldr R0, =snakes
ldr R1, [R0], #4
mov R2, #15
mov R3, #6

Если я хочу умножить R2 и R3, это потребует дополнительной работы. Я часто звоню умножить, и мне интересно, есть ли лучший способ?

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}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Вы можете использовать макросы:

.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

Но я не знаю, почему вы хотите написать свой собственный макрос умножения, надеюсь, вы знаете, что есть набор команд умножения ...

0 голосов
/ 06 декабря 2011

Многие ассемблеры поддерживают макросы. Посмотрите, поддерживает ли ваш ассемблер их, они помогут устранить ненужные регистры хранилищ и загрузок. Вы просто указали бы свои r0, r1, r3 или r4, r5, r5 или все, что вы хотите, в качестве параметров макроса, и сборка заменит регистры, заданные в качестве параметров, в тело макроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...