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 ?

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
Et en définissant ta structure comme ça, pas besoin de désactiver le débogueur:
Publié : lun. 15/août/2005 20:53
par Dr. Dri
Cool ! Encore plus intéressant avec ton astuce
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

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 ?
Dri
PS. le "p_p" on dirait un smiley

comme le T_T
Publié : mar. 16/août/2005 23:02
par fweil
...,
En fait si tu écris simplement :
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 :
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

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 ???

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
