Si "quinquin" pouvait expliquer a KCC un code ...

Pour discuter de l'assembleur
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Bonjour les ASMEURS

Je suis désolé de vous déranger, mais c'est pour KCC un besoin vital, enfin presque car KCC il mange toujours rassurez vous :oops:

Voila, je ne sais pas si vous l'avez lu, mais je cherche depuis plus d'un mois une methode pour passer des tabeaux de strings entre VB/PB et une DLL
Apres des dizaines de posts, de nombreuses aides que je remercie encore 8)
J'ai pu arriver a une solution qui apparement marche. :D
Mais elle est tres lourde :(

Donc, comme cette fonction va etre a la base de dizaine de mes programmes, je voudrais etre sur de choisir la bonne, et si il n'y a pas beaucoup plus simple.

Alors voila, au milieu des aides, j'ai demandé si l'ASM ne pouvait pas faire quelque chose pour moi a FRED, sur la gestion des tableaux
Et XOMBIE m'a gentillement fait ce code

Il est beau, court comme tous les codes ASM, et puissant
XOMBIE a pourtant tenté de me l'expliquer, mais j'ai pas tout compris.
Il a pourtant pris la peine de commenter chaque ligne ou presque, mais parler de pile a KCC, ça lui parle autant , que si on lui donne un cours sur le langeage des bébés :oops:
Et en plus, il faut dire aussi que l'ASM est bien assez compliqué comme ça pour ne pas y rajouter l'anglais :roll:

Donc, si un de vous pourrait, avoir la gentillesse de m'expliquer "simplement" si c'est possible, ce que fait ce code.
Surtout dans un premier temps la demarche, en une phrase, pour voir si il serait exploitable dans ce que je cherche a faire...
Car ce n'est pas la peine d'entrer dans les details et vous faire perdre votre precieux temps, si il ne m'est pas utile :oops:

Code : Tout sélectionner

; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

! extrn _SYS_ReAllocateArray@8 
; PB calls this to REDIM an array.
ProcedureDLL.l CreateArray(Array a.s(1), Lettre$) 
   ; Pass the array as the first parameter - the array must have been declared before calling this procedure.
   Define.l xx 
   ; 
   ! PUSH dword [p.a_a] 
   ; Put the address of the array on the stack.  Use p.a_ for arrays, p.v_ for variables and p.l_ for linked lists.
   ! MOV Eax, 5 
   ;  Put the number of items you want to REDIM the array to.  This would be 5 items, 0 to 4.
   ! PUSH Eax 
   ; Push the value of Eax onto the stack.
   ! CALL _SYS_ReAllocateArray@8 
   ; Call the ReAllocateArray function with the value of Eax (5) and the address of the array as parameters.  Note the @8 as the two parameters are both long values.  It's like calling ReAllocateArray(ArrayA(), 5) only in ASM.
   ; 
   For x = 1 To 5 
      a(x - 1) = RSet("", x, Lettre$) 
   Next 
   ;
EndProcedure

Dim ArrayA.s(10) 
Debug ArraySize(ArrayA()) 
CreateArray(ArrayA(), "a") 
Debug ArraySize(ArrayA()) 

Dim ArrayB.s(0)  
CreateArray(ArrayB(), "b") 

For i = 0 To ArraySize(ArrayA()) 
 Debug "Premier essai = " + ArrayA(i) 
Next 
  
For i = 0 To ArraySize(ArrayB()) 
 Debug "Second essai = " + ArrayB(i) 
Next i

Merci de votre aide et comprehension
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par flaith »

Pour commencer sur les piles, et pour faire simple, la pile c'est donc de l'empilement.
prenons des assiettes par exemple :
Tu prend une assiette ou est inscrit un chiffre, puis tu prend une autre assiette que tu empile ("push") sur la précédente, etc....
tu as donc une "pile" d'assiette, pour connaitre les chiffres marqués dessus, simple il faut enlever chaque assiette donc on dépile (commende "pop" en assembleur)
On parle de méthode LIFO (Last In First Out : dernier entrée, premier sorti)
La c'est la première démarche ... si cela t'a aider, tant mieux :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Merci beaucoup FLAITH de prendre de ton temps pour elever un petit peu mon niveau. 8)

Tu devais t'en douter...si tu repond a KCC c'est un peu comme marcher dedans...., tu te le traine un petit moment, car il a toujours quelque chose à dire, et encore pire toujours une question qui en appelle une autre :?

