C++ 在汇编函数中作为参数传递元素数组时如何使ARM寄存器的地址指针向前

C++ 在汇编函数中作为参数传递元素数组时如何使ARM寄存器的地址指针向前,c++,pointers,assembly,arm,neon,C++,Pointers,Assembly,Arm,Neon,作为汇编语言领域的新手,我正在尝试编写几个arm neon函数来加速计算。我将附加两个代码片段来解释我的问题 void CalculateSumOfLast64(unsigned int *pData, unsigned int *ans) { unsigned int *pDataTemp = pData + 192; int sum = 0; for(int i=0; i<64; i++){ sum += pDataTemp[i]; }

作为汇编语言领域的新手,我正在尝试编写几个arm neon函数来加速计算。我将附加两个代码片段来解释我的问题

void CalculateSumOfLast64(unsigned int *pData, unsigned int *ans)
{
    unsigned int *pDataTemp = pData + 192;
    int sum = 0;
    for(int i=0; i<64; i++){
        sum += pDataTemp[i];
    }
    *ans = sum;
}
int main(){
    unsigned int *pData = new unsigned int[256]; //Always Length is 256
    for(int i=0;i<256;i++){
        pData[i] = rand()%256;
    }
    unsigned int *ans = new unsigned int[1];
    CalculateSumOfLast64(pData, ans);
    cout<<"Final Ans = "<<*ans<<endl;
    return 0;
}
我需要一个完整的循环来移动arm寄存器中的地址指针

mov r5, #192
.skipLoop:
vld1.u32 {d0}, [r4]!
subs r5, #2
bne .skipLoop
虽然这个解决方案可行,但我知道。。。这绝对不是个好主意。 我在网上搜索了很多,想找到一个解决方案。 是否有任何指令集使arm寄存器的地址指针向前移动??
或者,有没有更好的解决方案

不要只是移动,而是在开头添加:

add r4, r0, #192*4

这样就可以了。

C++中的示例: 在C++中向前移动或操纵地址指针是非常容易的。
unsigned int *pDataTemp = pData + 192;
void testFunc(unsigned int *pData)
{
//Move address if needed...and do calculations.. 
unsigned int *pDataNew = pData + 192;
}
组件中的示例: 在汇编中,我们可以执行以下指令集中的操作

ADD R7, R0, #192*4
说明: 此指令可用于添加值和添加内存地址
I)考虑R0登记代表一个值。例如,R0=598。
然后<强>添加R7,R0,192×4 指令将工作如
< R>=598 +192×4=1366 < /强>。


让我们考虑R0登记器代表内存地址。例如,<强> > 0xCBC02150 < /强>(根据ARCH的内存地址)。< Br> >强>添加R7,R0,192×4 指令将工作如
<强> R7= 0xCBC02150+HouValk(192×4)。=0xCBC02150+0x300=0xCBC02450
R7将代表另一个内存地址

这是不正确的。它的工作原理类似于
r4=r4+r5*2
,这似乎正是您想要的。请注意,如果您只想将
r4
提升192个位置,您只需添加
r4、r4、#768
@fuz,是的,您是对的。添加r4、r4、r5、LSL#1指令的工作原理类似于,r4=r4+r5*2。但是指令,加上r4,r4,#768似乎是r4=r4+768。您确定它会将寄存器地址提前192个位置吗。我有点困惑,因为我不明白它将如何工作。请你解释一下好吗?192*4=768。内存可以单字节寻址,而元素的长度为4字节,因此要移动192个元素位置,必须将地址增加4*192。(顺便说一句,编译器不能设置为使用霓虹灯指令和矢量化优化步骤吗?它很可能会产生比您更快(或更正确)的结果)好的,数字768是要前进的总字节数。但在这种情况下,加上r4,r4,#768,似乎会将寄存器r4当前指向的值增加768。。如果我错了,请澄清。
r4
是寄存器
r4
的内容,它是32位值
[r4]
是内存内容,由
r4
值寻址(因此在本例中
r4
被解释为内存地址)。在
add r4,r4,#768
中,
r4
的32位被解释并用作32位整数值,因此,如果有地址指向数组的第一个元素(在C
pData+0
值中),那么768将被添加到它,这类似于
(int*)((byte*)pData 768)
。如果
pData
int*
类型,则等于
pData+192
。通过使用已知的数据类型大小乘以索引,C在指针算法方面确实“有帮助”。Asm不支持添加整数和添加指针,这并不是一项“不同的任务”。在汇编语言中,指针只是整数。(另外,您的示例中的地址是48位,这很奇怪。)@PeterCordes,感谢您的评论。我已根据您的建议编辑了答案。:)伟大的很久以前我给了你最正确的答案,你自己回答,然后选择它。现在你可以猜到:我将来会回答你的问题吗?@Jake Alquimista Lee,对不起,兄弟。。。我不是故意伤害你的。我只是试图用一些解释来详细说明答案。我刚刚接受了你的回答
ADD R7, R0, #192*4