![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Очень хороший метод нашёлся в просторах Сети:
Код:
var x, y: byte; begin x:=$99; // bin 10011001 y:=$4B; // bin 01001011 x:=x xor y; // 11010010 y:=y xor x; // 10011001 x:=x xor y; // 01001011 end; ![]() |
|
#2
|
||||
|
||||
|
Что-то мне подсказывает, что свапнуть 3 значение в классическом случае нельзя, т.к. неясно какое значение куда свапать.
|
|
#3
|
||||
|
||||
|
А конкретно? 3 переменных: А, B, С, поменять A <-> C, а с переменной B что делать?
Кстати обмен чисел (2 переменных): Код:
var a, b: Integer; begin a := 2; b := 3; a := a+b; b := a-b; // b = 2 a := a-b; // a = 3 ЗЫ решение для паскаля: Код:
WriteLn('Большее число = ', (a+b + abs(a-b))/2:0:0); |
|
#4
|
||||
|
||||
|
я так понимаю, что A -> B, B -> C, C -> A
XCHG рулит))) добавлено позже Код:
var a, b: Integer; begin a := 2; b := 3; a := a+b; b := a-b; // b = 2 a := a-b; // a = 3 ![]() Последний раз редактировалось NumLock, 04.09.2011 в 13:33. |
|
#5
|
||||
|
||||
|
ну, можно и на xchg сделать
![]() Да, именно Цитата:
Код:
x:=x xor y;
y:=y xor x;
x:=x xor y;
z:=z xor y;
y:=y xor z;
z:=z xor y;Код:
xchg ax,bx xchg bx,cx ![]() |
|
#6
|
||||
|
||||
|
Ну, а если быть совсем точным:
Код:
// x <=> y
asm
mov eax,y
xchg x,eax
mov y,eax
end;
// x <= y <= z
asm
mov eax,y
xchg x,eax
xchg z,eax
mov y,eax
end;
// x => y => z
asm
mov eax,y
xchg z,eax
xchg x,eax
mov y,eax
end;Последний раз редактировалось PhoeniX, 04.09.2011 в 13:53. |
|
#7
|
|||
|
|||
|
через стек можно. изменяя очередность пушей и попов.
|
|
#8
|
||||
|
||||
|
Нифига не понел.
Код:
asm
xor eax, eax
xor ecx, ecx
mov eax, $99
mov ecx, $4B
xor eax, ecx
xor ecx, eax
xor eax, ecx
mov x, eax
mov y, ecx
end;Код:
asm
.... зануливание регистров
mov eax, x
mov ecx, y
mov edx, z
mov x, edx
mov y, eax
mov z, eax
end;Последний раз редактировалось M.A.D.M.A.N., 04.09.2011 в 20:05. |
|
#9
|
||||
|
||||
|
У тебя 6 строк в asm, без учёта обнуления регистров. С xchg это 4 строки, как я выше написал.
|
|
#10
|
||||
|
||||
|
Цитата:
![]() К чему вся это фалометрия? |
|
#11
|
||||
|
||||
|
Зачем по 3 раза? Я ж написал полный код...
|
|
#12
|
||||
|
||||
|
Цитата:
|
|
#13
|
||||
|
||||
|
Ну если asm, то можно и так:
Код:
asm
push X
mov eax, Y
mov X, eax
pop Y
end;![]() Последний раз редактировалось angvelem, 05.09.2011 в 02:24. |
|
#14
|
||||
|
||||
|
а стеком то можно сколько угодно переменных "менять местами":
Код:
var
a, b, c, d: Integer;
begin
a:=13;
b:=11;
c:=1973;
d:=$ff;
Edit1.Text:=IntToStr(a);
Edit2.Text:=IntToStr(b);
Edit3.Text:=IntToStr(c);
Edit7.Text:=IntToStr(d);
asm
push a
push b
push c
push d
pop b
pop c
pop d
pop a
end;
Edit4.Text:=IntToStr(a);
Edit5.Text:=IntToStr(b);
Edit6.Text:=IntToStr(c);
Edit8.Text:=IntToStr(d);
end; |
|
#15
|
||||
|
||||
|
Стеком сколько угодно, пока не будет переполнения.
![]() Еще один извращенский вариант: Код:
var
a,b,c,d,...,z:integer;
begin
asm
mov esi, offset z
mov ecx, 25
mov ebx, z
@1:
sub esi, 4
mov eax, [esi]
mov [esi+4], eax
loop @1
mov eax, [esi]
mov a, ebx
end;
end;![]() Хотя обычно компилятор такой ерундой не занимается. Последний раз редактировалось Bargest, 05.09.2011 в 18:32. |