Как правильно создать массив в сборке ARM?
в настоящее время я изучаю сборку ARM для класса и столкнулся с проблемой, когда мне нужно было бы использовать "массив"."Я знаю, что в ARM нет такой вещи, как массив, поэтому я должен выделить пространство и рассматривать его как массив. У меня два вопроса.
- правильно ли я добавляю новые значения в массив или просто перезаписываю Предыдущее значение? Если я перезаписываю значения, как мне добавить новые значения?
- как мне пройти через цикл различные значения массива? Я знаю, что должен использовать
loop:
но не знаю как использовать его для доступа к различным "индексов."
до сих пор это то, что я получил от чтения документации ARM, как я собрал из ресурсов в интернете.
.equ SWI_Exit, 0x11
.text
.global _start
_start: .global _start
.global main
b main
main:
ldr R0, =MyArray
mov R1, #42
str R1, [R0], #4
mov R1, #43
str R1, [R0], #4
swi SWI_Exit
MyArray: .skip 20 * 4
.end
в качестве примечания я использую ARMSim# как требует мой профессор, поэтому некоторые команды, распознанные инструментами GNU, не будут распознаны ARMSim#, или, по крайней мере, я считаю, что это так. Пожалуйста, поправьте меня, если Я ошибаюсь.
1 ответов
- вы просто перезаписываете элементы. На этом уровне есть" такие вещи, как массивы", но только фиксированного размера, предварительно распределенные массивы. The
.skip
выделяет массив фиксированного размера.* Переменный размер, растущий массив, как правило, будет реализован с более сложным кодом выделения памяти dyanamic с использованием стека или кучи. - если бы у вас был ярлык, как
loop:
(фактическое имя произвольно) вы можете ветвиться (назад) к нему, используяb loop
. (Вероятно, вы бы хотите сделать ветку условно, чтобы программа не петляла вечно.) Вы можете получить доступ к различным элементам в цикле, изменивR0
, что вы уже делаете
и b main
на самом деле не служит какой-либо цели, так как он разветвляется на следующую инструкцию. Код сделает то же самое, если вы удалите его.
[*] в качестве альтернативы вы можете сказать, что Ваш массив-это просто элементы между MyArray
и R0
(не включая память R0
точки в), в котором, путем изменения R0
вы расширяете массив. Но максимальный размер по-прежнему фиксируется