如何在ARM程序集中正确创建数组?

时间:2013-10-12 05:50:45

标签: arrays assembly arm

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

  1. 我是否正确地向数组中添加了新值,或者我只是覆盖了以前的值?如果我要覆盖这些值,我该如何添加新值呢?
  2. 如何循环遍历数组的不同值?我知道我必须使用loop:但不知道如何使用它来访问不同的“索引”。
  3. 到目前为止,这是我从阅读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 个答案:

答案 0 :(得分:2)

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

    [*]或者,您可以说您的数组是MyArrayR0之间的唯一元素(不包括指向的内存R0),其中,通过更改{ {1}}您正在扩展数组。但最大大小仍然由R0指令确定。