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

all*_*ejo 6 arrays assembly 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
Run Code Online (Sandbox Code Playgroud)

作为旁注,我正在按照我的教授的要求使用ARMSim#,因此GNU工具识别的一些命令将不会被ARMSim#识别,或者至少我相信是这种情况.如果我错了,请纠正我.

小智 3

  1. 您只是覆盖元素。在这个级别上有“诸如数组之类的东西”,但只有固定大小的预分配数组。正在.skip分配固定大小的数组。* 可变大小的、可增长的数组通常通过使用堆栈或堆的更复杂的动态内存分配代码来实现。
  2. 如果您有一个类似的标签loop:(实际名称是任意的),您可以使用 分支(返回)到它b loop。(可能,您希望有条件地执行分支,以便程序不会永远循环。)您可以通过更改 来访问循环中的不同元素R0,您已经在这样做了

此外,它b main并没有真正起到任何作用,因为它正在分支到下一条指令。如果删除该代码,它也会执行相同的操作。

[*] 或者,您可以说您的数组是MyArray和之间的唯一元素R0(不包括内存R0指向),其中,通过更改R0您可以扩展数组。但最大尺寸仍然由.skip指令固定。