1

我正在尝试 g++ 内联汇编和 sse 并编写了第一个程序。它出现段错误 - 为什么?

#include <stdio.h>

float s[128*4] __attribute__((aligned(16)));

#define r0 3
#define r1 17
#define r2 110
#define rs0 "3"
#define rs1 "17"
#define rs2 "110"

int main () {
  s[r0*4+0] = 2.0;  s[r0*4+1] = 3.0;  s[r0*4+2] = 4.0;  s[r0*4+3] = 5.0;
  s[r1*4+0] = 3.5;  s[r1*4+1] = 3.5;  s[r1*4+2] = 3.5;  s[r1*4+3] = 3.5;
  asm (
    "\n\t  .intel_syntax noprefix"

    "\n\t  mov     edx,                s"
    "\n\t  movaps  xmm0,               [edx + " rs0 "*16]"
    "\n\t  movaps  xmm1,               [edx + " rs1 "*16]"
    "\n\t  mulps   xmm0,               xmm1"
    "\n\t  movaps  [edx + " rs2 "*16], xmm0"

    "\n\t  .att_syntax"
  );
  printf ("%f %f %f %f\n", s[r2*4+0], s[r2*4+1], s[r2*4+2], s[r2*4+3]);
}

为什么 gdb 不允许我单步执行汇编指令?我需要在每一行周围写 asm ("..") 吗?

4

2 回答 2

2

您正在将数据加载s[0]%edx其中并将其用作指针。然后,当您尝试访问%edx + 0x30时,您会崩溃,因为s[0] + 48未映射您的进程以供读取。(具体来说,由于s是全局的,因此初始化为全零,因此您尝试从地址加载0x30

于 2010-09-15T15:16:51.063 回答
1

您可以使用stepisi单步执行单机指令。许多其他功能都可以像这样使用-i后缀,例如nexti.

于 2010-09-15T14:57:37.427 回答