Page 1 sur 1

Réaliser un SWAP entre 2 registres avec un triple XOR en ASM

Publié : ven. 23/déc./2005 5:05
par Lna
Bonjour à toutes et à tous,

Je souhaitai vous faire connaître une astuce en assembleur, qui ne vous sera pas utile en Purebasic avec le jeu d'instructions aussi complet que ceux des pentiums, mais qui ne laisse pas indifférent sur l'astuce employée.

Il est donc possible de permuter le contenu de 2 registres sans l'usage d'un 3 ème registre, par le biais de 3 opérateurs logiques XOR. :wink:

Code : Tout sélectionner

; OPTIONS DE COMPILATION + ACTIVER L'ASSEMBLEUR EN LIGNE

PROCEDURE.L TEST_XOR(a.l,b.l)
  
  MOV EAX,a   ; 14 % 00001110
  MOV EBX,b   ; 59 % 00111011
  
  XOR EAX,EBX ; 53 % 00110101
  XOR EBX,EAX ; 14 % 00001110
  XOR EAX,EBX ; 59 % 00111011

;  MOV EAX,EBX ; 14 % 00001110 : EAX=EBX
  
  PROCEDURERETURN ; RETOURNE LE CONTENU DE EAX
  
ENDPROCEDURE

PROCEDURE.L TEST_XCHG(a.l,b.l)
  
  MOV EAX,a    ; 14 % 00001110
  MOV EBX,b    ; 59 % 00111011
  
  XCHG EAX,EBX ; 59 % 00111011
  
;  MOV EAX,EBX  ; 14 % 00001110 : EAX=EBX
  
  PROCEDURERETURN ; RETOURNE LE CONTENU DE EAX
  
ENDPROCEDURE

DEBUG TEST_XOR(14,59)
DEBUG TEST_XCHG(14,59)
A +

Publié : ven. 23/déc./2005 11:37
par Fred
Astucieux !

Publié : ven. 23/déc./2005 19:03
par Backup
echange du contenu de 2 variables numerique sans l'intervention d'une troisieme :D


a=10
b=20
Debug "a=" + Str (a)
Debug "b=" + Str (b)

a=a+b
b=a-b
a=a-b

Debug "a=" + Str (a)
Debug "b=" + Str (b)


Publié : ven. 23/déc./2005 19:55
par nico
Bien vu! :)