【发布时间】:2010-09-15 14:49:53
【问题描述】:
我正在尝试 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 ("..") 吗?
【问题讨论】:
-
[edx + " rs2 "*16] = [edx + 110*16] - 这不是太多了吗? (只是猜测)。
-
好问题,我们需要在这里进行更多组装。
-
IIRC GDB 没有为内联函数(ASM 或其他)设置符号。不过,不要引用我的话。
-
使用
stepi逐条指令。 -
是的,我认为这会溢出,但是编译器没有抱怨,所以我决定等待看看它是否有效,然后再看一下反汇编。当我用 3,4,5 替换 r0,r1,r2 时也会发生段错误。
标签: c++ c g++ inline-assembly sse