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