簡體   English   中英

使用g ++進行sse內聯匯編

[英]sse inline assembly with g++

我正在嘗試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(“ ..”)嗎?

您正在將s[0]s[0]數據加載到%edx ,並將其用作指針。 然后,當您嘗試訪問%edx + 0x30 ,將崩潰,因為s[0] + 48沒有映射為供您讀取的進程。 (特別是,由於s是全局的,因此初始化為全零,因此您嘗試從地址0x30加載)

您可以使用stepisi來單機指令。 帶有-i后綴的許多其他功能都可以使用,例如nexti

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM