Я тестирую простой встроенный код ассемблера, используя gcc.И я нахожу результат следующего кода неожиданным:
#include <stdio.h>
int main(void) {
unsigned x0 = 0, x1 = 1, x2 = 2;
__asm__ volatile("movl %1, %0;\n\t"
"movl %2, %1"
:"=r"(x0), "+r"(x1)
:"r"(x2)
:);
printf("%u, %u\n", x0, x1);
return 0;
}
Напечатанный результат - 1, 1
, а не ожидаемый 1, 2
.Затем я скомпилировал код с параметром -S
и обнаружил, что gcc сгенерировал код, поскольку
movl %eax, %edx;
movl %edx, %eax;
%0
и %2
используют один и тот же регистр, почему?
Я хочуgcc для генерации, скажем,
movl %eax, %edx;
movl %ecx, %eax;
Если я добавлю "0"(x1)
к ограничениям ввода, gcc сгенерирует приведенный выше код.Означает ли это, что все регистры должны быть инициализированы перед использованием во встроенной сборке?