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 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
.model small
.data
nombre1 db ? ;nombre choisis 1
nombre2 db ? ;nombre choisis 2
longueur db 0 ;longueur initialiser a 0
resultat db 0 ;resultat initialiser a 0
reste db 0 ;reste initialiser a 0
buffer db 10 dup("$") ;initialisation du buffer
operation db '$' ;operation initialiser a un char
message1 db "Choisissez un nombre : $" ;chaine de charactere
message2 db "Choisissez un deuxieme nombre : $" ;chaine de charactere
messageoperation1 db "addition : +, soustraction: - , multiplication : *, division : /$" ;chaine de charactere
messageoperation2 db "Inscrivez l'operateur choisit : $" ;chaine de charactere
messagereste db "Reste : " ;chaine de charactere
divpar0 db "Erreur lors de la division (division par 0)$" ;chaine de charactere
messageerreur db "Erreur lors de la saisie$" ;chaine de charactere
messagefin db "Fin du programme$" ;chaine de charactere
retourligne db 0Dh, 0Ah, '$' ;char de retour a la ligne
.code
entrer: ;label d'entrer
mov ax, @data ;debut duprogramme (a comprendre)
mov ds, ax
mov dx, offset message1 ;charger l'adresse du message1 dans dx
call afficher_message ;appelle de la fonction afficher_message
call saisie_utilisateur ;appelle de la fonction saisie_utilisateur
call lenstart
mov bl, 0 ;mettre 0 dans bl
xor dx, dx ;mettre 0 tout dx (dl, dh)
call recuperation_nombre ;appelle de la fonction recuperation_nombre
mov nombre1, bl ;mettre bl dans la data nombre1
mov dx, offset message2 ;charger l'adresse du message2 dans dx
call afficher_message ;appelle de la fonction afficher_message
call saisie_utilisateur ;appelle de la fonction saisie_utilisateur
call lenstart
mov bl, 0 ;mettre 0 dans bl
xor dx, dx ;mettre 0 tout dx (dl, dh)
call recuperation_nombre ;appelle de la fonction recuperation_nombre
mov nombre2, bl ;mettre bl dans la data nombre2
mov dx, offset messageoperation1 ;charger l'adresse du messageoperation1 dans dx
call afficher_message ;appelle de la fonction afficher_message
mov dx, offset messageoperation2 ;charger l'adresse du messageoperation2 dans dx
call afficher_message ;appelle de la fonction afficher_message
call saisie_utilisateur ;appelle de la fonction saisie_utilisateur
mov dl, buffer[0] ;mettre le premier charactere du buffer dans dl
mov al, nombre1 ;mettre le contenue de nombre1 dans al
mov bl, nombre2 ;mettre le contenue de nombre2 dans bl
cmp dl, '+' ;comparaison du char + avec dl
je addition ;si la comparaison retourne vrai alors saut au label addition
cmp dl, '-' ;comparaison du char - avec dl
je soustraction ;si la comparaison retourne vrai alors saut au label soustraction
cmp dl, '*' ;comparaison du char * avec dl
je multiplication ;si la comparaison retourne vrai saut au label multiplication
cmp dl, '/' ;comparaison du char / avec dl
je division ;si la comparaison retourne vrai alor saut au label division
mov dx, offset messageerreur ;charger le messageerreur dans dx
call afficher_message ;appelle de la fonction affcher_message
jmp fin ;saut au label fin
afficher_message: ;label afficher_message
mov ah, 09h ;a comprendre
int 21h ;appelle de l'interuption 21h (a comprendre)
call afficher_retourligne ;appelle de la fonction afficher_retourligne
ret ;retour au programme d'origine
afficher_retourligne: ;label afficher_retourligne
mov ah, 09h ;a comprendre
mov dx, offset retourligne ;charger l'adresse de retour_ligne dans dx
int 21h ;appelle de l'interuption 21h (a comprendre)
ret ;retour au programme d'origine
saisie_utilisateur: ;label saisie_utilisateur
mov dx, offset buffer ;charger l'adresse du buffer dans dx
mov ah, 0Ah ;a comprendre
int 21h ;appelle de l'interuption 21h (a comprendre)
ret ;retour au programme d'origine
recupavantrep: ;label recupavantrep
mov bl, 10 ;mettre 10 dans bl
mov cl, al ;mettre al dans cl
inc dl
repetition: ;label repetition
add cl, al ;ajouter al a cl
dec bl ;decrementer de 1 bl
cmp bl, 0 ;comparaison de 0 avec bl
jg repetition ;si 0 est strictement plus grand que bl saut au label repetition
recuperation_nombre: ;label recuperation_nombre
mov bx, dx
mov al, buffer[bx] ;mettre le premier charactere du buffer dans al
sub al, '0' ;convertion de al en nombre
add cl, al ;ajouter al a cl
cmp dl, longueur ;comparaison de 0 avec le buffer (buffer vide)
jne recupavantrep ;si la comparaison n'est pas egal saut au label recupavantrep
ret ;retour au programme d'origine
lenstart:
xor ax, ax ;mettre tout ax a 0 (al, ah)
jmp len
leninc:
inc ax
len:
mov bx, ax
mov bl, buffer[bx]
cmp bl, '$'
jne leninc
mov longueur, al
ret
addition: ;label addition
add al, bl ;ajout de bl dans al
jmp finprocess ;saut au label finprocess
soustraction: ;label soustraction
sub al, bl ;soustrait bl a al
jmp finprocess ;saut au label finprocess
multiplication: ;label multiplication
cmp bl, 0 ;compare 0 avec bl
je multi0 ;si la comparaison retourne vrai saut au label multi0
mov cl, al ;mettre al dans cl
bouclemulti: ;label bouclemulti
add cl, al ;ajouter al a cl
dec bl ;decrementer bl de 1
jnz bouclemulti ;si le flag Z n'est pas set saut au label bouclemulti (z flag set lorsque bl vaut 0)
jmp finprocess ;saut au label finprocess
multi0: ;labelmulti0
mov al, 0 ;mettre 0 dans al
jmp finprocess ;saut au label finprocess
division: ;label division
cmp bl, 0 ;comparaison de 0 avec bl
je division0 ;si la comparaison retourne vrai saut au label division0
mov cl, 0 ;mettre 0 dans cl
cmp bl, al ;comparaison de al avec bl
jl suitediv ;si al est plus petit que bl saut au label suitediv
bouclediv: ;label bouclediv
sub al, bl ;soustrait bl de al
inc cl ;incrementation de 1 a cl
cmp al, bl ;comparaison de al avec bl
jge bouclediv ;si al est plus grand que bl saut au label bouclediv
suitediv: ;label suitediv
mov resultat, cl ;mettre cl dans resultat
mov reste, al ;mettre al dans reste
mov al, resultat ;mettre resultat dans al
call toascii ;appelle de la fonction toascii
mov ah, 09h ;a comprendre
int 21h ;appelle de l'interuption 21h (a comprendre)
call afficher_retourligne ;appelle de la fonction afficher_retourligne
mov ah, 09h ;a comprendre
mov dx, offset messagereste ;charger l'adresse de messagereste dans dx
int 21h ;appelle de l'interuption 21h (a comprendre)
mov al, reste ;mettre reste dans al
call toascii ;apppelle de la fonction toascii
mov ah, 09h ;a comprendre
int 21h ;appelle de l'interuption 21h (a comprendre)
jmp fin ;saut au label fin
division0: ;label division0
mov dx, offset divpar0 ;charger l'adresse de divpar0 dans dx
call afficher_message ;appelle de la fonction afficher message
jmp fin ;saut au label fin
toascii: ;label toascii
add al, '0' ;convertion de nombre en ascii
mov dl, al ;mettre al dans dl
ret ;retour au programme d'origine
finprocess: ;label finprocess
mov resultat, al ;mettre al dans resultat
call toascii ;appelle de la fonction toascii
mov ah, 09h ;a comprendre
int 21h ;appelle de l'interuption 21h (a comprendre)
jmp fin ;saut au label fin
fin: ;label fin
mov dx, offset messagefin ;charger l'adresse du messagefin dans dx
call afficher_message ;appelle de la fonction afficher_message
mov ah,4ch ;a comprendre (pour fin du programme)
int 21h ;appelle de l'interuption 21h (a comprendre) (pour fin du programme)
end entrer ;fin du label entrer |
Partager