2

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

2 回答 2

2

因为kseedsl是 a std::vector<double>&,所以您需要两个加载指令来获取向量中包含的实际数据。

第一条加载指令将std::vector对象本身的位置加载到 r3 中。
第二条加载指令加载由std::vector. 这恰好存储在std::vector您的实现中的第一个成员中。

于 2013-05-22T08:24:12.963 回答
1

更新
kseedsl作为对堆栈上对象的引用传递,因为它的类型是vector<>&. 第一个ldr从堆栈中获取对象的引用——对象实际存储的地址。第二个ldr取消引用(将其用作间接)引用以获取向量的地址。从那里它是简单的索引。

于 2013-05-22T05:52:47.277 回答