Ответ 1
Эквивалентный оператор ASM в стиле GCC будет выглядеть следующим образом:
__asm__(
"push %%eax\n\t"
"push %%ebx\n\t"
"push %%ecx\n\t"
"mov %0,%%eax\n\t"
"mov %1,%%ebx\n\t"
"xor %%ebx,%%eax\n\t"
"mov %%eax,%%ecx\n\t"
"xor %%ebx,%%ecx\n\t"
"mov %%ecx,%%ebx\n\t"
"xor %%ebx,%%eax\n\t"
"mov %%eax,%0\n\t"
"mov %%ebx,%0\n\t"
"pop %%ecx\n\t"
"pop %%ebx\n\t"
"pop %%eax"
: "+m" (A), "+m" (B));
(Я исправил очевидную ошибку, поместив сохраненные значения в стек обратно в свои исходные регистры.)
Я не уверен, какой смысл в этой инструкции сборки. Он прилагает много усилий, чтобы сделать что-то, что можно было бы сделать гораздо эффективнее в трех строках кода C/С++:
temp = A;
A = B;
B = temp;
Если бы я притворился, что он сделал что-то полезное, а не просто заменил две переменные, я бы предложил избавиться от явно несущественных инструкций PUSH/POP:
__asm__(
"xor %1,%0\n\t"
"mov %0,%2\n\t"
"xor %1,%2\n\t"
"mov %2,%1\n\t"
"xor %1,%0"
: "+r" (A), "+r" (B), "=r" (temp));