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 32-bits / 64-bits Assembleur Discussion :

Addition de deux chiffres lus au clavier


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Addition de deux chiffres lus au clavier
    Bonjour,
    je viens vous demander de l'aide car j'essaye de réaliser une addition entre deux nombres lues au clavier.
    L'opération fonctionne (pas au dessus de 9 en résultat) mais j'ai constamment un affichage étrange juste après mon résultat. Je n'arrive pas non plus à faire en sorte qu'il y est un retour chariot après le resultat. Ce qui fait que ma ligne de terminal est aussitôt affiché derrière le résultat .

    Merci d'avance pour votre temps

    Nom : Problem.png
Affichages : 379
Taille : 16,3 Ko

    Voici la sortie dans le terminal :

    # ./calc5
    Entrez votre premier chiffre : 2
    Entrez votre second chiffre : 3
    Le resultat est : 5roo

    roo étant affiché comme un mini carré avec des symboles dans le terminal

    si ça peut aider, au niveau des étapes de compilation j'ai fait :
    nasm -f elf64 calc5.asm
    ld -o calc5 calc5.o

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Normal que ça ne marche pas plus que 9.
    Ton calcul ne prend en compte que les 'unités' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov eax, [Num1]
    	sub eax, '0'
    	mov ebx, [Num2]
    	sub ebx, '0'
    	add eax, ebx
    	add eax, '0'
    Il faudrait prendre les dizaine/centaines ect en compte.
    Enfaite tu ne prend que le premier caractère donc pour cela que 1 + 10 = 2 , vu que le premier caractère de 1 c'est 1 et le premier de 10 c'est 1 aussi donc on a bel et bien 1 + 1 = 2
    De même que le résultat devrait être pas mal modifier , bref le code doit être plus 'complexe' pour ce que tu veux faire.

    roo étant affiché comme un mini carré avec des symboles dans le terminal
    Normal , tu met qu'il doit afficher 5 caractère et ton résultat et sur un caractère, il faut initialiser les autres a zero.

    Pour le retour chariot ,ben il suffit d'en mettre un a la fin (comme en C quoi).

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    section .data
    	WelcomeMsg: db 'Bienvenue dans votre super calculette', 10
    	WelcomeSize: equ $-WelcomeMsg
     
    	Num1userMsg: db 'Entrez votre premier chiffre : ' 
    	Num1userSize: equ $-Num1userMsg
     
    	Num2userMsg: db 'Entrez votre second chiffre : '
    	Num2userSize: equ $-Num2userMsg
     
    	ResultatMsg: db 'Le resultat est : '
    	ResultatSize: equ $-ResultatMsg
     
    	Retour: db 0x0A
    section .bss
     
    	Num1 resb 5
    	Num2 resb 5
    	Result resb 5
     
    section .text
     
    global _start
    _start:
     
    ; Afficher à l'utilisateur le premier nombre à entrer
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Num1userMsg
    	mov edx, Num1userSize
    int 80h
     
    ; Lire et stocker l'entrée 1
    	mov eax, 3
    	mov ebx, 2
    	mov ecx, Num1
    	mov edx, 5
    int 80h
     
     
    ; Afficher à l'utilisateur le deuxième nombre à saisir
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Num2userMsg
    	mov edx, Num2userSize
    int 80h
     
    ; Lire l'entrée pour le nombre 2
    	mov eax, 3
    	mov ebx, 2
    	mov ecx, Num2
    	mov edx, 5
    int 80h
     
    ; calculer Num1 et Num2
     
    	mov eax, [Num1]
    	sub eax, '0'
    	mov ebx, [Num2]
    	sub ebx, '0'
    	add eax, ebx
    	add eax, '0'
     
    	mov [Result], eax	
     
    ; Afficher resultat
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, ResultatMsg
    	mov edx, ResultatSize
    int 80h
     
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Result
    	mov edx, 5
    int 80h
     
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Retour
    	mov edx, 1
    int 80h
     
    mov eax, 1
    mov ebx, 0
    int     80H
    Je note que pas mal de base (chaine de caractere , retour chariot , fin de caractere a zero ect) sont des bases qu'on voit dans le langage C , on a tu deja fait ? (je trouve cela un peu violent de passer direct a la case asm mais bon).
    Par curiosité , pourquoi veut tu faire cela en asm ? exercice ? a titre pédagogique ? autre ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bonjour Kannagi, merci pour la réponse et la correction.
    Oui effectivement j'ai vu ça sur un autre post, il faut gérer les unités et compagnie. Je vais pour le moment me contenter des unités, ça sera déjà pas mal. En revanche j'ai toujours le symbole à la fin du résultat. Je n'arrive pas à m'en défaire, je suppose que ça à un lien avec l'ASCII mais je n'arrive pas à l'exploiter.

    Je fais cela dans le cadre d'un exercice informatique et puis par curiosité aussi. Autrement j'ai déjà fait du C oui mais je suis obligé de faire de l'ASM la pour le coup ^^

    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Rien a voir avec l'ASCII , je te l'ai deja dit un fin de caractère doit finir par 0 , normalement tu as du voir ça en C.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov eax, 0
     	mov [Result+1], eax
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Result
    	mov edx, 5

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup, voici mon code final et ça marche grâce à toi :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    section .data
    	WelcomeMsg: db 'Bienvenue dans votre super calculette', 10
    	WelcomeSize: equ $-WelcomeMsg
     
    	Num1userMsg: db 'Entrez votre premier chiffre : ' 
    	Num1userSize: equ $-Num1userMsg
     
    	Num2userMsg: db 'Entrez votre second chiffre : '
    	Num2userSize: equ $-Num2userMsg
     
    	ResultatMsg: db 'Le resultat est : '
    	ResultatSize: equ $-ResultatMsg
     
    	Retour: db 0x0A
     
    section .bss
     
    	Num1 resb 1
    	Num2 resb 1
    	Result resb 1
     
    section .text
     
    global _start
    _start:
     
    ; Message de bienvenue
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, WelcomeMsg
    	mov edx, WelcomeSize
    int 80h
     
    ; Afficher à l'utilisateur le premier nombre à entrer
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Num1userMsg
    	mov edx, Num1userSize
    int 80h
     
    ; Lire et stocker l'entrée 1
    	mov eax, 3
    	mov ebx, 0
    	mov ecx, Num1
    	mov edx, 4
    int 80h
     
     
    ; Afficher à l'utilisateur le deuxième nombre à saisir
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Num2userMsg
    	mov edx, Num2userSize
    int 80h
     
    ; Lire l'entrée pour le nombre 2
    	mov eax, 3
    	mov ebx, 0
    	mov ecx, Num2
    	mov edx, 4
    int 80h
     
     
    ; calculer Num1 et Num2
     
    	mov eax, [Num1]
    	sub eax, '0'
    	mov ebx, [Num2]
    	sub ebx, '0'
    	add eax, ebx
    	add eax, '0'
     
    	mov [Result], eax	
     
    ; Afficher resultat
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, ResultatMsg
    	mov edx, ResultatSize
    int 80h
    	mov eax, 0
    	mov [Result+1], eax
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Result
    	mov edx, 5
    int 80h
     
    	mov eax, 4
    	mov ebx, 1
    	mov ecx, Retour
    	mov edx, 1
    int 80h
     
    end:
    mov eax, 1
    mov ebx, 0
    int     80H
    je dois avouer avoir du mal à comprendre ce qui se passe sur le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov eax, 0
    mov [Result+1], eax
    si tu as encore un peu de temps, je veux bien un peu d'aide sur le déroulement ici
    pour moi je met 0 dans eax puis j'ajoute 1 au résultat ?

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Vu que je ne sais pas ce qui te bloque je vais expliquer de manière large.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov eax, 0 ; eax = 0
    mov [Result+1], eax ;Result+1 = eax (soit 0)
    Au cas ou tu ne le sais pas [Result] ou [Result+1] c'est leur adresse.

    Ben il faut le voir comme en C , les bases.
    Result c'est un tableau on est d'accord.
    Une chaîne de caractère fini toujours pas le caractère '\0' (soit zero) donc quand tu affiche ta chaine de caractere , tu doit termine par la valeur 0.
    En C tu fait bien ça non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
    char Result[5];
    Result[0] = '5'; //equivalent a [Result]
    Result[1] = 0; //equivalent a [Result+1]
     
    printf("%s\n",Result); //affiche 5

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Ah super ! Effectivement avec la comparaison en C c'est tout de suite plus parlant ! Je te remercie infiniment pour la correction apportée et ta patience ! J'y vois vraiment plus clair !!!

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 438
    Points : 43 081
    Points
    43 081
    Par défaut
    Penses à clôturer le POST en cliquant sur résolu.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/04/2011, 17h59
  2. Réponses: 2
    Dernier message: 16/01/2008, 09h02
  3. [jsp] addition entre deux valeurs recupérées en Java
    Par LESOLEIL dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/06/2005, 13h19
  4. [Math]Addition de deux float : résultat faux !!!
    Par toctof dans le forum Général Java
    Réponses: 4
    Dernier message: 20/05/2005, 11h02
  5. Pourcentage avec deux chiffres après la virgule
    Par Oluha dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/03/2005, 13h47

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