【问题标题】:How to properly create an array in ARM assembly?如何在 ARM 程序集中正确创建数组?
【发布时间】:2013-10-20 07:05:17
【问题描述】:

我目前正在为一门课程学习 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# 识别,或者至少我认为是这种情况。如果我错了,请纠正我。

【问题讨论】:

  • 为什么投反对票?是的,这与家庭作业部分相关,但我可以看到这些信息对其他人有用,而且我不是在问如何完成我的作业。
  • 如果你想这样说明,在任何处理器系列中都没有数组这样的东西,而不仅仅是 arm。数组实际上并不存在,它们只是从某处开始的一团内存。许多指令集,当然是 arm,都支持寄存器偏移寻址模式,让您能够获得纯粹的数组感觉。我以后会小心地做出你所做的声明。
  • @dwelch 啊,谢谢你的注意,对我的理解有很大帮助。我还要记住不要称它们为数组

标签: arrays assembly arm


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

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

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

【讨论】:

  • 感谢您的解释,没有意识到loop: 是任意的。快速提问,我将如何访问不同的元素?
  • 可能您想将R0 指向MyArray(例如ldr R0,=MyArrayadr R0, MyArray),然后执行str rx, [R0, #4]str rx, [R0, R2] 之类的操作,其中R2 的值类似于0、4、 8、...
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多