【发布时间】:2013-07-05 08:50:51
【问题描述】:
我正在尝试使用 gcc/g++ 的内联 asm 指令(我不得不说我之前一直在 MSVC 上使用英特尔语法,那就是微风)。 我正在玩 double 值,以下 my_func2 似乎在执行后崩溃:
#include <iostream>
void my_func(const double *in, double *out) {
asm("mov %0, %%r8" : : "r"(in));
asm("movupd (%%r8), %%xmm0" :);
asm("movupd (%%r8), %%xmm1" :);
asm("addpd %%xmm1, %%xmm0" :);
asm("movupd %%xmm0, (%0)" : : "r"(out) : "%r8", "%xmm0", "%xmm1");
}
double my_func2(const double *in) {
double ret = 0.0;
asm("mov %0, %%r8" : : "r"(in));
asm("movupd (%%r8), %%xmm0" :);
asm("movupd (%%r8), %%xmm1" :);
asm("addpd %%xmm1, %%xmm0" :);
asm("movupd %%xmm0, %0" : "=m"(ret) : : "memory", "%r8", "%xmm0", "%xmm1");
return ret;
}
int main(int argc, char *argv[]) {
const double a = 1.0;
double b = 0.0;
my_func(&a, &b);
std::cout << "b:" << b << std::endl;
b = my_func2(&a);
std::cout << "b:" << b << std::endl;
}
我得到的错误具体是(当我使用 gdb 运行时):
程序收到信号 SIGBUS,总线错误。 0x00000000004008e1 in main (argc=我做错了什么?在 my_func2 的最后一行我已经指定 memory 也被破坏了,我不明白......
我在哪里可以找到如何使用臭名昭著的 AT&T 语法的好指南?
我编译:g++ -g -o asm_test asm_test.cpp,g++ 版本 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 on Ubuntu Linux scv 3.2.0-48 -generic #74-Ubuntu SMP Thu Jun 6 19:43:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux。
我找到了 http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html 和 http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html ,您有什么更多推荐的吗?
谢谢,
埃玛
【问题讨论】:
-
不要需要这些标志来编译并使其工作。
标签: c++ gcc assembly inline-assembly att