Я пытаюсь использовать инлайна ассемблерный директиву GCC/G ++ (я должен сказать, что я использую синтаксис Intel на MSVC ранее, и это было бриз). Я играл с двойных значений и следующий 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;
}
Я получаю ошибка именно (когда я бег с БГДОМ):
Program received signal SIGBUS, Bus error. 0x00000000004008e1 in main (argc=<error reading variable: Cannot access memory at address 0x400fffffffffffec>, argv=<error reading variable: Cannot access memory at address 0x400fffffffffffe0>) at asm_test.cpp:28 28 b = my_func2(&a);
Что я делаю неправильно? В последней строке my_func2 Я указал, что память тоже сбита, я не понимаю ... Где я могу найти хорошее руководство по использованию печально известного AT & T синтаксиса?
компилировать с: g++ -g -o asm_test asm_test.cpp
, г ++ версия г ++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 на Ubuntu Linux SCV 3.2.0-48-родовой # 74-Ubuntu SMP чт 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, есть что-то еще вы бы порекомендовали?
Спасибо,
Эма
Не надо _need_ эти флаги компилировать и заставить работать. – Emanuele