Я хочу создать простой цикл 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
Это решит мою проблему, но мне интересно, есть ли способ исправить это безиспользуя третий регистр.
Заранее спасибо!