Как я могу сделать этот раздел кода, но с помощью автоматической индексации с ARM Assembly - PullRequest
0 голосов
/ 25 января 2019

это работает, но я должен сделать это с помощью автоматической индексации, и я не могу понять эту часть.

writeloop:
  cmp r0, #10
  beq writedone
  ldr r1, =array1
  lsl r2, r0, #2
  add r2, r1, r2
  str r2, [r2]
  add r0, r0, #1
  b writeloop

и для данных у меня есть

.balign 4
array1: skip 40

Я пытался это сделать, и да, я знаю, что это, вероятно, неудачная попытка, но я новичок в этом и не понимаю

ldr r1, =array1

writeloop:
  cmp r0, #10
  beq writedone
  ldr r2, [r1], #4
  str r2, [r2]
  add r0, r0, #1
  b writeloop

Когда я пытаюсь это сделать, там написано "ошибка сегментации". Что случилось? То, что я думаю, должно произойти, каждый раз, когда он проходит через цикл, он устанавливает элемент r2 it в = по адресу самого себя, а затем увеличивает его до следующего элемента и делает то же самое

1 Ответ

0 голосов
/ 25 января 2019

Архитектура 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:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...