双向地址转换还是什么?

时间:2013-05-22 05:21:45

标签: c++ assembly arm

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

2 个答案:

答案 0 :(得分:2)

由于kseedslstd::vector<double>&,因此您需要两条加载指令来获取向量中包含的实际数据。

第一个加载指令将std::vector对象本身的位置加载到r3中 第二个加载指令加载由std::vector管理的数据区的地址。这恰好存储在您实现中std::vector的第一个成员中。

答案 1 :(得分:1)

更新
kseedsl作为对堆栈上对象的引用传递,因为它的类型为vector<>&。第一个ldr从堆栈中获取对象的引用 - 实际存储对象的地址。第二个ldr解除引用(使用它作为间接)引用以获取向量的地址。从那里可以直接索引。