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

stepiまたはを使用して、si単一の機械語命令をステップ実行できます。-iなどの接尾辞を付けて、このように他の多くの関数を使用できますnexti

于 2010-09-15T14:57:37.427 に答える