我正在查看C ++本机代码的ARM汇编代码。目标平台是Windows Phone 8,构建环境是Visual Studio 2012。
我正在检查ARM汇编代码,以便最大限度地寻找代码优化的可能性。
我对ARM代码中的一条指令的要求感到困惑,如下。
C ++代码:
double lmean= kseedsl[n];
ARM代码:
1: ldr r3,[sp,#0x4C]
2: ldr r3,[r3] // r3= kseedsl
3: add r2,r3,r6,lsl #3 // r2 = &kseedsl[n] (r6 has value of "n")
4: vldr d13,[r2] // d13 = *(r2)
我理解变量的地址如kseedsl
(函数中的输入参数)存储在堆栈中。但是我很无能为什么我们需要两个ldr
(第1,2行)将kseedsl
的地址加载到r3中。据我所知,我希望[sp,#0x4C]
直接存储kseedsl的地址,该地址作为函数争论传递。
请指出我在这里缺少的东西。 我希望它是一个我不知道的标准概念。
编辑:该功能的骨架如下:
void function_xyz(
vector<double>& kseedsl,
vector<double>& kseedsa,
vector<double>& kseedsb,
vector<int>& kseedsx,
vector<int>& kseedsy,
unsigned short* klabels,
const int& STEP,
const double& M,
int Iter,
int *oMaxSegsize);
答案 0 :(得分:2)
由于kseedsl
是std::vector<double>&
,因此您需要两条加载指令来获取向量中包含的实际数据。
第一个加载指令将std::vector
对象本身的位置加载到r3中
第二个加载指令加载由std::vector
管理的数据区的地址。这恰好存储在您实现中std::vector
的第一个成员中。
答案 1 :(得分:1)
更新
kseedsl
作为对堆栈上对象的引用传递,因为它的类型为vector<>&
。第一个ldr
从堆栈中获取对象的引用 - 实际存储对象的地址。第二个ldr
解除引用(使用它作为间接)引用以获取向量的地址。从那里可以直接索引。