Arrays 如何执行这部分代码,但使用ARM汇编的自动索引
这是可行的,但我必须使用自动索引来完成,我无法理解这一部分Arrays 如何执行这部分代码,但使用ARM汇编的自动索引,arrays,assembly,arm,addressing-mode,Arrays,Assembly,Arm,Addressing Mode,这是可行的,但我必须使用自动索引来完成,我无法理解这一部分 writeloop: cmp r0, #10 beq writedone ldr r1, =array1 lsl r2, r0, #2 add r2, r1, r2 str r2, [r2] add r0, r0, #1 b writeloop 至于我的数据 .balign 4 array1: skip 40 我试过的是这个,是的,我知道这可能是一个糟糕的尝试,但我是新来的,不明白 ldr r1, =
writeloop:
cmp r0, #10
beq writedone
ldr r1, =array1
lsl r2, r0, #2
add r2, r1, r2
str r2, [r2]
add r0, r0, #1
b writeloop
至于我的数据
.balign 4
array1: skip 40
我试过的是这个,是的,我知道这可能是一个糟糕的尝试,但我是新来的,不明白
ldr r1, =array1
writeloop:
cmp r0, #10
beq writedone
ldr r2, [r1], #4
str r2, [r2]
add r0, r0, #1
b writeloop
当我尝试这个的时候,它说是分段错误。怎么了?我认为应该发生的是,每当它循环通过时,它将元素r2设置为它自身的地址,然后递增到下一个元素,并执行相同的操作。ARM架构提供了几种不同的地址模式 还有很多: 加载和存储指令有三种主要寻址模式
-偏移量
-预索引
-后索引。
它们是通过向基址寄存器添加或从基址寄存器中减去立即数或基于寄存器的偏移量而形成的。基于寄存器的偏移也可以通过移位操作进行缩放。预索引和后索引寻址模式使用基址加偏移量计算更新基址寄存器。由于PC是一个通用寄存器,32位值可直接加载到PC中,以跳转到4GB内存空间中的任何地址 此外,它们还支持寄存器的写回或更新,因此需要预索引和后索引。如果没有回写,Post索引就没有多大意义 现在讨论您的问题,我认为您希望将值0-9写入一个十个字(长度为四个字节)的数组。假设这样,您可以使用索引并通过
add
更新值。这导致,
mov r0, #0 ; start value
ldr r1, =array1 ; array pointer
writeloop:
cmp r0, #10
beq writedone
str r0, [r1, r0, lsl #2] ; index with r1 base by r0 scaled by *4
add r0, r0, #1
b writeloop
writedone:
; code to jump somewhere else and not execute data.
.balign 4
array1: skip 40
出于兴趣,可以通过计数和记录来实现更高效的循环
mov r0, #9 ; start value
ldr r1, =array1 ; array pointer
writeloop:
str r0, [r1, r0, lsl #2] ; index with r1 base by r0 scaled by *4
subs r0, r0, #1
bne writeloop
您最初的示例是编写指向数组的指针;通常被称为“值等于地址”。如果这是你想要的
ldr r0, =array_end ; finished?
ldr r1, =array1 ; array pointer
write_loop:
str r1, [r1], #4 ; add four and update after storing
cmp r0, r1
bne write_loop
; code to jump somewhere else and not execute data.
.balign 4
array1: skip 40
array_end:
添加r2、r1、r2
<代码>r1未设置为任何值。还不清楚你为什么要从数组中读取数据?请具体说明你想做什么。我的问题是。为什么要从数组中读取?更糟糕的是,你正在读取r2
,这将是一个空指针,因此当你随后试图通过它写入时会出错。即使我也不知道我在做什么,伙计。这个任务很奇怪。本质上,我应该做的是使索引=其内存位置。所以,数组[0]=0,数组[1]=4,数组[2]=8,每次增加4,因为这是它在内存位置之间每次增加的量。这也许不是一个很好的描述,但也许是某种东西。至于我为什么要加载任何东西,我只是觉得我需要先加载数组,这样我才能获得内存位置,或者这也错了?@dcalvert-你确定这就是目标吗?根据措辞,存储内存位置可能意味着数组[0]=&array[0],数组[1]=&array[1],…,存储指针而不是偏移量。我们试图告诉您的是,ldr
正在从数组中读取!你不想读任何东西。删除ldr
并将str
更改为str r1、[r1]、#4
。感谢您提供了详细解释的答案。我想这将有助于我把自己带到另一边。你是个救生员!是的,我只是用了它,它工作得很好。我的问题是,我认为我必须出于某种原因使用ldr,而不是str。我想,这是一个新手的错误。再次感谢你