встроенная сборка sse с g ++ - PullRequest
       16

встроенная сборка sse с g ++

1 голос
/ 15 сентября 2010

Я пробую встроенную сборку g ++ и sse и написал первую программу. Это segfaults - почему?

#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 ("..") вокруг каждой строки?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Вы загружаете данные в s[0] в %edx и используете их в качестве указателя.Затем при попытке доступа к %edx + 0x30 происходит сбой, поскольку s[0] + 48 не сопоставлен для чтения вашего процесса.(В частности, поскольку s является глобальным и поэтому инициализируется для всех нулей, вы пытаетесь загрузить его с адреса 0x30)

1 голос
/ 15 сентября 2010

Вы можете использовать stepi или si для пошагового выполнения отдельных машинных инструкций.Многие другие функции доступны, например, с суффиксом -i, например nexti.

...