Модератор: Модераторы разделов
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Сообщение
BratSinot »
Доброго времени суток!
Как через XCHG поменять две переменные float/double/long double местами? Есть такой код:
Код: Выделить всё
float x, y;
x=10.2;
y=10.31;
asm
(
"xchg %0, %1"
: "=r"(x)
: "r"(y)
);
printf("%lf\n", y);
Он работает прекрастно для целочисленных типов, а вот для чисел с плавающей точкой почему-то не хочет.
Попутный вопрос, как таким образом поменять значение двух элементов массива?
Брр.... Что за бред? После выполнения этого кода значение x==y==10.31, при чем то-же самое в случае с целочисленными типами.
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Сообщение
Portnov »
Гм, а про сопроцессор и его собственный стек ничего не слышали? ;)
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Сообщение
BratSinot »
Portnov писал(а): ↑03.08.2011 12:25
Гм, а про сопроцессор и его собственный стек ничего не слышали?

А при чем здесь сопроцессор? Уж для целочисленных типов его нету.
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Сообщение
Portnov »
BratSinot писал(а): ↑03.08.2011 12:06
Он работает прекрастно для целочисленных типов, а вот для чисел с плавающей точкой почему-то не хочет.
ы?
-
BratSinot
- Сообщения: 812
- ОС: Slackware64
Сообщение
BratSinot »
Portnov писал(а): ↑03.08.2011 13:28
BratSinot писал(а): ↑03.08.2011 12:06
Он работает прекрастно для целочисленных типов, а вот для чисел с плавающей точкой почему-то не хочет.
ы?
Брр.... Что за бред? После выполнения этого кода значение x==y==10.31, при чем то-же самое в случае с целочисленными типами.
Portnov писал(а): ↑03.08.2011 12:25
Гм, а про сопроцессор и его собственный стек ничего не слышали?

А при чем здесь сопроцессор? Уж для целочисленных типов его нету.
А еще я не слышал чтоб gcc использовал stN регистры. Он как всегда, стек, регистры процессора, или различные sse регистры.