带有输入/输出操作数的内联 asm 以更新指针并更新它指向的内容

问题描述 投票:0回答:0

我正在使用 RISC-V 汇编语言和 GNU C 内联 asm 实现 3*3 矩阵和 3*1 矩阵乘法。

// description: matrix multiply with two-level for loop

#include<stdio.h>
int main()
{
        int f,i=0;
        int h[9]={0}, x[3]={0}, y[3]={0};
        FILE *input = fopen("../input/3.txt","r");
        for(i = 0; i<9; i++) fscanf(input, "%d", &h[i]);
        for(i = 0; i<3; i++) fscanf(input, "%d", &x[i]);
        for(i = 0; i<3; i++) fscanf(input, "%d", &y[i]);
        fclose(input);
        int *p_x = &x[0] ;
        int *p_h = &h[0] ;
        int *p_y = &y[0] ;

        for (i = 0 ; i < 3; i++)
        {

                p_x = &x[0] ;
        /*
         for (f = 0 ; f < 3; f++)
             *p_y += *p_h++ * *p_x++ ;
        */

                for (f = 0 ; f < 3; f++){
                   asm volatile (
                    "addi t0, zero, 2\n\t"
                    "bne t0, %[f], Multi\n\t"
                    "mul t1, %[sp_h], %[sp_x]\n\t"
                    "add %[sp_y], %[sp_y], t1\n\t"
                    "addi %[p_h], %[p_h], 4\n\t"
                    "addi %[p_x], %[p_x], 4\n\t"
                    "addi %[p_y], %[p_y], 4\n\t"
                    "beq zero, zero, Exit\n\t"
                    "Multi: \n\t"
                    "mul t1, %[sp_h], %[sp_x]\n\t"
                    "add %[sp_y], %[sp_y], t1\n\t"
                    "addi %[p_h], %[p_h], 4\n\t"
                    "addi %[p_x], %[p_x], 4\n\t"
                    "Exit: \n\t"
                    :[p_y] "+&r"(p_y),
                     [p_x] "+&r"(p_x),
                     [p_h] "+&r"(p_h),
                     [sp_y] "+&r"(*p_y)
                    :[sp_h] "r"(*p_h),
                     [sp_x] "r"(*p_x),
                     [f] "r"(f)
                    :"t0","t1"

                );
            printf("x value=%d, h value=%d, y value=%d, y address=%d\n", *p_x, *p_h, *p_y, p_y);
        }

        }

        p_y = &y[0];

        for(i = 0; i<3; i++)
                printf("%d \n", *p_y++);

        return(0) ;

}

我要转这个评论

for (f = 0 ; f < 3; f++) 
    *p_y += *p_h++ * *p_x++ ;
p_y++;

进入 asm volatile(...),但是上面的 asm 代码我遇到了这个问题: my problem 看起来

p_y
地址添加正确,我的乘法正确,但我存储到内存中的值是错误的。它存储到内存中的速度太快了,现在我的答案将以前的答案加在一起。上面的代码答案是
5 28 69
有人可以帮助我吗? 我已经将
"+r"
编辑为
"+&r"
并将代码添加到代码中,但它不起作用。

顺便说一下,我从这段代码中得到了正确答案:

for (f = 0 ; f < 3; f++)
                    asm volatile ("mul %[tmp], %[sp_h], %[sp_x]\n\t"
                                  "add %[sp_y], %[sp_y], %[tmp]\n\t"
                                  "addi %[p_x], %[p_x], 4\n\t"
                                  "addi %[p_h], %[p_h], 4\n\t"
                                  :[tmp] "=r"(tmp),
                                   [p_x] "+r"(p_x),
                                   [p_h] "+r"(p_h),
                                   [sp_y] "+r"(*p_y)
                                  :[sp_h] "r"(*p_h),
                                   [sp_x] "r"(*p_x)
                                );
            p_y++;

期待

14 
32 
50

求答案。 这是输入数据:

1 2 3 4 5 6 7 8 9
1 2 3
0 0 0
c gcc inline-assembly volatile riscv
© www.soinside.com 2019 - 2024. All rights reserved.