使用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
相关产品推荐
相关产品推荐

