Page 1 sur 1

Pointeur "tableau" calqué sur le C + exemple Xor

Publié : dim. 07/août/2005 21:58
par Dr. Dri
L'idée c'est de se servir des pointeurs comme en C... C'est à dire pouvoir pointer après l'objet que l'on pointe.

Comment ca c'est pas clair ? :lol:
Un ptit code c'est plus parlant ^^

Code : Tout sélectionner

Structure Bytes
  b.b[1]
EndStructure

chaine.s = "PureBasic"
length.l = Len(chaine)

DisableDebugger

;l'astuce nécessite de désactiver le débuger :(
;sinon il râle comme quoi l'indice est hors limite :P

i = 0
*p.Bytes = @chaine

While i < length
  MessageRequester("Lettre " + Str(i+1), Chr( *p\b[i] ))
  i + 1
Wend

;une variante

; i = 0
; max = 12
; 
; While i < max
;   MessageRequester("Lettre " + Str(i+1), Chr( *p\b[i % length] ))
;   i + 1
; Wend

EnableDebugger
L'avantage c'est qu'on peut conserver un pointeur de référence de cette manière, sans avoir besoin d'une seconde variable...

Dri ;)

Publié : lun. 15/août/2005 20:43
par filperj
Intéressant :D

Et en définissant ta structure comme ça, pas besoin de désactiver le débogueur:

Code : Tout sélectionner

Structure Bytes
  b.b[0]
EndStructure

Publié : lun. 15/août/2005 20:53
par Dr. Dri
Cool ! Encore plus intéressant avec ton astuce :D

Code : Tout sélectionner

Structure Bytes
  b.b[0]
EndStructure

chaine.s = "PureBasic"
length.l = Len(chaine)

i = 0
*p.Bytes = @chaine

While i < length
  Debug Chr( *p\b[i] )
  i + 1
Wend

;une variante

Debug "---"

i = 0
max = 12

While i < max
  Debug Chr( *p\b[i % length] )
  i + 1
Wend
Dri :10:

Publié : mar. 16/août/2005 22:01
par Dräc
Bien vu ! Par contre, je ne saisi pas la traduction en ASM !

La fin du code suivant

Code : Tout sélectionner

Structure Bytes 
  b.b[0] 
EndStructure 

chaine.s = "PureBasic" 
length.l = Len(chaine) 


*p.Bytes = @chaine 

*p\b[1]
*p\b[2]
*p\b[3]

*p\b[8]
produit le code ASM suivant:

Code : Tout sélectionner

; *p.Bytes = @chaine 
MOV    eax,dword [v_chaine]
MOV    dword [p_p],eax
; 
; *p\b[1]
MOV    ebp,dword [p_p]
; *p\b[2]
MOV    ebp,dword [p_p]
; *p\b[3]
MOV    ebp,dword [p_p]
; 
; *p\b[8]
MOV    ebp,dword [p_p]
Je ne vois pas comment est faite la distinction des différentes adresses ?!

Publié : mar. 16/août/2005 22:06
par Dr. Dri
effectivement je ne comprends pas tout... C'est peut être dû au fait que tu n'utilises pas le pointeur en tant qu'instruction... En gros les 4 lignes concernées ne font strictement rien... As-tu essayé en faisant par exemple ceci ?

Code : Tout sélectionner

*p\b[8] = 'A'
Dri

PS. le "p_p" on dirait un smiley :lol: comme le T_T

Publié : mar. 16/août/2005 23:02
par fweil
...,

En fait si tu écris simplement :

Code : Tout sélectionner

*p\b[1]
*p\b[2]
*p\b[3]
*p\b[8]
Le compilateur décide apparement qu'il n'y a rien à en faire et il ne pointe pas l'élément à l'intérieur du tableau.

Si tu fais :

Code : Tout sélectionner

Chr(*p\b[1])
Chr(*p\b[2])
Chr(*p\b[3])
Chr(*p\b[8])
le compilateur prends effectivement l'élément dans le tableau (adresse indicée).

Slts

Publié : mer. 17/août/2005 20:00
par Dräc
C’est ca en effet !
Un *p\b[1] tout seul ne produit rien
Par contre en proposant une affectation par exemple, on force le compilo à expliciter…

En fait, je ne pouvais pas le voir en faisant simplement Debug *p\b[1]

Code : Tout sélectionner

Structure Bytes 
  b.b[0] 
EndStructure 

chaine.s = "PureBasic" 
length.l = Len(chaine) 


*p.Bytes = @chaine 

a = *p\b[1] 
b = *p\b[2] 
c = *p\b[3] 

d = *p\b[8]

Debug Chr(a) 
Debug Chr(b) 
Debug Chr(c) 
Debug Chr(d) 
conduit à cet extrait:

Code : Tout sélectionner

; 
; a = *p\b[1] 
MOV    ebp,dword [p_p]
MOVSX  eax,byte [ebp+1]
PUSH   eax
POP    dword [v_a]

Publié : dim. 21/août/2005 1:25
par LeCyb
Super cool le coup du zéro pasque sans le debug c'est plutôt ennuyant :D

Publié : dim. 21/août/2005 18:13
par Dr. Dri
Voila un exemple concret de ce qu'on peut faire avec... elle est pas super simple la procédure ??? 8)
Du code propre ca aide quand même ^^

Code : Tout sélectionner

Structure Bytes
  b.b[0]
EndStructure

Procedure XorMemory(*Memory.Bytes, MemoryLength.l, *Key.Bytes, KeyLength.l)
  Protected XorMemory.l, i.l, j.l
  
  If *Memory And *Key And MemoryLength > 0 And KeyLength > 0
    
    While i < MemoryLength
      If j = KeyLength : j = 0 : EndIf
      
      *Memory\b[i] ! *Key\b[j]
      
      i + 1
      j + 1
    Wend
    
    XorMemory = #True
  EndIf
  
  ProcedureReturn XorMemory
EndProcedure

;-test de la procedure
chaine.s = "un essai de xor avec mes pointeurs tableaux"
cle.s    = "voici la clé de cryptage"

length = Len(chaine) ;elle risque de changer apres cryptage

Debug chaine

XorMemory(@chaine, length, @cle, Len(cle))

Debug chaine

XorMemory(@chaine, length, @cle, Len(cle))

Debug chaine
Dri ;)