1/ Quelqu'un m'avais déjà parlé un tout petit peu de FIFO et LIFO
Ces methodes comme tu dis, on peut les utiliser "a ma guise" comme dirait jean rochefort
Ou bien elle sont fixées par le type de processeur, le type d'ASM.
Ce que je veux dire c'est peut on utiliser la methode FIFO, puis juste apres la LIFO dans le meme code ???? :roll:

2/ Est ce que ce qu'a fait ZOMBIE te cause ???
En quelques mots, qu'est ce qu'il demande de faire au processeur ???
Sans rentrer dans les termes techniques...

Pour obtenir ce code qu'il a fait pour moi, je demandais de pouvoir utiliser plusieurs fois le meme tableau.
Donc je suppose qu'il a trifouillé dans les tables d'allocations ???
Est ce bien ça ???? Est ce fiable ????
Que fait ce code en fait ????
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Anonyme2 »

KCC, regardes simplement les 4 lignes de codes après le endprocedure, et regardes les valeurs des debug, tu verras que la taille du tableau ArrayA() a changé (ArraySize renvoie la taille du tableau), c'est ce que fait la partie asm du code en donnant la taille ArraySize() à 4 soit 5 éléments, de 0 à 4.

Code : Tout sélectionner

Dim ArrayA.s(10)  
Debug ArraySize(ArrayA())  
CreateArray(ArrayA(), "a")  
Debug ArraySize(ArrayA())  
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par flaith »

ce code se comporte comme un redim mais "forcé" à 5 valeurs :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Merci mes amis, je vais essayer de comprendre 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par flaith »

Le code de xombie avec explication en français :

Code : Tout sélectionner

; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

; Appel à la procédure de redimensionnement d'un tableau.
! extrn _SYS_ReAllocateArray@8 

ProcedureDLL.l CreateArray(Array a.s(1), Lettre$) 
  ; Le tableau est placé en 1er paramètre
  ; Bien entendu le tableau a déjà été déclaré avant d'appeler cette procedure.
  Define.l x

  ; on empile l'adresse du tableau : l'assiette contient un chiffre indiquant l'adresse mémoire du tableau ;)
  ; p.a_     : indique que c'est un tableau
  ; p.v_     : c'est une variable
  ; p.l_     : une liste chainée
  ! PUSH dword [p.a_a]

  ; On veut redimensionner la taille à 5
  ; EAX (Accumulateur : registre assembleur 32bits
  ; EAX = 5
  ! MOV Eax, 5 

  ; On rajoute une assiette sur la pile contenant le chiffre 5
  ! PUSH Eax 

  ; on appelle la procédure qui va redimensionner le tableau
  ; le @8 dans la procédure indique qu'il a besoin de 2 paramètres (ici 2 variables de type long (32bits) : l'adresse du tableau "a" et le chiffre "5")
  ; C'est cette procédure qui va "dépiler/récupérer" les 2 valeurs envoyées
  ! CALL _SYS_ReAllocateArray@8

  ; on affecte la valeur 'Lettre$' a chaque élément du tableau
  For x = 0 To 4                  ; donc 5 elements
    a(x) = RSet("", x, Lettre$)   ; pas la peine d'expliquer ce que fait Rset
  Next 

EndProcedure

; on déclare le tableau
Dim ArrayA.s(10)
; affiche sa taille
Debug ArraySize(ArrayA())         ;ici il affiche 10 (soit 11 valeurs en tout : 0 à 10)

; on redimensionne le tableau avec comme valeur "a"
CreateArray(ArrayA(), "a") 
; affiche sa taille
Debug ArraySize(ArrayA())         ;il affiche maintenant 4 (5 valeurs car 0 à 4)

; on déclare un autre tableau
Dim ArrayB.s(0)                   ; 1 valeur
CreateArray(ArrayB(), "b")        ; passe à 5

For i = 0 To ArraySize(ArrayA()) 
Debug "Premier essai = " + ArrayA(i) 
Next 
	
For i = 0 To ArraySize(ArrayB()) 
Debug "Second essai = " + ArrayB(i) 
Next i
:mrgreen:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Merci beaucoup FLAITH de t'etre donné la peine de me traduire ce code 8)
Quand c'est en français, c'est comme a la maison, ça parle que de chose qu'on a dans nos placards.
Les piles, les assiettes :D

Toutes plaisanteries mise a part, c'est sur que expliqué comme ça, ce language "doberman" dont seul les initiés arrivent a dompter, et que tous programmeur redoute, parait un petit plus "yorshire" quand on le lis. :wink:

C'est tellement beau de pouvoir parler au proce sans passer par un interprete 8)

