IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Opérations à l'aide de la pile


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Opérations à l'aide de la pile
    voila je suis pas un pro de l'assembleur du tout et je voulais savoir quelles operations ( je parle d'addition multiplication ... ) on peut effectuer a l'aide de la pile et de quelle maniere, cad par exemple est ce qu'on peut mettre 2 elements sur le haut de la pile et à laide d'une commande particuliere les additionner, sans passer par les registres et add ou mul

  2. #2
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Eh bien désolé de te décevoir mais les seules façon de multiplier un nombre avec un autre (avec l'integer unit) sont mul et imul, qui se servent forcément d'au moins un registre pour fonctionner, puisqu'on ne peut pas éxecuter une instruction avec plusieurs opérandes mémoires...

    Enfin, je t'ai menti, il y a une autre façon de faire une multiplication : tu fais une boucle avec des add
    Non je plaisante...


    Salut !

    Blustuff : Je suis arrivé le premier !
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Pour le x86, toutes les opérations arithmétiques passent par au moins un registre. Donc, l'une des opérandes doit être sortie de la pile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pop eax
    add [esp], eax
    Le FPU utilise quant à lui un système de pile, mais interne au processeur.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    a uééé blustuff c pas mal du tout, et si je fais add eax,[esp] le resultat sera bien dans la pile hein ?
    et merci a tout les 2 !!

  5. #5
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Raté ! :o
    Quand tu fais un opération, le résultat sera placé dans la destination parmi les opérandes de l'instruction (c'est presque toujours la première opérande d'une instruction, la seconde étant la source)
    Dans ce cas (add eax, [esp]), eax est la destination, le résultat sera donc placé dans eax.
    Mais il y a une façon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pop    eax
    add    eax, [esp]
    push   eax
    C'est un exemple justement pour additionner deux nombres sur la pile entre eux :
    - celui à [esp] avant le début de l'opération
    +
    - celui à [esp+4] avant le début de l'opération
    Et en stockant le résultat à [esp] avant le début de l'opération...

    De cette façon le résulat finit sur la pile, mais pour l'opération elle-même, il est impossible d'utiliser plus d'une opérande mémoire, il faut donc faire des "transferts".
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  6. #6
    Membre habitué Avatar de Nico*3-3
    Inscrit en
    Octobre 2004
    Messages
    164
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 164
    Points : 145
    Points
    145
    Par défaut
    Pourquoi vouloir s'embêter à additionner des valeurs sur la pile alors qu'on peut les avoir à un autre endroit ?
    Tout a une fin, sauf l'infini...
    Projet SKAN : Développement commun d'OS

    Nico*3-3

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    ben en fait c packe je suis en train de coder un evalueteur d'expression mathematique , et dans la cadre de l'ecriture postfixe, ca m'aurait arrangé de pouvoir effectuer des operations comme ca : on pousse les 2 operandes et en dernier l'operateur et on evalue , mais bon je vais essayer de faire ca moi meme

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    j'ai une autre question, peut on, comment dire changer le code du prgm compilé ?
    cad je m'explique : dans mon cas je veux effecteuer une operation sur 2 operandes, alors je pensais qu'au lieu de traiter chaque cas differement, traiter le tout dans une meme fonction cad une fonction qui devrait ressembler a ca :

    en entrée tout sur la pile dans cet odre : operande1, operande2, code_de_l'operation

    pop [adresse de la comande a changer]
    pop eax
    commande dont on connait l'adresse ds le prg et qu'on peut changer [esp],eax
    ret

  9. #9
    sdx
    sdx est déconnecté
    Membre régulier Avatar de sdx
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 106
    Points : 90
    Points
    90
    Par défaut
    Oui, tu peut modifier le code éxecutable de ton prgm pendant l'execution, mais c'est plutôt déconseillé !! y a rien de mieux pour tout faire planter !!

    si tu y tient vraiment, il suffit de modifier ce qui se trouve dans [CS:etiquette], avec etiquette n'importe quelle étiquette dans ton source.

    mais il doit surement y avoir mieux que ça ... par exemple, passe une adresse de fonction à apeller au lieu d'un code d'operation. Tu pousse l'adresse (offset) d'une procédure qui fait ton addition, ta soustraction ... comme ça, ton code est léger et les fonction de calcul peuvent facilement prendre en charge les dépassement de capacité sans alourdir le code

    je sais pas si je suis très clair quand je parle, mais qq d'autre peut sûrement proposer une autres technique

    sdx

    PS:

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    ca se tient, et ca me parait bien moins contraingant, merci pour le tuyau sdx

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Il faut définitibement écarter la possibilité du Self-Modifying Code. Cette solution a d'ailleurs beaucoup de chances d'échouer : Si vous modifiez une partie de code qui a déjà été chargée dans le cache de code du processeur, cela ne fonctionnera pas. Et dans votre première solution, il y a énormément de chances que ce soit le cas.

    La solution de SDX est la bonne. Il est par contre peut être plus efficace de procéder par sauts et non par appels de fonctions, mais je n'en suis pas sûr. Peut être faudrait il tester.

Discussions similaires

  1. Réponses: 8
    Dernier message: 29/03/2014, 23h27
  2. Réponses: 1
    Dernier message: 06/01/2009, 09h14
  3. Besoin d'aide pile Cmos
    Par mazoun51 dans le forum Composants
    Réponses: 10
    Dernier message: 11/09/2008, 03h32
  4. Réponses: 4
    Dernier message: 28/07/2005, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo