1. #1
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 79
    Points : 109
    Points
    109

    Par défaut Créer une calculatrice simple en asm

    Bonjour j'esssaye actuelement de refaire une calculatrice simple en console.Et évidement j'ai quelques problèmes.

    Déjà voici le code , puis je poserais mes questions :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    segment .data
     
     
    accueil : db "Bonjour, bienvenue sur la calculatrice asm.",10, 0
    len_acceuil equ $ - accueil
     
    addition : db "1)Je veux faire une addition.",10, 0
    len_add equ $ - addition
     
    choix_addition : db "Vous avez choisis l'addition",10, 0
    len_choix_add equ $ - choix_addition
     
    soustraction : db "2)je veux faire une soustraction",10, 0
    len_sous equ $ - soustraction
     
    choix_soustraction : db "Vous avez choisis la soustraction", 10, 0
    len_choix_sous equ $ - choix_soustraction
     
    multiplication : db "3)je veux faire une mutliplication",10, 0
    len_mutli equ $ - multiplication
     
    choix_multiplication : db "Vous avez choisis la multiplication", 10, 0
    len_choix_multi equ $ - choix_multiplication
     
    division : db "4)je veux faire une division",10, 0
    len_div equ $ - division
     
    modulo : db "5)je veux faire un modulo",10, 0
    len_modulo equ $ - modulo
     
    choix : db "Votre choix 1-5: "
    len_choix equ $ - choix
     
     
    final : db "fin du programme.",10,0
    len_fin equ $ - final
     
    segment .bss
     
    	buffer resb 1 ;size of buffer
     
     
    segment .text
     
    global _start
     
    _start :
     
    		;affichage texte aceuil
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, accueil
    		mov edx, len_acceuil
    		int 0x80
     
    		;affichage des operations
     
    		;addition
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, addition
    		mov edx, len_add
    		int 0x80
     
    		; soustraction
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, soustraction
    		mov edx, len_sous
    		int 0x80
     
    		; multiplication
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, multiplication
    		mov edx, len_mutli
    		int 0x80
     
    		;division
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, division
    		mov edx, len_div
    		int 0x80
     
    		;modulo
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, modulo
    		mov edx, len_modulo
    		int 0x80
     
    		;choix user
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix
    		mov edx, len_choix
    		int 0x80
     
    		;saisi user
    		mov eax, 3		; systeme call read
    		mov ebx, 1 		; 1 = stdin
    		mov ecx, buffer
    		mov edx, 1		; buffer size =  1 octet
    		int 0x80
     
    		;compare user input
     
    		cmp	eax, 1
    		je	op_addition
     
    		cmp	eax, 2
    		jmp	op_soustraction 	; ces deux instructions ne fonctionne pas
     
    		;mov eax, 4		;sys call write
    		;mov ebx, 0		; 0 = stdout
    		;mov ecx, buffer
    		;mov edx, 1		; buffer size
    		;int 0x80
     
    		;jmp _start
     
    op_addition : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_addition
    		mov edx, len_choix_add
    		int 0x80
     
    		jmp fin
     
    op_soustraction :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_soustraction
    		mov edx, len_choix_sous
    		int 0x80
     
    		jmp fin
     
    op_multiplication :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_multiplication
    		mov edx, len_choix_multi
    		int 0x80
     
    		jmp fin
     
     
    		;fin du programm
    fin :
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, final
    		mov edx, len_fin
    		int 0x80
     
    		mov eax, 1
    		mov ebx, 0
     
    		int 0x80
    Ma premère question est , lors de la saisie le nombre entré par l'utilisateur est stockée dans buffer , c'est bien ça ?

    Ensuite je ne comprend pas si je fait :

    je vais vers la bonne opération( soustraction , addition ect)

    si je fait :
    la ça ne fonctionne plus.

    Je me dis alors qu'il faut que je comparer le buffer a eax, afin de comparer l'entrée saisie par l'utilisateur (le buffer) et un chiffre allant de 1 a 5 correspondant au type d'operation choisis (je sais pas si je suis bien clair là :/ )

    Bref j'ai besoin d'aide au niveau des sauts conditionnels pour choisir le type d'operation en fontion de la saisie de l'utilisateur.

    Merci d'avance. Salut

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 570
    Points : 19 174
    Points
    19 174

    Par défaut

    Pourquoi fais tu plusieurs appels pour afficher tes messages ? Fais-en un seul qui affiche toutes tes lignes.

    Ensuite deux problèmes :

    1) la fonction eax=3 int0x80 retourne dans eax le nbre de caractères lus, pas ce qui est lu, il faut lire les docs.
    2) comme déjà vu, le retour te donnera de l'ASCII, pas un chiffre, il te faudra donc comparer le retour avec les codes ASCII des valeurs 1 à 5 et non pas les chiffres 1 à 5.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 79
    Points : 109
    Points
    109

    Par défaut

    Bon j'ai réduis le code pour l'affichage du menu en un seul appel.Pas encore fait le reste.Par contre j'ai une question simple, de quelle documentations parles tu ?

    Moi voila de quoi je m'aide, y'en a t-il d'autres a avoir ? :

    https://www.gladir.com/LEXIQUE/ASM/int.htm

    http://stanislavs.org/helppc/int_21.html

    http://unixwiz.net/techtips/x86-jumps.html

    https://www.gladir.com/LEXIQUE/ASM/DICTIONN.HTM

    https://www.felixcloutier.com/x86/

    Personnelement ce n'est pas que certaine soit en anglais qui me dérange c'est que je les trouvent pas très détaillés, en aurais-tu d'autres a me prétter stp ?

    voici quand même le code retouché un peu :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    segment .data
     
     
    accueil : db "Bonjour, bienvenue sur la calculatrice asm.",10, 0
    len_acceuil equ $ - accueil
     
    menu :	db "1)Je veux faire une addition.",10, 0
    		db "2)je veux faire une soustraction",10, 0
    		db "3)je veux faire une mutliplication",10, 0
    		db "4)je veux faire une division",10, 0
    		db "5)je veux faire un modulo",10, 0
    		db "Votre choix 1-5: "
     
    len_menu equ $ - menu
     
    choix_addition : db "Vous avez choisis l'addition",10, 0
    len_choix_add equ $ - choix_addition
     
    choix_soustraction : db "Vous avez choisis la soustraction", 10, 0
    len_choix_sous equ $ - choix_soustraction
     
    choix_multiplication : db "Vous avez choisis la multiplication", 10, 0
    len_choix_multi equ $ - choix_multiplication
     
     
    final : db "fin du programme.",10,0
    len_fin equ $ - final
     
    segment .bss
     
    	buffer resb 1 ;size of buffer
     
     
    segment .text
     
    global _start
     
    _start :
    		;affichage texte aceuil
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, accueil
    		mov edx, len_acceuil
    		int 0x80
     
    		;affichage menu
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, menu
    		mov edx, len_menu
    		int 0x80
     
    		;saisi user
    		mov eax, 3		; systeme call read
    		mov ebx, 1 		; 1 = stdin
    		mov ecx, buffer
    		mov edx, 1		; buffer size =  1 octet
    		int 0x80
     
    		;compare user input
     
    		cmp	eax, 1
    		je	op_addition
     
    		cmp	eax, 2
    		jmp	op_soustraction 		; ces deux instructions ne fonctionne pas
     
    		;mov eax, 4		;sys call write
    		;mov ebx, 0		; 0 = stdout
    		;mov ecx, buffer
    		;mov edx, 1		; buffer size
    		;int 0x80
     
    		;jmp _start
     
    op_addition : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_addition
    		mov edx, len_choix_add
    		int 0x80
     
    		jmp fin
     
    op_soustraction :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_soustraction
    		mov edx, len_choix_sous
    		int 0x80
     
    		jmp fin
     
    op_multiplication :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_multiplication
    		mov edx, len_choix_multi
    		int 0x80
     
    		jmp fin
     
     
    		;fin du programm
    fin :
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, final
    		mov edx, len_fin
    		int 0x80
     
    		mov eax, 1
    		mov ebx, 0
     
    		int 0x80
    Merci !!!

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 570
    Points : 19 174
    Points
    19 174

    Par défaut

    Je parlais de la documentation des appels systèmes Linux :
    http://www.lxhp.in-berlin.de/lhpsyscal.html
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 79
    Points : 109
    Points
    109

    Par défaut

    Je suis désolé mais vraiment je n'y arrive pas.

    J'ai besoin de quelques conseils.

    Voici le code actuel mais qui ne veut pas dire grande chose :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    segment .data
     
     
    accueil : db "Bonjour, bienvenue sur la calculatrice asm.",10, 0
    len_acceuil equ $ - accueil
     
    menu :	db "1)Je veux faire une addition.",10, 0
    		db "2)je veux faire une soustraction",10, 0
    		db "3)je veux faire une mutliplication",10, 0
    		db "4)je veux faire une division",10, 0
    		db "5)je veux faire un modulo",10, 0
    		db "Votre choix 1-5 : "
     
    len_menu equ $ - menu
     
    choix_addition : db "Vous avez choisis l'addition",10, 0
    len_choix_add equ $ - choix_addition
     
    choix_soustraction : db "Vous avez choisis la soustraction", 10, 0
    len_choix_sous equ $ - choix_soustraction
     
    choix_multiplication : db "Vous avez choisis la multiplication", 10, 0
    len_choix_multi equ $ - choix_multiplication
     
     
    final : db "fin du programme.",10,0
    len_fin equ $ - final
     
    segment .bss
     
    	buffer resb 1 		;size of buffer
     
     
    segment .text
     
    global _start
     
    _start :
    		;affichage texte aceuil
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, accueil
    		mov edx, len_acceuil
    		int 0x80
     
    		;affichage menu
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, menu
    		mov edx, len_menu
    		int 0x80
     
    		;saisi user
    		mov eax, 3		; systeme call read
    		mov ebx, 1 		; 1 = stdin
    		mov ecx, buffer
    		mov edx, 1		; buffer size =  1 octet
    		int 0x80
     
    		;compare user input
    		mov [buffer], eax
     
    		mov ecx, [buffer]
    		cmp eax, ecx
    		je op_addition
     
     
     
     
    		;mov eax, 4		;sys call write
    		;mov ebx, 0		; 0 = stdout
    		;mov ecx, buffer
    		;mov edx, 1		; buffer size
    		;int 0x80
     
    op_addition : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_addition
    		mov edx, len_choix_add
    		int 0x80
     
    		jmp fin
     
    op_soustraction :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_soustraction
    		mov edx, len_choix_sous
    		int 0x80
     
    		jmp fin
     
    op_multiplication :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_multiplication
    		mov edx, len_choix_multi
    		int 0x80
     
    		jmp fin
     
     
    		;fin du programm
    fin :
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, final
    		mov edx, len_fin
    		int 0x80
     
    		mov eax, 1
    		mov ebx, 0
     
    		int 0x80
    J'ai compris d'après la doc et tes explications les choses suivantes :

    -mov eax, 3 int 0x80 renvoie le nombre de caractère lu et les place dans eax.
    - ecx est un pointer vers buffer.
    - edx represente la taille de ce buffer.
    - le retour de la fonction mov eax, 3 int 0x80 me revoies un code ASCIII (que je dois convertir?) que je dois comparer a eax pour connaitre le choix de l'utilisateur.Donc cmp eax, 01 (le code du nombre 1 en ASCII est 01) ?

    Voila je suis un peu perdu dans la logique a adopté.

    Merci par avance.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 570
    Points : 19 174
    Points
    19 174

    Par défaut

    La fonction int 0x80 retournera toujours un résultat dans eax, en général une valeur négative=erreur. Pour l'ouverture de fichier, ça te retournera un nombre qui sera le handle (en cas de réussite). La documentation explique ce que la fonction (j'entends par fonction int 0x80 eax=qq chose) attend en entrée et dans quels registres, et ce qu'elle retourne.

    Dans le cas de la fonction eax=3 int 0x80, elle attend en entrée comme indiqué dans la doc :
    - ebx : le descripteur de fichier (le handle) par défaut 0=stdin 1=stdout, mais on ne lit par sur stdout. Pour un fichier ebx=handle obtenu par open
    - ecx : la taille du buffer ou sera stocké la lecture
    - edx= taille du buffer

    Si erreur la fonction retourne EAGAIN, EBADF, EFAULT, EINTR, EINVAL, EIO, EISDIR qui sont les codes erreurs errno du C et des nombres négatifs, sinon le nombre de caractères lus.

    La fonctionva lire sur stdin des codes ASCII et les stocker dans le buffer à l'adresse ecx edx fois. Si la chaine de caractères ( ou le caractère) doit être utilisé comme un nombre, il te faut faire une conversion.

    Il est à noter également qu'il s'agit d'une fonction bas niveau. Elle ne va pas gérer l'arrêt de lecture après un retour chariot comme les fonctions C scanf ou fgets. Ca c'est à toi de gérer si besoin.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 79
    Points : 109
    Points
    109

    Par défaut

    RE,
    bon je te remet que le code de saisie et la suite.

    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
    		;saisi user
    		mov eax, 3		; systeme call read
    		mov ebx, 1 		; 1 = stdin
    		mov ecx, buffer
    		mov edx, 1		; buffer size =  1 octet
    		int 0x80
     
    		;compare user input
     
    		; convertion de l'entree ASCII en decimal
    		mov bl, 1
    		div bl
     
    		add al, 0x30
    		mov [buffer], al
     
    		; comparaison de la saisie avec la lecture
    		cmp eax, [buffer]
    		je op_soustraction
     
     
     
    		;mov eax, 4		;sys call write
    		;mov ebx, 0		; 0 = stdout
    		;mov ecx, buffer
    		;mov edx, 1		; buffer size
    		;int 0x80
     
    op_addition : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_addition
    		mov edx, len_choix_add
    		int 0x80
     
    		jmp fin
     
    op_soustraction :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_soustraction
    		mov edx, len_choix_sous
    		int 0x80
     
    		jmp fin
     
    op_multiplication :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_multiplication
    		mov edx, len_choix_multi
    		int 0x80
     
    		jmp fin
     
     
    		;fin du programm
    fin :
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, final
    		mov edx, len_fin
    		int 0x80
     
    		mov eax, 1
    		mov ebx, 0
     
    		int 0x80
    On voit bien que la lecture de l'entrée se fait correctement, car ça saute a op_soustraction et non pas en suivant la suite du code sur op_addition.Le saut conditionnel fonctionne.
    Maintenant ce que je n'arrive pas a traduire en assembleur c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(buffer == 1)
    	goto op_addition;
     
    if(buffer == 2)
    	goto op_soustraction:
     
    ect....

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    8 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 8 570
    Points : 19 174
    Points
    19 174

    Par défaut

    Je ne comprend pas ce que tu fais à partir de la ligne 11. Tu divises le contenu de al par 1 ce qui ne sert à rien. Et ensuite ligne 15, tu écrases ce qui a été lu et stocké dans le buffer par le contenu de al.

    Le seul truc que tu as à faire avec le contenu de eax après l'int 0x80 est de vérifier que c'est égal à 1, car tu dois avoir lu 1 caractère lu.
    Tu dois ensuite récupérer le contenu lu (1 caractère dans buffer) et soit faire une conversion d'ASCII en nombre et vérifier par exemple que c'est égal à 1 pour addition, 2 pour soustraction ou tout simplement que c'est égal à "1", pour addition, "2" pour soustraction, etc. c'est à dire comparer le code ASCII lu avec le code ASCII de 1, de 2 etc pour sauter dans les parties de codes suivantes.

    En plus ligne 18, tu fais une comparaison sur 32 bits avec le contenu de buffer qui n'est sensé contenir que 1 caractère soit 8 bits. Mauvaise pratique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    mov al,[buffer]
    cmp al,1 # if(buffer == 1)
    je op_addition  # goto op_addition
    cmp al,2 # if(buffer == 2)
    je op_soustraction  # goto op_soustraction
     
    op_addition:
    ...
    op_soustraction:
    ...
    Et on utilises pas goto en C sauf cas très rare.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    juin 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2009
    Messages : 79
    Points : 109
    Points
    109

    Par défaut

    Merci ton bout de code fonctionne parfaitement, j'ai ajouté "des bornes limites" en dessous de 1 on reppart sur la saisie et au dessus de 5 pareil.

    Voici la code actuel :

    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    segment .data
     
     
    accueil : db "Bonjour, bienvenue sur la calculatrice asm.",10, 0
    len_acceuil equ $ - accueil
     
    menu :	db "1)Je veux faire une addition.",10, 0
    		db "2)je veux faire une soustraction",10, 0
    		db "3)je veux faire une mutliplication",10, 0
    		db "4)je veux faire une division",10, 0
    		db "5)je veux faire un modulo",10, 0
    		db "Votre choix 1-5 : "
     
    len_menu equ $ - menu
     
    choix_addition : db "Vous avez choisis l'addition",10, 0
    len_choix_add equ $ - choix_addition
     
    choix_soustraction : db "Vous avez choisis la soustraction", 10, 0
    len_choix_sous equ $ - choix_soustraction
     
    choix_multiplication : db "Vous avez choisis la multiplication", 10, 0
    len_choix_multi equ $ - choix_multiplication
     
    choix_division : db "Vous avez choisis la division", 10, 0
    len_choix_div equ $ - choix_division
     
    choix_modulo : db "Vous avez choisi le modulo", 10, 0
    len_choix_mod equ $ - choix_modulo
     
     
    final : db "fin du programme.",10,0
    len_fin equ $ - final
     
    segment .bss
     
    	buffer resb 1 		;size of buffer
     
     
    segment .text
     
    global _start
     
    _start :
    		;affichage texte aceuil
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, accueil
    		mov edx, len_acceuil
    		int 0x80
     
    		;affichage menu
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, menu
    		mov edx, len_menu
    		int 0x80
     
    		;saisi user
    		mov eax, 3		; systeme call read
    		mov ebx, 1 		; 1 = stdin
    		mov ecx, buffer
    		mov edx, 1		; buffer size =  1 octet
    		int 0x80
     
    		;compare user input
     
    		; convertion de l'entree ASCII en decimal
    		cmp eax, 1
     
    		mov al,[buffer]
     
    		cmp al,"1" 
    		je op_addition
    		jl _start 
     
    		cmp al,"2"
    		je op_soustraction
     
    		cmp al, "3"
    		je op_multiplication
     
    		cmp al, "4"
    		je op_division
     
    		cmp al, "5"
    		je op_modulo
    		jg _start
     
    		;mov eax, 4		;sys call write
    		;mov ebx, 0		; 0 = stdout
    		;mov ecx, buffer
    		;mov edx, 1		; buffer size
    		;int 0x80
     
    op_addition : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_addition
    		mov edx, len_choix_add
    		int 0x80
     
    		jmp fin
     
    op_soustraction :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_soustraction
    		mov edx, len_choix_sous
    		int 0x80
     
    		jmp fin
     
    op_multiplication :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_multiplication
    		mov edx, len_choix_multi
    		int 0x80
     
    		jmp fin
     
    op_division :
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_division
    		mov edx, len_choix_div
    		int 0x80
     
    		jmp fin
     
    op_modulo : 
     
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, choix_modulo
    		mov edx, len_choix_mod
    		int 0x80
     
    		jmp fin
     
    		;fin du programm
    fin :
    		mov eax, 4
    		mov ebx, 1
    		mov ecx, final
    		mov edx, len_fin
    		int 0x80
     
    		mov eax, 1
    		mov ebx, 0
     
    		int 0x80
    Encore merci pour ton aide et tes explications.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/11/2010, 20h06
  2. Approche pour créer une interface simple en JavaScript ?
    Par beninsky dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/10/2010, 19h27
  3. Créer une application simple
    Par Sofianosss dans le forum Java & Mobiles
    Réponses: 1
    Dernier message: 03/09/2010, 03h54
  4. [XL-2003] Créer une listbox simple
    Par coklin dans le forum Excel
    Réponses: 4
    Dernier message: 06/08/2009, 11h26
  5. Réponses: 7
    Dernier message: 29/05/2007, 10h37

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