Arrays 为什么需要轮班才能访问阵列位置?

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

我正在分析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     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,因此这也可能是一个长的
数组(但可能不是基于在其上执行的操作的指针)。