- 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 назад я делал примерно так.
guest 01.05.2010 21:59 # −1
TarasB 01.05.2010 22:13 # +1
guest 01.05.2010 22:18 # −1
x += y;
y = x - y;
x -= y;
}
TarasB 01.05.2010 22:25 # +2
guest 01.05.2010 23:03 # −4
guest 02.05.2010 01:49 # −1
comnimh 02.05.2010 05:04 # 0
xor
xaionaro 02.05.2010 10:25 # +1
guest 02.05.2010 10:28 # −1
Хотя, на деле, ересь ещё та.
guest 02.05.2010 10:32 # −1
xaionaro 08.05.2010 09:21 # 0
Провёл наглядный эксперимент. В цикле 100000000 раз выполнил по 32 раза раза обмен значениями.
С помощью xchg это выполнялось real 0m7.318s,
А с помощью тройного xor это выполнялось real 0m11.239s.
3.14159265 05.05.2010 16:00 # 0
я минуснул, хотя хотел +1, сори
если asm - то xchg, а в SSE есть еще и shuffle
если delphi/pascal - то xor
xaionaro 08.05.2010 09:23 # +1
guest 04.05.2010 16:32 # −1
хотя нет проблем и на Паскале:
begin
inc(x,y);
y:=x-y;
dec(x,y);
end;
cfdev 02.05.2010 01:43 # +4
вроде микроконтроллеры на дельфи не программируют...
guest 02.05.2010 10:02 # −1
mov eax, x
mov edx, y
mov x, edx
mov y, eax
Не в языке дело, конечно, а в хороших оптимизаторах.
guest 02.05.2010 10:34 # −3
Надоел уже со своим С++ - то, С++ - это...
guest 03.05.2010 01:21 # −1
guest 03.05.2010 08:52 # −3
guest 03.05.2010 08:52 # −3
guest 03.05.2010 12:12 # −3
guest 03.05.2010 12:13 # −3
rO_ot 28.05.2010 20:16 # 0
guest 02.05.2010 10:36 # −10
guest 03.05.2010 10:17 # −3
guest 04.05.2010 09:17 # −3
guest 04.05.2010 12:21 # −6
guest 05.05.2010 17:22 # +3
Grizzly 11.05.2010 13:18 # −1
rO_ot 28.05.2010 20:18 # 0
W1R0X 03.05.2010 11:22 # −2
)) интересно где здесь третья переменная
guest 03.05.2010 12:12 # −1
guest 03.05.2010 12:15 # −3
guest 03.05.2010 12:34 # +1
TarasB 03.05.2010 12:54 # 0
guest 05.05.2010 17:22 # −2
TarasB 05.05.2010 17:45 # +1
TarasB 02.05.2010 12:05 # 0
Другое дело, что даже дельфовый компилятор соптимизирует обмен с третьей переменной.
cfdev 02.05.2010 19:02 # 0
но экономия 4 байтов при стеке в ~1 миллион байтов (в Win по дефолту, а можно увеличить) - это дебилизм.
Есть такое правило - не оптимизируй, пока не приспичит. А Дельфи вроде бы не функциональный язык, чтобы половину данных в стеке хранить (через рекурсии всякие). Если бы этим занимался оптимизацтор Хаскеля - то нет проблем.
TarasB 02.05.2010 19:36 # 0
На самом деле это я так делал в ТП, вместо eax был ax, естественно. И там экономить
приходилось на всём.
W1R0X 03.05.2010 11:20 # 0
guest 03.05.2010 11:24 # −2
rO_ot 28.05.2010 20:19 # 0
guest 03.05.2010 09:58 # −1
guest 03.05.2010 10:17 # −1
guest 03.05.2010 10:20 # −1
guest 03.05.2010 10:58 # −1
guest 03.05.2010 10:59 # −1
guest 03.05.2010 11:05 # −1
guest 03.05.2010 12:13 # 0
rO_ot 28.05.2010 20:20 # +1
guest 03.05.2010 11:05 # −18
guest 03.05.2010 14:29 # −14
guest 03.05.2010 20:17 # −12
А ты не знал?
guest 03.05.2010 21:30 # −11
xaionaro 10.05.2010 23:26 # 0
Говногость 11.05.2010 06:26 # 0
Ругаться матом - признак взросления. Вот его и пытаются показать детишки, что мол уже взрослый. Не понимая о последствиях...
cfdev 11.05.2010 10:27 # 0
Взрослеет полстраны
Говногость 11.05.2010 11:30 # +1
Ну покрайней мере так считают дети, смотря на матюкающихся взрослых.
>Взрослеет полстраны
Детей много. Есть даже великовозрастные.
rO_ot 28.05.2010 20:22 # 0
"Ругаться матом - признак взросления."
"покрайней мере так считают дети"
:)
guest 08.05.2010 16:16 # −11
guest 27.05.2010 16:55 # −5
rO_ot 28.05.2010 20:23 # 0
ZLOvar 04.05.2010 12:15 # −4
guest 06.05.2010 16:10 # −7
guest 08.05.2010 16:16 # −3
BiSe_Trojanov 14.05.2010 14:11 # −2
1. push eax
2. mov eax, x
3. mov x,y
4. mov y,eax
5. pop eax
6. ?????
7. PROFIT
whiskey 17.05.2010 14:21 # +5
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 нет пересылок память-память, по-моему.
Arch 27.05.2010 16:13 # 0
adli__82 17.08.2010 11:02 # 0
100% не прокатит нельзя память-память можно регистр-память или регистр-регистр
TarasB 14.05.2010 17:30 # −1
Так можно что ли?
BiSe_Trojanov 17.05.2010 21:07 # +1
Ёбаный стыд. Конечно же нет. Я пошёл убивать себя
xaionaro 18.05.2010 09:34 # 0
Говногость 18.05.2010 12:35 # 0
xaionaro 01.06.2010 23:46 # 0
На моём eeepc900, как показывает опыт, xchg работает быстрее, чем тройной xor.
Kornew 18.07.2010 15:43 # 0
- тем, что xchg придётся использовать так:
mov ax, x
mov bx, y
xchg ax, bx
mov x, ax
mov y, bx
(xchg работает только с регистрами, а тебе нужно сохранять переменные в памяти)
inkanus-gray 19.07.2010 05:47 # +1
Не совсем верно. Кроме всем известной формы с опкодом 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.
Поэтому
Операции память-память, увы, не предусмотрено, так что один регистр придётся потратить.
Альтернативный вариант:
Ни одного регистра не занято, зато занят стек.
Isaev 15.05.2010 13:49 # +1
а что 2 регистра используешь, это вообще не считается? :))) Ты тут 2 переменные заводишь вместо одной!
Да ещё и не заботишься о сохранении регистров
Говногость 17.05.2010 19:06 # +2
xaionaro 01.06.2010 23:48 # −1
guest 01.06.2010 23:54 # −3
adli__82 17.08.2010 11:03 # 0
TheHamstertamer 20.03.2011 16:46 # −1
a, b = b, a