You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCC内联汇编手动递增指针地址时触发段错误问题排查

内联汇编实现矩阵乘法时的指针递增段错误问题

我正在深入学习汇编,尝试在自行编写的小型线性代数库中使用内联汇编实现矩阵乘法。其他功能正常,但在手动递增指针指向的地址时遇到问题,这是实现矩阵元素乘法的必要步骤。

当前代码编译通过,但运行时触发核心转储(segmentation fault)错误。我怀疑问题出在标注的汇编代码行,同时也对变量约束设置存疑——这两个变量兼具输入输出属性,但最初仅声明为输入。我直接复制了GCC反汇编中++pointer_address的实现方式,但问题仍未解决。

初始代码

void multiply(int n, int m, int* ptrM1, int* ptrM2, int* result)
{
    int counter = n*n*m;
    int index = 1;
    int inter = 0;
    while (index != (counter+1))
    {
        asm 
        (
            "movl %2, %%eax\n\t"
            "mull %3\n\t"
            "movl %%eax, %0\n\t"
            "addl %0, %1\n\t"
            "addq $0x04, (%2)\n\t"      //<-----问题代码行
            "addq $0x04, (%3)\n\t"      //<-----问题代码行
            :"+c"(inter),"+b"(*result)
            :"r"(*ptrM1), "r"(*ptrM2)
            :"%eax"
        );
        printf("%d  ", *result);
        //++ptrM1;                      //希望在汇编中实现此操作
        //++ptrM2;                      //同上
        if ((index % m ) == 0){++result;}
        ++index;
    }
}

修改约束后的代码

void multiply(int n, int m, int* ptrM1, int* ptrM2, int* result)
{
    int counter = n*n*m;
    int index = 1;
    int inter = 0;
    while (index != (counter+1))
    {
        asm 
        (
            "movl %4, %%eax\n\t"
            "mull %5\n\t"
            "movl %%eax, %0\n\t"
            "addl %0, %1\n\t"
            "addq $0x04, %2\n\t" //问题代码行
            "addq $0x04, %3\n\t" //问题代码行
            :"+c"(inter),"+b"(*result), "+rm"(ptrM1), "+rm"(ptrM2)
            :"r"(*ptrM1), "r"(*ptrM2)
            :"%eax"
        );
        printf("%d  ", *result);
        //++ptrM1;                  //希望在汇编中实现此操作
        //++ptrM2;                  //同上
        if ((index % m ) == 0){++result;}
        ++index;
    }
}

原C实现版本(用于对比)

void multiply(int n, int m, int* ptrM1, int* ptrM2, int* result)
{
    int counter = n*n*m;
    int index = 1;
    int inter = 0;
    while (index != (counter+1))
    {
        if ((index % m ) == 0)
        {
            inter = *ptrM1 * *ptrM2;
            *result += inter;
            ++ptrM1;
            ++ptrM2;
            ++result;
        }
        else
        {
            inter = *ptrM1 * *ptrM2;
            *result += inter;
            ++ptrM1;
            ++ptrM2;
        }
        ++index;
    }
}

内容的提问来源于stack exchange,提问作者Fulvio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:45:40