L'utilité que j'en avais etait de pouvoir modifier la taille d'un tableau se trouvant dans une DLL
Mais maintenant à la lumiere de vos explications et des essais que j'ai fait, je pense que ASM ou non, chaque processus a sa propre table d'allocation, et il est tres difficile, dangereux, voir impossible de par exemple, tenter de modifier le dimensionnage d'un tableau provenant d'un EXE, dans une DLL :roll:

D'ailleur j'ai essayé de séparer les deux parties et ça ne marche pas.
Maintenant je sais pourquoi....chacun chez soi et les bits seront bien gardés :?

Code de l'exe

Code : Tout sélectionner

If OpenLibrary(0, "PureBasic.dll")
 
 Retour = CallFunction(0, "MaFonction", Parametre1, Parametre2)
 
 
 ; on déclare le tableau
 Dim ArrayA.s(10)
 ; affiche sa taille
 Debug ArraySize(ArrayA())         ;ici il affiche 10 (soit 11 valeurs en tout : 0 à 10)
 
 ; on redimensionne le tableau avec comme valeur "a"
 CallFunction(0, "CreateArray" ,ArrayA(), "a") 
 ; affiche sa taille
 Debug ArraySize(ArrayA())         ;il affiche maintenant 4 (5 valeurs car 0 à 4)
 
 ; on déclare un autre tableau
 Dim ArrayB.s(0)                   ; 1 valeur
 CallFunction(0, "CreateArray" ,ArrayB(), "b") ; passe à 5
 
 For i = 0 To ArraySize(ArrayA()) 
 Debug "Premier essai = " + ArrayA(i) 
 Next 
 
 CloseLibrary(0)
 
EndIf 
Code de la DLL

Code : Tout sélectionner

; http://www.purebasic.fr/english/viewtopic.php?p=294524#p294524

; Appel à la procédure de redimensionnement d'un tableau.
! extrn _SYS_ReAllocateArray@8 

ProcedureDLL.l CreateArray(Array a.s(1), Lettre$) 
  ; Le tableau est placé en 1er paramètre
  ; Bien entendu le tableau a déjà été déclaré avant d'appeler cette procedure.
  Define.l x

  ; on empile l'adresse du tableau : l'assiette contient un chiffre indiquant l'adresse mémoire du tableau ;)
  ; p.a_     : indique que c'est un tableau
  ; p.v_     : c'est une variable
  ; p.l_     : une liste chainée
  ! PUSH dword [p.a_a]

  ; On veut redimensionner la taille à 5
  ; EAX (Accumulateur : registre assembleur 32bits
  ; EAX = 5
  ! MOV Eax, 5 

  ; On rajoute une assiette sur la pile contenant le chiffre 5
  ! PUSH Eax 

  ; on appelle la procédure qui va redimensionner le tableau
  ; le @8 dans la procédure indique qu'il a besoin de 2 paramètres (ici 2 variables de type long (32bits) : l'adresse du tableau "a" et le chiffre "5")
  ; C'est cette procédure qui va "dépiler/récupérer" les 2 valeurs envoyées
  ! CALL _SYS_ReAllocateArray@8

  ; on affecte la valeur 'Lettre$' a chaque élément du tableau
  For x = 0 To 4                  ; donc 5 elements
    a(x) = RSet("", x, Lettre$)   ; pas la peine d'expliquer ce que fait Rset
  Next 

EndProcedure
Encore merci de ce petit voyage dans le monde du language que j'admire le plus 8)
C'est quand meme une super idée de FRED d'avoir donné cette possibilité.

Sauf peut etre pour vous....car y'a toujours un KCC pour troubler votre quietude :oops:
On peut meme pas etre tranquille dans cette rubrique :? :lol:

Encore merci de votre gentillesse 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par djes »

Tu avais cherché du côté des FileMapping? En cherchant un peu (recherche sur le mot CreateFileMapping dans les forums et sur google), j'ai trouvé ça pour VB :
http://www.simpits.org/programming/data ... aring.html
et les docs officielles http://msdn.microsoft.com/en-us/library ... 85%29.aspx (pour les dll), et http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Merci beaucoup DJES

J'avais un peu regardé aussi de ce coté, mais par contre je n'avais pas trouvé ce lien.
Puis SROD m'a dit que c'etait pas la peine de ressencer toutes les methodes possibles, il fallait que je m'en tienne a une et essayer de la finir.
J'ai donc arretter de chercher d'autres methodes.

J'ai fini a force d'en baver a faire marcher mon passage de tableau, mais comme tu l'as vue...enfin je sais pas...c'est un peu l'usine a gaz :oops:

