Page 1 sur 1

Rotations de bits

Publié : ven. 26/août/2005 13:34
par Dr. Dri
je sais pas faire plus simple :(

Code : Tout sélectionner

Procedure ROL(Value.l, Offset.l)
  Offset % 32
  If Offset < 0
    Offset + 32
  EndIf
  While Offset > 0
    ROL Value, 1
    Offset - 1
  Wend
  ProcedureReturn Value
EndProcedure

Procedure ROR(Value.l, Offset.l)
  Offset % 32
  If Offset < 0
    Offset + 32
  EndIf
  While Offset > 0
    ROR Value, 1
    Offset - 1
  Wend
  ProcedureReturn Value
EndProcedure

a = $0FF00000
Debug "$"+RSet(Hex(a), 8, "0")
Debug "$"+RSet(Hex(ROR(a, 8)), 8, "0")
Debug "$"+RSet(Hex(ROL(a, 8)), 8, "0")

Debug "---"
Debug "$"+RSet(Hex(ROR(a, 32)), 8, "0")
Dri

Publié : ven. 26/août/2005 14:43
par fweil
Peux-tu essayer ça : ?

Code : Tout sélectionner

Procedure ROL(Value.l, Offset.b)
  !  MOV     eax, dword [esp]
  !  MOV     cl, byte [esp+4]
  !  ROL      eax, cl
  ProcedureReturn
EndProcedure

Procedure ROR(Value.l, Offset.b)
  !  MOV     eax, dword [esp]
  !  MOV     cl, byte [esp+4]
  !  ROR     eax, cl
  ProcedureReturn
EndProcedure
Je pense que c'est correct et optimisé. L'argument 2 doit être une constante (valeur fixe) ou une variable .b

Le registre cl est utilisé et seul autorisé pour ce type de commande.

Publié : ven. 26/août/2005 16:29
par Dr. Dri
ah bah je le connaissais pas ce registre ^^
ca simplifie pas mal les choses c'est sûr

Dri :10: