- 1
- 2
- 3
- 4
- 5
- 6
- 7
// тут обычный паскалевский код...
if x > y then asm // если икс больше игрека
mov eax, x // то меняем их значения местами
mov edx, y
mov x, edx
mov y, eax
end;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+102
// тут обычный паскалевский код...
if x > y then asm // если икс больше игрека
mov eax, x // то меняем их значения местами
mov edx, y
mov x, edx
mov y, eax
end;
Как поменять значения двух целочисленных переменных, не заводя третью? Года 3 назад я делал примерно так.
x += y;
y = x - y;
x -= y;
}
xor
Хотя, на деле, ересь ещё та.
Провёл наглядный эксперимент. В цикле 100000000 раз выполнил по 32 раза раза обмен значениями.
С помощью xchg это выполнялось real 0m7.318s,
А с помощью тройного xor это выполнялось real 0m11.239s.
я минуснул, хотя хотел +1, сори
если asm - то xchg, а в SSE есть еще и shuffle
если delphi/pascal - то xor
хотя нет проблем и на Паскале:
begin
inc(x,y);
y:=x-y;
dec(x,y);
end;
вроде микроконтроллеры на дельфи не программируют...
mov eax, x
mov edx, y
mov x, edx
mov y, eax
Не в языке дело, конечно, а в хороших оптимизаторах.
Надоел уже со своим С++ - то, С++ - это...
)) интересно где здесь третья переменная
Другое дело, что даже дельфовый компилятор соптимизирует обмен с третьей переменной.
но экономия 4 байтов при стеке в ~1 миллион байтов (в Win по дефолту, а можно увеличить) - это дебилизм.
Есть такое правило - не оптимизируй, пока не приспичит. А Дельфи вроде бы не функциональный язык, чтобы половину данных в стеке хранить (через рекурсии всякие). Если бы этим занимался оптимизацтор Хаскеля - то нет проблем.
На самом деле это я так делал в ТП, вместо eax был ax, естественно. И там экономить
приходилось на всём.
А ты не знал?
Ругаться матом - признак взросления. Вот его и пытаются показать детишки, что мол уже взрослый. Не понимая о последствиях...
Взрослеет полстраны
Ну покрайней мере так считают дети, смотря на матюкающихся взрослых.
>Взрослеет полстраны
Детей много. Есть даже великовозрастные.
"Ругаться матом - признак взросления."
"покрайней мере так считают дети"
:)
1. push eax
2. mov eax, x
3. mov x,y
4. mov y,eax
5. pop eax
6. ?????
7. PROFIT
An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers.
Да и п. 3 невозможен, т.к. в x86 нет пересылок память-память, по-моему.
100% не прокатит нельзя память-память можно регистр-память или регистр-регистр
Так можно что ли?
Ёбаный стыд. Конечно же нет. Я пошёл убивать себя
На моём eeepc900, как показывает опыт, xchg работает быстрее, чем тройной xor.
- тем, что xchg придётся использовать так:
mov ax, x
mov bx, y
xchg ax, bx
mov x, ax
mov y, bx
(xchg работает только с регистрами, а тебе нужно сохранять переменные в памяти)
Не совсем верно. Кроме всем известной формы с опкодом 90H-97H (xchg ax, reg, где 90H=xchg ax, ax=NOP — частный случай), есть ещё
86H — xchg r/m 8bit, reg 8bit
и 87H — xchg r/m, reg (16bit либо 32bit [либо даже 64bit на x86_64]).
Здесь r/m — либо регистр, либо ссылка на память, то есть в точности, как у инструкции mov.
Поэтому
Операции память-память, увы, не предусмотрено, так что один регистр придётся потратить.
Альтернативный вариант:
Ни одного регистра не занято, зато занят стек.
а что 2 регистра используешь, это вообще не считается? :))) Ты тут 2 переменные заводишь вместо одной!
Да ещё и не заботишься о сохранении регистров
a, b = b, a