J'essaye de voir un dernier coup si je peux pas trouver un peu plus simple.
Peut etre suis-je passé a coté de quelque chose ????

Si je trouve pas mieux...je garderais mon usine :D

Merci pour les liens je vais regarder

Pendant que "je te tiens" ....a ton avis l'API Copymemory...elle deplace les pointeurs ou bien elle fait une copie ???
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par flaith »

Kwai chang caine a écrit :....a ton avis l'API Copymemory...elle deplace les pointeurs ou bien elle fait une copie ???
C'est une question rhétorique ? :mrgreen:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par djes »

De quoi il parle? :lol:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Attend FLAITH t'utilise des mots que je comprend pas le titre
J'ai demandé a mon pote WIKI
Une question rhétorique (ou question oratoire) est une figure de style qui consiste à poser une question n'attendant pas de réponse
Bah non, KCC il attend une reponse :D
J'avais cru comprendre que la fonction native de PB "CopyMemory" elle deplacait les pointeurs :roll:

Car dans l'aide PB
Contrairement à CopyMemory(), les zones mémoires source et destination peuvent se chevaucher. Néanmoins, MoveMemory() est plus lent que CopyMemory(), donc il est préférable de l'utiliser que si c'est justifié.
FRED dit que c'est les memes fonctions, mais en plus lent
Hors ce qui se deplace, n'est pas ce qui se copie ....enfin pour moi...je connais pas rhetorique ..mais deplacer et copier...je connais la difference :mrgreen:

Car j'essaye de lire dans VB la memoire que PB il a ecris dedans :roll:

Y'a l'API CopyMemory mais je voulais etre sur de ne pas toucher aux pointeurs qui sont en place, car c'est ceux de mon tableau de DLL, et ça KCC il a apris par SROD que c'est pas bien de les toucher.
Alors il les touche plus...promis :oops:

Mais il voudrait juste les toucher avec les yeux....donc il essaye cette API parce VB, n'est pas trop un caid des PEEK :?
Et dans les forums VB y'en a un qu'a créé une pseudo PEEK comme ça....et je voulais etre sur que je ne fais que lire et non deplacer quoi qu ce soit :D

Code : Tout sélectionner

Public Function Peek(Address As Long) As Long
 Call CopyMemory(Peek, ByVal Address, Len(Address))
End Function

Public Function PeekByte(Address As Long) As Byte
 Call CopyMemoryByte(PeekByte, ByVal Address, Len(PeekByte))
End Function
djes a écrit :De quoi il parle? :lol:
A force de lire des peeks, des pokes.....ça commence a me rendre triste comme un jour de pluie :(
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par djes »

Et si tu faisais l'essai?

Code : Tout sélectionner

src.s = "Hello"
dst.s = "Boy"

calldebugger ;là tu pourrais regarder le contenu mémoire avec "voir les zones mémoire", en mettant @dst, et @dst+10 dans Étendue

RtlMoveMemory_(@dst, @src, 2)

Debug src
Debug dst
Ah au fait, j'ai trouvé ça aussi pour toi : http://www.xtremevbtalk.com/showthread.php?t=248698
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Si "quinquin" pouvait expliquer a KCC un code ...

Message par Kwai chang caine »

Ouaaaooouuhhh !!! mais c'est drolement cool ton lecteur de mémoire 8O
KCC y savait pas que ça existe :oops:

Dans un de mes post, j'ai meme mis c'est dommage que il existe pas un progarmme pour lire la memoire.
Mais DIEU m'avais deja entendu, dans sa grande PBricorde 8)

J'avais vu DOBRO utiliser CallDebugger
J'avais vu que ça s'arrettais dessus.
Alors KCC y s'en servait comme un STOP...et "pis c tout" :D
Comment passer a la 4.40...KCC il en est encore a la 3.94 :(

Oulala !! va me valoir un moment avant de comprendre comment ça marche, mais milles merci DJES de m'avoir montré la voix 8)
KCC il est content...il apprend le debut à la fin...4 ans qui savait pas :oops:

J'ai compris ça existe pas les copy de memoire, ça deplace les pointeurs :cry:
Faut que je trouve quelque chose qui lise en VB, mais pas qui touche....comme des fois pour ma femme .....regarder, mais pas toucher :roll:

Pour le code VB, apparement c'est pour trouver un process par raport au nom d'une fenetre.
Y'a encore quelque chose qu'a du m'echapper, parce que je vois pas trop le raport entre la lecture des process et celle de la memoire :(
Le boulet ...... :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre