Arrays 如何在ARM部件中正确创建阵列?

Arrays 如何在ARM部件中正确创建阵列?,arrays,assembly,arm,Arrays,Assembly,Arm,我目前正在为一个类学习ARM组装,遇到了一个需要使用“数组”的问题。我知道ARM中没有数组这样的东西,所以我必须分配空间并将其视为数组。我有两个问题 我是否正确地向数组中添加了新值,还是仅仅覆盖了以前的值?如果要覆盖这些值,如何添加新值 如何循环遍历数组的不同值?我知道我必须使用循环:,但不知道如何使用它访问不同的“索引” 到目前为止,这是我从在线资源中收集的ARM文档中得到的 .equ SWI_Exit, 0x11 .text .global

我目前正在为一个类学习ARM组装,遇到了一个需要使用“数组”的问题。我知道ARM中没有数组这样的东西,所以我必须分配空间并将其视为数组。我有两个问题

  • 我是否正确地向数组中添加了新值,还是仅仅覆盖了以前的值?如果要覆盖这些值,如何添加新值
  • 如何循环遍历数组的不同值?我知道我必须使用
    循环:
    ,但不知道如何使用它访问不同的“索引”
  • 到目前为止,这是我从在线资源中收集的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
    
    作为旁注,我是按照教授的要求使用的,因此GNU工具识别的一些命令不会被ARMSim#识别,或者至少我认为是这样。如果我错了,请纠正我

  • 您只是在覆盖元素。在这个级别上有“数组之类的东西”,但只有固定大小的预分配数组。
    .skip
    正在分配固定大小的数组。*可变大小、可扩展的数组通常会使用堆栈或堆实现更复杂的动态内存分配代码
  • 如果您有一个像
    loop:
    (实际名称是任意的)这样的标签,您可以使用
    b loop
    来分支(返回)到它。(可能,您希望有条件地执行分支,这样程序就不会永远循环。)您可以通过更改
    R0
    来访问循环中的不同元素,您已经在这样做了
  • 另外,
    b main
    实际上没有任何用途,因为它正在分支到下一条指令。如果您删除它,代码将执行相同的操作


    [*]或者,您可以说您的数组是介于
    MyArray
    R0
    之间的元素(不包括
    R0
    指向的内存),通过更改
    R0
    可以扩展数组。但是最大大小仍然是由
    .skip
    指令确定的。

    为什么要投否决票?是的,这部分与家庭作业有关,但我可以看到这些信息对其他人很有用,我不是在问如何完成我的作业。如果你想这样说的话,除了arm之外,任何处理器家族中都没有数组。数组实际上并不存在,它们只是从某处开始的一团内存。许多指令集(绝对是arm)都支持寄存器偏移寻址模式,这使您能够对阵列有一种纯粹的感觉。我会小心地在将来发表你的声明。@dwelch啊,谢谢你的留言,对我的理解有很大帮助。我还要记住不要把它们叫做数组谢谢你的解释,我没有意识到
    循环:
    是任意的。快速提问,我将如何访问不同的元素?可能您希望将
    R0
    指向MyArray(例如
    ldr R0,=MyArray
    adr R0,MyArray
    ),然后执行类似
    str rx、[R0,#4]
    str rx、[R0,R2]
    的操作,其中
    R2
    具有0、4、8等值。。。