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

x86 16-bits Assembleur Discussion :

Additionner deux nombres lus du clavier en Assembleur 16 bit avec TASM


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut Additionner deux nombres lus du clavier en Assembleur 16 bit avec TASM
    Bonjour tout le monde !

    je débute en Assembleur 16 Bit Avec TASM , je compte écrire un programme qui additionne deux nombres saisis du clavier et afficher le résultat.

    Pour cela, je veux savoir s'il existe dans la fonction interruption DOS (int 21h) ou autre une méthode spécialement pour lire une chaîne de caractère entière. Si oui, où sera sauvegardée cette chaîne ?

    J'ai considéré les deux nombres comme étant des chaînes de caractères. J'ai pensé à faire une boucle (loop) pour lire la chaîne caractère par caractère avec l'interruption qui permet de lire un caractère

    mov ax,16h
    int 21h


    faire de même pour le deuxième nombre voir la deuxième chaîne de caractères convertir, additionner et afficher…

    Bref, mes questions sont :

    — comment je convertis les chaînes de caractères en nombres ?
    — comment additionner les deux nombres puisque ça ne va pas marcher avec le ADD ?

    Où dois-je sauvegarder le résultat et comment je l'affiche ?

    Merci

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    le dos ne sert qu'a attendre une entrée de clavier pour remplir un petit buffer de type chaine (rb n).
    il faut entrer une chaine au clavier du type
    db '100+321+5434',entrée

    et extraire chaque sous chaine de type nombre.
    pour ça, il y a les caractères speciaux qui traiterons autrement l'entrée chaine.

    la touche entrée declenche la conversion en calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cmp [touche],entrée
    jne @f
    call calcul
    @@:
    la fonction calcul parcours la chaine en partant du debut, et s'arrete sur le symbole entrée (db 10,13). tant qu'aucun symbole spécial n'est rencontré, la chaine est convertie en nombre.
    un nombre commence toujours par un chiffre (0 à 9)
    un nombre peut être terminé par une lettre (h, b, o, d) ou par un espace ' ', une tabulation, un symbole special (+, -, *, (, ), {, }, /, >, <, =,...)
    et peut aussi commencer par $, 0x ou # (selon les gouts)
    donc, il faut faire une table de fonctions pour les symboles spéciaux, et une table pour les symboles chiffres, le tout accessible par une LUT dans une fonction de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    mov al,char
    movzx eax,al
    mov eax,[charfunclist+eax*4]
    or eax,eax
    je @f
    call eax
    @@:

    chaque fois qu'un symbole spécial apparait, la fonction exécute une opération speciale, comme additionner, soustraire, multiplier....
    et le résultat final n'a plus qu'a etre converti en chaine de caractères pour être affiché.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Tout d'abord Salut et merci pour votre réponse,
    le programme que je veux, lit en entrée comme donnée deux nombres saisis séparément et non pas une chaines de caractères, c'est à dire il doit me demander la valeur du premier nombre ensuite la valeur du deuxième puis il m'affiche le résultat de l'addition.
    si j'ai dit une chaine de caractères quand j'ai posté mon problème j'ai seulement considérer que ces deux nombres comme étant deux chaines, ou bien y a t-il une fonction qui lit directement un nombre depuis le clavier ?

    Merci

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    il faut ecrire la fonction qui converti une chaine en nombre.

    soit:
    total, le contenu final de la variable entrée au clavier.
    chaine, la suite d'octets ascii representant le nombre
    resultat, le resultat de la convertion de chaque digit
    10, la contante utilisée pour definir la resolution de chaque chiffre.

    pour convertir un nombre depuis ascii vers le binaire, il faut:

    multiplier total par 10
    soustraire '0' à chaque digit, si le resultat est inferieur à 0, ou superieur à 9, erreur.
    additionner le resultat au total

    et ainsi de suite pour chaque digit jusqu'à la fin.

    le total contient la valeur de ta chaine.

    le fait d'entrer les nombres separement ou dans la même chaine n'a pas d'influence sur la conversion. il faut definir les caractères delimitateurs de chaque nombres.
    le plus souvent, espace.

    21344 314 2234

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 6
    Points
    6
    Par défaut
    Bonjour ,
    je viens de découvrir dans la fonction dos int 21h avec l'affectation à la partie gauche du registre Ax (AH) la valeur : 0AH cette interruption permet de lire une chaine de caractère directement depuis le clavier donc je n'ai plus besoin de la lire caractère par caractère non ? Un problème est résolu toutefois je ne sais pas comment récupérer cette chaine et comment la convertir en un nombre réel ?
    sans parler l'addition ! Elle aussi va me causer un problème
    aidez moi s'il vous plait à résoudre ce problème
    proposer un programme et on discute dessus
    voilà c'est tout ce que j'ai pu écrire jusqu'à maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    .model small.stack 100h
      .data                                                                   
    │mes1 db "Veuillez saisir la valeur du premier nombre : $"                    
    │mes2 db "Veuillez saisir la valeur du deuxième nombre : $" 
      mes3 db "Le résultat de votre addition est : "$"               
    
    │.code                                                                      
    
     deb:
     
     mov ax,@data                                                              
    │mov dx,offset mes1   ; affichage 1                                                        
    │mov ah,09h                                                                   
    │int 21h                                                                      
    
    │mov ah,0Ah    ; Lecture chaine 1                                                         
    │int 21h                                                         
    
    
    │mov dx,offset mes2    ;Afichage 2                                               
    │mov ah,09h                                                            
    
    │mov ah,0Ah              ; Lecture chaine 2
      int 21h    
     
       mov ah,4c00h    ; interruption fin programme 
       int 21h
     
    end deb
    Merci j'attends votre aide

  6. #6
    Membre averti

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    Pour la faire courte :
    http://www.gladir.com/LEXIQUE/INTR/i...htm?Target=ASM
    Le registre DS contient ton segment de destination (son nom complet c'est Destination Segment), DX l'offset du début du stockage de ta chaîne. DS est déjà à jour dans ton cas, reste à définir une zone pour récupérer ta chaîne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov dx, mes4
    mov ah,0Ah              ; Lecture chaine 2
    int 21h
    A lire :
    http://www.developpez.net/forums/d10...r/#post5886079
    Pour la conversion, des posts en parlent déjà.

    Cordialement,

Discussions similaires

  1. Additionner deux String qui sont des nombres
    Par JDev_ dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/05/2012, 13h00
  2. Additionner deux nombres à virgule
    Par renaud26 dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2007, 16h29
  3. Additionner deux variables....
    Par Guillaume602 dans le forum Débuter
    Réponses: 5
    Dernier message: 16/11/2005, 15h00
  4. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57

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