Архитектура ARM предоставляет несколько различных режимов адреса .
Из обзора продукции ARM946E-S и многих других источников :
Загрузка и сохранение инструкций имеют три основных режима адресации
- смещение
- предварительно проиндексирован
- после индексации.
Они формируются путем сложения или вычитания немедленного или основанного на регистре смещения в или из базового регистра. Смещения на основе регистров также можно масштабировать с помощью операций сдвига. Предварительно проиндексированные и постиндексированные режимы адресации обновляют базовый регистр с вычислением базы плюс смещение. Поскольку ПК является регистром общего назначения, 32-разрядное значение может быть загружено непосредственно в ПК для перехода к любому адресу в области памяти объемом 4 ГБ.
Кроме того, они поддерживают обратную запись или обновление регистра, поэтому причина предварительно проиндексирована и постиндексирована . Постиндекс не имеет смысла без обратной записи.
Теперь к вашей проблеме, я считаю, что вы хотите записать значения 0-9 в массив из десяти слов (длиной четыре байта). Предполагая это, вы можете использовать индексирование и обновить значение с помощью add
. Это приводит к,
mov r0, #0 ; start value
ldr r1, =array1 ; array pointer
writeloop:
cmp r0, #10
beq writedone
str r0, [r1, r0, lsl #2] ; index with r1 base by r0 scaled by *4
add r0, r0, #1
b writeloop
writedone:
; code to jump somewhere else and not execute data.
.balign 4
array1: skip 40
Для интереса можно сделать более эффективный цикл, считая и записывая,
mov r0, #9 ; start value
ldr r1, =array1 ; array pointer
writeloop:
str r0, [r1, r0, lsl #2] ; index with r1 base by r0 scaled by *4
subs r0, r0, #1
bne writeloop
Ваш оригинальный пример писал указатель на массив; часто упоминается как «значение равно адресу». Если это то, что вы хотите,
ldr r0, =array_end ; finished?
ldr r1, =array1 ; array pointer
write_loop:
str r1, [r1], #4 ; add four and update after storing
cmp r0, r1
bne write_loop
; code to jump somewhere else and not execute data.
.balign 4
array1: skip 40
array_end: