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 :

[Débutant] Additionner 2 variables et afficher le résultat ?


Sujet :

Assembleur

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut [Débutant] Additionner 2 variables et afficher le résultat ?
    Bonjour,

    comment faire pour additionner le contenu de deux variables ?
    j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov ax,var1 ;var1 et var2 sont deux db
    mov bx,var2
    add ax,bx
    mais ca compile pas, idem pour
    merci pour vos reponses
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    1ère partie :
    Citation Envoyé par sorry60
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov ax,var1 ;var1 et var2 sont deux db
    mov bx,var2
    add ax,bx
    var1 et var2 sont des variables 8 bits et ax et bx des registres 16 bits : l'assembleur doit au moins générer un warning.
    Tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xor ax,ax
    mov al,var1
    xor bx,bx
    mov bl,var2
    add ax,bx
    2ème partie :
    Citation Envoyé par sorry60
    mais ca compile pas pour
    Au moins 1 des 2 opérandes doit être un registre ou au moins l'adresse d'1 des 2 opérandes doit être contenue dans un registre.
    Le code suivant fonctionnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov al,var1
    add al,var2
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    sorry60 a écrit:
    Code:
    mov ax,var1 ;var1 et var2 sont deux db
    mov bx,var2
    add ax,bx

    var1 et var2 sont des variables 8 bits et ax et bx des registres 16 bits : l'assembleur doit au moins générer un warning.
    ca ne compile pas du tout

    merci pour tes explications, je pense pouvoir m'en sortir maintenant un peu mieux maintenant !
    a+
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    je suis vraiment un boulet en assembleur maintenant que j'additionne correctement (je pense) mes deux variables, impossible d'afficher le résultat
    je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ;addition
    xor ax,ax
    mov al,var1
    add al,var2 ;al contient le resultat
    mov result,al
    ;affichage resultat
    mov dx,offset result
    mov ah,09h
    int 21h
    mais ca ne m'affiche pas le resultat
    c'est normal de faire autant le boulet au début ?

    encore merci pour votre aide
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    xor ax,ax 
    mov al,var1 
    add al,var2 ;al contient le resultat 
    mov result,al
    C'est correct, à condition que var1 et var2 soient des variables de 8 bits et que result soit également une variable de 8 bits. Montre nous leur déclaration, ça devrait ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    .DATA
       VAR1    DB ?
       VAR2    DB ?
       RESULT  DB ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ;affichage resultat 
    mov dx,offset result 
    mov ah,09h 
    int 21h
    La fonction 09h/int 21h te permet d'afficher une chaine de caractères contenue dans un buffer, la variable result est-elle déclarée comme telle ?

    mais ca ne m'affiche pas le resultat
    Ca n'affiche pas le résultat ou ça affiche un mauvais résultat ? Tu veux afficher le résultat dans ta variable via le debugger ou sur la sortie écran ? Dans le second cas, il faut gérer toi-même la conversion hexa->ascii. Tu trouveras cette procédure ici : http://didier2604.free.fr/prog/asm8086/asm8086.html

    Bon codage,
    Did2604.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 27
    Points : 29
    Points
    29
    Par défaut
    Ce ne serais pas plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    mov al, var1 
    mov bl, var2 
    add al, bl
     
    mov result, al
     
    mov ah, 2
    mov dl, result
    int 33
    ou c'est moi qui est dans le champs ?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ce ne serais pas plus simple :
    mov al, var1
    mov bl, var2
    add al, bl
    Non. Tu fais un accès à deux registres, alors que dans son exemple, il n'en utilise qu'un pour additionner ses variables.

    mov ah, 2
    mov dl, result
    int 33
    Je ne vois pas l'existence d'une telle fonction dans l'interruption 33H ? De plus, la 33H est utilisée pour tout ce qui est souris si mes souvenirs sont bons...

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    me revoici, désolé j'ai en effet oublié de vous montrer les déclarations des variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var1 db 11,?,10 DUP('$'),? ; nom db taillemaxi+1,taille,saisie de l'utilisateur,\n
    var2 db 11,?,10 DUP('$'),?
    result db 11,?,10 DUP('$'),?
    Voila, je fais tester ce que vous m'avez indiqué
    Merci pour votre aide
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ca n'affiche pas le résultat ou ça affiche un mauvais résultat ? Tu veux afficher le résultat dans ta variable via le debugger ou sur la sortie écran ?
    ca affiche des caractères spéciaux, en tout cas pas le résultat de l'addition, j'aimerais l'afficher sur l'ecran
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Dans le second cas, il faut gérer toi-même la conversion hexa->ascii
    ce n'est pas ce que réalise l'instruction :
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Je n'ai jamais eu l'occasion d'utiliser l'instruction "AAA" (Ascii Adjust for Addition), je sais juste qu'elle corrige le résultat d'une addition de deux nombres BCD, donc je ne pense pas que cela transforme de l'hexadécimal en ASCII...

    En assembleur, tu n'as pas le choix, lorsque tu veux afficher le contenu d'un registre à l'écran, tu es obligé de devoir transformer toi même ton nombre en ASCII, il n'y a pas de fonction qui fait directement la transformation. Contrairement au langage C par exemple et son instruction printf() qui fait directement la conversion.

    Il est donc tout à fait normal que cela ne t'affiche pas le bon résultat à l'écran.

    Bon codage,
    Did2604.

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    ok, je vais essayer de comprendre la fonction que tu as écrite, et ensuite l'incorporer à mon code.

    merci pour ton aide
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 27
    Points : 29
    Points
    29
    Par défaut
    J'ai revérifié, et ce que j'avais écrit fonctionne parfaitement si on compile avec MASM 5.1.

    Pour information à Did2604 : La fonction 2 de l'interruption 33 (pas 33h) est une fonction interne du BIOS (int 33 appel les fonction du BIOS) qui permet d'écrire un caractère à l'écran.

  14. #14
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Arthaniel
    J'ai revérifier, et ce que j'avais écrit fonctionne parfaitement si on compile avec MASM 5.1.

    Pour information à Did2604 : La fonction 2 de l'interruption 33 (pas 33h) est une fonction interne du BIOS (int 33 appel les fonction du BIOS) qui permet d'écrire un caractère à l'écran.
    Dès que je le peux, j'essaye ça avec Tasm, merci
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  15. #15
    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
    Je n'ai pas suivi toute la conversation, mais :
    La fonction 2 de l'interruption 33 (pas 33h) est une fonction interne du BIOS (int 33 appel les fonction du BIOS) qui permet d'écrire un caractère à l'écran.
    33 = 21h, donc c'est une interruption du DOS, mais en effet, elle permet d'afficher un caractère à l'écran.

    Sinon, l'int 33h c'est les interruption du pilote de la souris sous DOS ...

    salut !

  16. #16
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Arthaniel
    J'ai revérifié, et ce que j'avais écrit fonctionne parfaitement si on compile avec MASM 5.1.
    Je viens d'essayer (avec Tasm) : si je saisie 4 dans var1, puis 3 dans var2 ça m'affiche un tiret comme résultat
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  17. #17
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Comment convertis-tu le résultat en chaîne de caractères ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  18. #18
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Comment convertis-tu le résultat en chaîne de caractères ?
    je ne le convertis pas
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Citation Envoyé par sorry60
    Comment convertis-tu le résultat en chaîne de caractères ?
    je ne le convertis pas
    Je t'ai pourtant précisé dans un de mes derniers messages qu'il fallait réaliser cette conversion...

  20. #20
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Je t'ai pourtant précisé dans un de mes derniers messages qu'il fallait réaliser cette conversion...
    Oui je sais bien mais j'ai lu ta fonction et je n'ai pas encore le niveau pour la comprendre. Et ce qui me plait en asm c'est qu'on utilise pas de fonctions préfaites.
    Donc ça m'embetait de copier coller dans mon code ta fonction sans y comprendre 2 mots...

    Dès que j'ai un peu progressé, je commencerai mon apprentissage de ces conversions.

    Dites moi si je me trompe mais ça n'a pas beaucoup d'interet de programmer en assembleur l'affichage d'une addition non ? autant prendre un langage haut niveau pour ça, non ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

Discussions similaires

  1. Réponses: 23
    Dernier message: 17/04/2008, 21h36
  2. Afficher un résultat sans appuyer sur la touche (Variable Php -> HTML -> Javascript)
    Par nafix dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 17/01/2008, 21h34
  3. Réponses: 5
    Dernier message: 25/05/2007, 10h59
  4. Réponses: 5
    Dernier message: 28/03/2007, 23h29
  5. [MySQL] Compter une variable et afficher le résultats
    Par Babache42 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/02/2007, 18h04

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