Есть ли лучший способ написать это в то время как цикл? - PullRequest
1 голос
/ 21 октября 2019

Я хочу создать простой цикл while в ARM Assembly, написанный на raspberry pi с запущенным Raspbian.

Синтаксис C моего цикла while:

while (r0 < r1) {
    r0++;
}
printf(r0);

Достаточно просто, ното, что я пытаюсь вернуть значение, когда r0> = r1. У меня есть решение, но я чувствую, что есть лучший способ сделать это.

То, что у меня сейчас есть:

/* while.s */
/* C syntax: while (r0 < r1) */
/* program will return register 0 at the end of the loop (which should be 10) */
.text
.global main
main:
/* use registers 1 and 2 to hold values, compare both r0 and r1, break to 'end' if r0 is greater than or equal to r1 */
        mov r0, #0
        mov r1, #10
        cmp r0, r1
        bge end
while:
/* compare registers 0 and 1, break to 'end' if r0 is greater than or equal to r1, otherwise increment r0 by 1, break back to start of 'while' */
        cmp r0, r1
        bge end
        add r0, r0, #1
        b while
end:
        bx lr

Это будет хорошо зациклено, но вернет 10 вместо 9.

Решение, которое я придумал, (без обновления комментариев):

/* while.s */
/* C syntax: while (r0 < r1) */
/* program will return register 0 at the end of the loop (which should be 10) */
.text
.global main
main:
/* use registers 1 and 2 to hold values, compare both r0 and r1, break to 'end' if r0 is greater than or equal to r1 */
        mov r0, #0
        mov r1, #10
        sub r2, r1, #1
        cmp r0, r2
        bge end
while:
/* compare registers 0 and 1, break to 'end' if r0 is greater than or equal to r1, otherwise increment r0 by 1, break back to start of 'while' */
        cmp r0, r2
        bge end
        add r0, r0, #1
        b while
end:
        bx lr

Это решит мою проблему, но мне интересно, есть ли способ исправить это безиспользуя третий регистр.

Заранее спасибо!

1 Ответ

0 голосов
/ 21 октября 2019

Я не знаю, насколько большими будут ваши значения, но я не думаю, что это действительно имеет значение, если они не очень велики, и вы получаете тысячи циклов. Так почему бы вам не придерживаться цикла, похожего на ваш пример с ++?

...