LINUX.ORG.RU

Inline Assembler


0

0

Есть прога:
#include <stdio.h>

int main(int argc, char *argv[])
{
float b1[255];
float b2[255];
int c;

__asm__ __volatile__
(
"cld\n\t"
"rep\n\t"
"movsl"
: "=c"(c)
: "S"(b1), "D"(b2), "c"(255)
: "%ecx", "%esi", "%edi"
);

printf("C=%i\n", c);

return 0;
}

Пробуем компилять:
$ g++ ./1.cpp
1.cpp: In function `int main(int, char**)':
1.cpp:9: error: can't find a register in class `CREG' while reloading `asm'

В чем грабли ?

★★★★

А обязательно g++ использовать. gcc что говорит? Или extern "C" использовать.

anonymous
()
Ответ на: комментарий от anonymous

Параллельно хоть g++, хоть gcc причем пробовал кучу разных версий под разными осями - везде одно и тоже.

zaz ★★★★
() автор топика
Ответ на: комментарий от zaz

http://security.opennet.ru/base/dev/gccasm.txt.html

Note that GCC will not use a clobbered register for inputs or outputs.
GCC 2.7 would let you do it anyway, specifying an input in class
"a" and saying that "ax" is clobbered.  GCC 2.8 and egcs are getting
picky, and complaining that there are no free registers in class
"a" available.  This is not the way to do it.  If you corrupt an input
register, include a dummy output in the same register, the value of which
is never used.  E.g.

  int dummy;
  asm("munge %0" : "=r" (dummy) : "0" (input));

Murr ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.