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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

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

Message 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 +
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Astucieux !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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)

nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Bien vu! :)
Répondre