Arrays 为什么需要轮班才能访问阵列位置?
我正在分析VisualEmulator中的以下ARM程序集,这是一个简单的函数,它循环遍历一组常量并选择最大的数值Arrays 为什么需要轮班才能访问阵列位置?,arrays,assembly,arm,Arrays,Assembly,Arm,我正在分析VisualEmulator中的以下ARM程序集,这是一个简单的函数,它循环遍历一组常量并选择最大的数值 mov r0, r13 ; pass the memory address where you stored the array's contents mov r1, #20 ; pass the second argument count to the function mov r5, #04
mov r0, r13 ; pass the memory address where you stored the array's contents
mov r1, #20 ; pass the second argument count to the function
mov r5, #04
mov r6, #01
mov r7, #13
mov r8, #42
mov r9, #25
stmfa r13, {r5,r6,r7,r8,r9}
bl max
end
max
mov r2, #0
L2
cmp r2, r1
bge L5
ldr r12, [r0, r2, lsl #2]
add r2, r2, #1
cmp r3, r12
movlt r3, r12
b L2
L5
mov r0, r3
它按预期工作,但有一件事我不明白:
ldr r12, [r0, r2, lsl #2]
它正在将数组的当前值加载到r12中,数组的开始由当前索引r2中的r0指向,但为什么会有左逻辑移位?这样做是为了考虑数组中元素的大小。 在本例中,代码似乎正在访问大小为4字节的元素,可能是C中的
int
(例如,在ILP32系统上)
r2中的循环计数器在循环的每次迭代中递增1,但数组中的每个元素距离前一个元素有4个字节,因此,假设数组的开头在r0中,您希望访问模式为
[r0+0]、[r0+4]、[r0+8]…
,而不是[r0+0]、[r0+1]、[r0+2]…
,这就是为什么需要4的比例因子。这样做是为了考虑数组中元素的大小。
在本例中,代码似乎正在访问大小为4字节的元素,可能是C中的int
(例如,在ILP32系统上)
r2中的循环计数器在循环的每次迭代中递增1,但数组中的每个元素距离前一个元素有4个字节,因此,假设数组的开头在r0中,您希望访问模式为
[r0+0]、[r0+4]、[r0+8]…
,而不是[r0+0]、[r0+1]、[r0+2]…
,这就是为什么需要4的缩放因子。因为字是4字节,所以需要缩放4,这恰好是2的左移。因为字是4字节,所以需要缩放4,这恰好是2的左移。是的,32位ARM的所有标准ABI都是ILP32,所以这也可能是一个长
(但可能不是基于在其上执行的操作的指针)。是的,32位ARM的所有标准ABI都是ILP32,因此这也可能是一个长的数组(但可能不是基于在其上执行的操作的指针)。