Question sur l'assembleur

Sujets variés concernant le développement en PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Question sur l'assembleur

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

Code : Tout sélectionner

  MOV eax,dword[esp] 
  MOV long,eax

Code : Tout sélectionner

  !MOV eax,dword[esp] 
  !MOV dword[v_long],eax 

:idea:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Question sur l'assembleur

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

Code : Tout sélectionner

  MOV eax,dword[esp] 
  MOV long,eax

Code : Tout sélectionner

  !MOV eax,dword[esp] 
  !MOV dword[v_long],eax 

:idea:
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

Code : Tout sélectionner

!MOV eax,dword[esp] 
!MOV dword[v_long],eax 
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

Code : Tout sélectionner

global long.l

dans l'exemple

Code : Tout sélectionner

MOV eax,dword[esp] 
  MOV long,eax
Purebasic va interpreter la ligne

Code : Tout sélectionner

MOV long,eax
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.
Dernière modification par Anonyme2 le ven. 24/sept./2004 7:00, modifié 1 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Effectivement, dans l'exemple la variable est global.

J'apprécie beaucoup ton aide Denis, super les explications! :D


PS:désolé pour les remerciements tardifs!

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

:wink:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu as essayé de compiler le code ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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!

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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à!

:)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 :lol:

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 :roll: de pure sur les librairies)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ce serait super, et ça fera toujours un tut en plus pour tous ceux que ça interessera.


:D :D :D
Répondre