【问题标题】:Why is a shift required to access array position?为什么访问数组位置需要移位?
【发布时间】:2017-11-13 14:41:25
【问题描述】:

我正在 VIsUAL 仿真器中分析以下 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指向的,但是为什么那里有一个左逻辑移位?

【问题讨论】:

  • 因为word是4字节,所以需要缩放4,正好是左移2。

标签: arrays assembly arm


【解决方案1】:

这样做是为了说明数组中元素的大小。 在这种情况下,看起来代码正在访问大小为 4 字节的元素,可能是 C 中的 int(例如,在 ILP32 系统上)。

r2 中的循环计数器在循环的每次迭代中递增 1,但数组中的每个元素距前一个元素 4 个字节,因此,假设数组的开头在 r0 中,您希望您的访问模式为 [r0 + 0], [r0 + 4], [r0 + 8]... 而不是 [r0 + 0], [r0 + 1], [r0 + 2]...,这就是为什么需要 4 的比例因子。

【讨论】:

  • 是的,32 位 ARM 的所有标准 ABI 都是 ILP32,所以这也可以是 long 的数组(但可能不是基于对它们进行的操作的指针)。跨度>
猜你喜欢
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2011-04-16
  • 2017-10-07
  • 2022-07-28
相关资源
最近更新 更多