![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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.  |