Page 1 sur 2
Question sur l'assembleur
Publié : dim. 19/sept./2004 9:44
par nico
Voilà, une petite question qui me martèle l'esprit, que signifie la différence d'écriture entre ces deux exemples de codes assembleur sachant que le résultat est le même!!???

Re: Question sur l'assembleur
Publié : dim. 19/sept./2004 10:44
par Anonyme2
nico a écrit :Voilà, une petite question qui me martèle l'esprit, que signifie la différence d'écriture entre ces deux exemples de codes assembleur sachant que le résultat est le même!!???

Salut Nico
si l'on met le point d'exclamation devant une ligne de code asm, purebasic ne va pas l'interpreter et le fichier assembleur final contiendra la ligne telle qu'elle a été écrite.
Ton exemple
sera donc mis texto dans le fichier asm final. Evidement, la variable long aura du être déclarée comme globale de type long avec la synthaxe pb avant le code asm
dans l'exemple
Purebasic va interpreter la ligne
on utilise cette synthaxe lorsque la variable est locale, car on ne connait pas le déplacement par rapport à esp qui est le pointeur de pile qui sera utilisé pour calculer l'adresse ou est stockée la variable locale. Pure utilise les variables locales par défaut dans les procédure sauf si on les déclare globales, il deviendrait laborieux de calculer le déplacement par rapport à esp pour pouvoir écrire la ligne asm correspondante, donc pb le fait à notre place. Celà fonctionne aussi pour les variables globales.
Il faut bien entendu avoir déclaré le type de variable avant les lignes asm.
Donc pour résumer, ces 2 types d'écritures sont différentes et si elle donnent le même résultat, c'est que la variable long est dans les deux cas une variable globale.
Si je dis plusieurs fois la même chose c'est pour que les nouveaux comprennent bien.
Publié : mer. 22/sept./2004 22:45
par nico
Effectivement, dans l'exemple la variable est global.
J'apprécie beaucoup ton aide Denis, super les explications!
PS:désolé pour les remerciements tardifs!

Publié : jeu. 23/sept./2004 6:39
par Anonyme2
Publié : ven. 24/sept./2004 16:01
par nico
Voici l'exemple complet qui vient du Forum Anglais:
Code : Tout sélectionner
Global long.l
Procedure testme(a,b,c,d)
Debug a
Debug b
Debug c
Debug d
Debug "------------"
MOV eax,dword[esp] ; this is variable a
MOV long,eax
Debug long
MOV eax,dword[esp+4] ; this is variable b
MOV long,eax
Debug long
MOV eax,dword[esp+8] ; this is variable c
MOV long,eax
Debug long
MOV eax,dword[esp+12] ; this is variable d
MOV long,eax
Debug long
Debug "------------"
!MOV eax,dword[esp] ; this is variable a
!MOV dword[v_long],eax
Debug long
!MOV eax,dword[esp+4]
!MOV dword[v_long],eax
Debug long
!MOV eax,dword[esp+8] ; this is variable c
!MOV dword[v_long],eax
Debug long
!MOV eax,dword[esp+12] ; this is variable d
!MOV dword[v_long],eax
Debug long
EndProcedure
result=testme(1,2,3,4)
Je trouve ce code très intéressant car il nous montre comment récupérer les valeurs des arguments passées à la fonction avec les pointeurs de pile.
La question que je me pose, c'est que puisque l'on peut récupérer directement les valeurs avec les variables a,b,c,d, ici il ne sert donc à rien, ce genre de code peut-il servir à autre chose.

Publié : ven. 24/sept./2004 16:08
par Anonyme2
Tu as essayé de compiler le code ?
Publié : ven. 24/sept./2004 16:11
par nico
De le compiler, tu veux dire de regarder le résultat du code assembleur?
J'imagine que ça devrait donner justement le code cité plus haut!

Publié : ven. 24/sept./2004 16:14
par Anonyme2
On ne peut pas dire qu'il ne sert à rien.
Celà permet de comprendre comment récupérer les valeurs passées en paramètre à la procédure.
deuxième chose (le mnémonique v_long utilisé dans la 2ème partie du code indique que la variable est globale)
Il peut être utile d'utiliser cette notation lorsque l'on utilise plusieurs fois le même nom de variable, par exemple en protected et en global. Car dans ce cas de figure, je ne sais pas ce que donne le compilateur de Fred, faudrait que je fasse des essais pour voir.
Publié : ven. 24/sept./2004 16:15
par Anonyme2
nico a écrit :De le compiler, tu veux dire de regarder le résultat du code assembleur?
J'imagine que ça devrait donner justement le code cité plus haut!

tu compile tel que et tu as une erreur puisque le code fait référence à une variable globale non définie qui est long
Publié : ven. 24/sept./2004 16:41
par nico
Oui, c'est à dire que je l'avais modifié pour voir ce que ça donnait, je m'en suis aperçu et je l'ai remis tel que son auteur l'a présenté mais je vois qu'entre temps, tu es passé par là!

Publié : ven. 24/sept./2004 16:53
par nico
Si tu as des petits exemples Denis qui permettent d'étudier les bases, je suis preneur. Mais bon, depuis le temps, tu as du tout supprimer

Publié : ven. 24/sept./2004 17:30
par Anonyme2
Tu voudrais quoi ? faire une petite librairie en asm, quelque chose de simple ?
Mis à part une bonne centaine de fichiers asm qui constituent mes lib, j'ai pas vraiment d'exemples simples, il y a quelques sites sur l'asm, mais bon, faut s'accrocher.
Si je peux expliquer, je le ferais, mais je suis comme tout le monde, j'ai mes limites.
Publié : ven. 24/sept./2004 17:42
par nico
Ce qui m'intéresse, c'est de comprendre la syntaxe (pas les commandes l'assembleur), comme par exemple "le mnémonique v_long" que tu m'as expliqué, parce que si on comprends pas ça, on risque pas d'aller loin.

Publié : ven. 24/sept./2004 18:15
par Anonyme2
Ok,
faut juste commencer par le début.
Je vais essayer de faire dans les jours et semaines qui viennent, des petits tuts sur quelques points en asm comme tu viens de dire.
Au verra au fur et à mesure.
si y a une bonne âme qui veut en faire, pas de problème, au contraire.
Par contre, pour ce qui est des librairies en asm, il faut impérativement lire la doc (en anglais

de pure sur les librairies)
Publié : ven. 24/sept./2004 18:25
par nico