在汇编函数中将元素数组作为参数传递时如何转发ARM寄存器的地址指针

How to make forward the address pointer of ARM register while passing array of elements as parameter in an assembly function

作为汇编语言领域的新手开发人员,我正在尝试编写几个 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;
}

我在这里尝试计算元素数组中最后 64 个值的总和。我已经通过使用 arm neon 指令集转换了这个功能。

NEON_ASM_FUNC_BEGIN CalculateSumOfLast64_ARM_NEON
#r0 First parameter, This is the address of <pData>
#r1 Second Parameter, This is the address of <ans>
push {r2-r8, lr}
mov r4, r0

mov r5, #192
.skipLoop:
vld1.u32 {d0}, [r4]!
subs r5, #2
bne .skipLoop

mov r8, #0
mov r5, #64
.calculationLoop:
vld1.u32 {d0}, [r4]!
vmov r7, r6, d0
add r8, r8, r6;
add r8, r8, r7;
subs r5, #2
bne .calculationLoop

str r8, [r1]
pop {r2-r8, pc}
NEON_ASM_FUNC_END

在c++中向前移动或操作地址指针真的很容易。

unsigned int *pDataTemp = pData + 192;

我需要一个完整的循环来移动 arm 寄存器中的地址指针。

mov r5, #192
.skipLoop:
vld1.u32 {d0}, [r4]!
subs r5, #2
bne .skipLoop

虽然此解决方案有效,但我知道...这绝对不是一个好主意。 我在网上搜索了很多以提出解决方案。 是否有任何指令集可以转发arm寄存器的地址指针? 或者,这个问题有更好的解决方案吗?

不要只动,要在开头加上:

add r4, r0, #192*4

那就行了。

C++ 示例: 在c++中向前移动或操作地址指针真的很容易。

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。
然后ADD R7,R0,#192 *4 指令将像
R7 = 598 + 192 * 4 = 1366 一样工作。
R7 将代表另一个值。

ii)假设R0寄存器代表一个内存地址。
例如,R0 = 0xcbc02150(Memory Address depending ARCH)。
然后 ADD R7, R0, #192*4 指令将像
R7 = 0xCBC02150 + HexValue(192*4) = 0xCBC02150 + 0x300 = 0xCBC02450.
R7 将代表另一个内存地址。