>Мне не нравится, что в списке переменных asm четыре переменных, а в Почаму 4, две x, y: x = -4(%rbp), y = -8(%rbp)
>коде ссылка только на две. Не знаю, как это исправить, пользуясь
>автоматическим выбором регистра. Я бы написал явно, примерно так:
>
>void hyperswap(int *p, int *q) {
> int x = *p, y = *q;
> asm ("xchg %%eax, %%ecx\n" : "=a" (x), "=c" (y) : "a"
>(x), "c" (y));
> *p = x, *q = y;
>}
У меня всё равно пихается в EDX, и появляется лишний mov
!
! __asm__ __volatile__ ("xchg %%eax, %%eсx" : "=a"(x), "=с"(y) : "a"(x), "с"(y));
main+22: mov -0x8(%rbp),%eax
main+25: mov -0x4(%rbp),%eсx
main+28: mov %eсx, %edx :)
main+31: xchg %eax,%edx
main+32: mov %eax,-0x8(%rbp)
main+33: mov %edx,-0x4(%rbp)
!
Вот так работат.
__asm__ __volatile__ ("xchg %%eax, %%edx" : "=a"(x), "=d"(y) : "a"(x), "d"(y));