Как правильно создать массив в сборке ARM?

в настоящее время я изучаю сборку ARM для класса и столкнулся с проблемой, когда мне нужно было бы использовать "массив"."Я знаю, что в ARM нет такой вещи, как массив, поэтому я должен выделить пространство и рассматривать его как массив. У меня два вопроса.

  1. правильно ли я добавляю новые значения в массив или просто перезаписываю Предыдущее значение? Если я перезаписываю значения, как мне добавить новые значения?
  2. как мне пройти через цикл различные значения массива? Я знаю, что должен использовать 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 ответов


  1. вы просто перезаписываете элементы. На этом уровне есть" такие вещи, как массивы", но только фиксированного размера, предварительно распределенные массивы. The .skip выделяет массив фиксированного размера.* Переменный размер, растущий массив, как правило, будет реализован с более сложным кодом выделения памяти dyanamic с использованием стека или кучи.
  2. если бы у вас был ярлык, как loop: (фактическое имя произвольно) вы можете ветвиться (назад) к нему, используя b loop. (Вероятно, вы бы хотите сделать ветку условно, чтобы программа не петляла вечно.) Вы можете получить доступ к различным элементам в цикле, изменив R0, что вы уже делаете

и b main на самом деле не служит какой-либо цели, так как он разветвляется на следующую инструкцию. Код сделает то же самое, если вы удалите его.

[*] в качестве альтернативы вы можете сказать, что Ваш массив-это просто элементы между MyArray и R0 (не включая память R0 точки в), в котором, путем изменения R0 вы расширяете массив. Но максимальный размер по-прежнему фиксируется