我正在查看 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
(line1, 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);