Код компилируется нормально для меня на 32-битной версии x86, а не на x86-64 - это с gcc 4.2.1 на Mac OS X:
$ gcc -Wall -m32 cr0.c -o cr0
$
Нет ошибок или предупреждений.
$ gcc -Wall -m64 cr0.c -o cr0
/var/folders/.../cce0FYAB.s:9:suffix or operands invalid for `push'
/var/folders/.../cce0FYAB.s:10:suffix or operands invalid for `mov'
/var/folders/.../cce0FYAB.s:12:suffix or operands invalid for `mov'
/var/folders/.../cce0FYAB.s:14:suffix or operands invalid for `pop'
$
Так что, я думаю, здесь есть более глубокие проблемы, чем просто инструкция mov %eax,%cr0
с asm на x86-64.
Глядя на ISA x86-64, кажется, что для x86-64 вам, вероятно, нужно что-то подобное:
#include <stdio.h>
int main()
{
__asm__("pushq %rax\n\t"
"movq %cr0,%rax\n\t"
"orl $(1 << 30),%eax\n\t"
"movq %rax,%cr0\n\t"
"wbinvd\n\t"
"popq %rax"
);
return 0;
}
Я не знаю, работает ли это, но, по крайней мере, он компилируется / собирается. ОК:
$ gcc -Wall -m64 cr0.c -o cr0
$