如何在ARM程序集中指向数组中的值?

时间:2015-11-21 01:47:08

标签: assembly arm

所以我需要指向数组中的特定值。我不知道如何获得地址,所以例如我需要做的(在C中)这个调用是这样的函数,

int p = 5;
cqs(&a[0], p);
cqs(&a[p+1], n-p-1);

我如何指向ARM中的特定索引?我试过了

ldr r6, [r0, r3, asl #2]
ldr r0, =r6
bl cqs

但是编译器并不喜欢这样。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

地址数学只是整数加/减。

查看C编译器输出是学习asm的一种方法。

void cqs(int *);

int arrayptr(int *a) {
  int p = 5;
  cqs(&a[p+1]);
  return 0;
}

compile to (godbolt ARM gcc 4.8)

arrayptr(int*):
    push    {r3, lr}    @
    adds    r0, r0, #24 @, a,
    bl  cqs(int*)   @
    movs    r0, #0  @,
    pop {r3, pc}    @

因此,adds dest, src, imm看起来是一种将数组指针偏移到数组中更远点的好方法。

return 0;从尾调用中停止gcc,将函数调用优化为跳转。

答案 1 :(得分:0)

假设你有r0中的基地址,r3中的(变量)索引,每个元素的大小是4个字节:

add r0, r0, r3, lsl#2    @ r0 += r3 * 4 
相关问题