所以我需要指向数组中的特定值。我不知道如何获得地址,所以例如我需要做的(在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
但是编译器并不喜欢这样。
有人可以帮忙吗?
答案 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