op-hium | je vais mettre le code qui tourne mais qui ne prend pas en compte l'overflow
Code :
- affichmes macro par
- MOV AH, 09H
- MOV DX, offset par
- INT 21H
- MOV AH, 02H
- MOV DL, 0AH
- INT 21H
- endm
- CSEG SEGMENT
- ASSUME CS:CSEG, DS:CSEG, ES:CSEG
- MAIN:
- MOV AX,CS
- MOV DS,AX
- saisie_nb:
- affichmes prem_nb
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on convertis une valeur ASCII en un chiffre ;
- ;pour le premier nombre ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- MOV DX, offset val_ascii1
- MOV AH, 0Ah
- INT 21h
- LEA DI, val_ascii1 ;on charge la variable sur laquelle on travaille
- INC DI ;on met le pointeur sur le nombre de caractère contenu (sans le CR)
- MOV BX, 0 ;initialisation de BX à 0
- MOV BL, [DI] ;on place dans BX la valeur sur laquelle pointe BI
- MOV var1, BX ;et on met BX dans var pour pouvoir travailler avec par la suite
- ADD DI, var1 ;on ajoute le nombre de caractère à DI pour ce placer entre le dernier caractère et le CR
- MOV CX, var1 ;on place var dans CX pour faire une boucle
- MOV coeff1, 1 ;initialisation du coefficiant
- MOV nb1, 0 ;initialisation de la variable de sortie à 0
- convertion:
- MOV DX, 0
- MOV AX, 0
- MOV AL, [DI]
- ;on compare le code ASCII du caractère traité et celui de 3OH (0) s'il est inférieur
- ;c'est que ce n'est pas un chiffre
- CMP AL, 30H
- JB erreur_saisie
- ;on recompare avec 39H (9)
- CMP AL, 39H
- JA erreur_saisie
- DEC DI
- SUB AX, 30h
- MUL coeff1 ; AX := AX x coeff1
- ADD nb1, AX
- MOV AX,10
- MUL coeff1
- MOV coeff1 ,AX
- LOOP convertion
- CALL newline
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on recommence avec le deuxième nombre ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- affichmes deux_nb
- MOV AX, 0
- MOV BX, 0
- MOV CX, 0
- MOV DX, 0
- MOV DX, offset val_ascii2
- MOV AH, 0Ah
- INT 21h
- LEA DI, val_ascii2
- INC DI
- MOV BX, 0
- MOV BL, [DI]
- MOV var2, BX
- ADD DI, var2
- MOV CX, var2
- MOV coeff2, 1
- MOV nb2, 0
- convertion2:
- MOV DX, 0
- MOV AX, 0
- MOV AL, [DI]
- CMP AL, 30H
- JB erreur_saisie
- CMP AL, 39H
- JA erreur_saisie
- DEC DI
- SUB AX, 30h
- MUL coeff2
- ADD nb2, AX
- MOV AX,10
- MUL coeff2
- MOV coeff2 ,AX
- LOOP convertion2
- CALL newline
- JMP multiplication
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on effectue l'addition ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- CALL newline
- affichmes resadd
- MOV AX, nb1
- push ax
- mov al, 0
- call affichage
- call newline
- pop ax
- mov ah, 0
- call affichage
- jmp fin
- ADD AX, nb2
- ;affichage du résultat
- CALL affichage
- CALL newline
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on effectue la soustraction ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- CALL newline
- affichmes ressoust
- MOV AX, nb1
- CMP AX, nb2
- JB soust_inv
- JA soust_norm
- soust_norm:
- MOV AX, nb1
- SUB AX, nb2
- CALL affichage
- JMP multiplication
- soust_inv:
- MOV BX, nb2
- SUB BX, nb1
- MOV DL, 2DH
- MOV AH, 02h
- INT 21H
- MOV AX, BX
- CALL affichage
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on effectue la multiplication ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- multiplication:
- CALL newline
- CALL newline
- affichmes resmult
- MOV AX, nb1
- MUL nb2
- CALL affichage
- jmp fin
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on effectue la division ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- CALL newline
- CALL newline
- CMP nb2, 0 ;si nb2 est égale à 0 alors on met un message d'erreur
- JE div_imp
- affichmes resdiv ;sinon on effectue la division
- MOV DX, 0
- MOV CX, 0
- division:
- MOV AX, nb1
- DIV nb2
- CALL affichage
- CMP DX, 0
- JNE virgule
- CALL newline
- JMP fin
- div_imp:
- affichmes div_impo
- JMP fin
- virgule:
- MOV reste, DX
- MOV DL, 2EH
- MOV AH, 02H
- INT 21H
- MOV CX, 0
- MOV DX, 0
- MOV multdiv, 10
- div_virg:
- MOV AX, reste
- MUL multdiv
- DIV nb2
- MOV reste, DX
- INC CX
- CALL affichage
- CMP CX, 2
- JE fin
- CMP DX, 0
- JNE div_virg
- MOV AX, DX
- CALL affichage
- CALL newline
- JMP fin
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;on affiche le contenu de AX en empilant le nombre chiffre par chiffre ;
- ;à partir de la division du résultat ;
- ;puis on dépile en affichant le résultat caractère par caractère ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- affichage: ; affiche AX sous forme de string
- PUSH BX
- PUSH CX
- PUSH DX
- MOV BX, 10
- MOV CX, 0
- decompose_nb:
- MOV DX, 0
- DIV BX ; AX := AX div 10
- INC CX
- PUSH DX ; empile le reste
- CMP AX, 0
- JNE decompose_nb
- affiche_digit:
- POP AX
- MOV DL, 30h
- ADD DL, AL
- MOV AH, 02H ; fonction d'affichage
- INT 21h
- LOOP affiche_digit
- POP DX
- POP CX
- POP BX
- RET
- newline:
- PUSH AX
- PUSH DX
- MOV DL, 10
- MOV AH, 2
- INT 21h
- MOV DL, 13
- MOV AH, 2
- INT 21h
- POP DX
- POP AX
- RET
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;si la personne rentre un caractère dont le code ASCII est inférieur à 30h (0);
- ;ou supérieur à 39h (9), on affiche un message est on lui demande de ;
- ;recommencer la saisie ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- erreur_saisie:
- CALL newline
- affichmes erreur
- affichmes dmd_entrer
- MOV AH, 1H
- INT 21H
- MOV AH, 0AH
- INT 21H
- JMP saisie_nb
- fin:
- MOV AH, 1H
- INT 21H
- MOV AH,4CH
- INT 21H
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;liste des variables utilisées ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- prem_nb db "le premier nombre", 24H
- deux_nb db "le deuxieme nombre", 24h
- resadd db "le resultat de l'addition est", 24H
- ressoust db "le resultat de la soustraction est", 24H
- resmult db "le resultat de la multiplication est", 24H
- resdiv db "le resultat de la division est", 24H
- erreur db "la sasie est incorrecte, veuillez n'entrer que des caracteres compris entre 0 et 9", 24H
- dmd_entrer db "veuillez taper sur une touche pour recommencer la saisie des nombres", 24H
- div_impo db "Il est impossible de faire une division par 0", 24H
- val_ascii1 db 5,?,5 dup(?)
- var1 dw ?
- nb1 dw ?
- coeff1 dw ?
- val_ascii2 db 5,?,5 dup(?)
- var2 dw ?
- nb2 dw ?
- coeff2 dw ?
- reste dw ?
- multdiv dw ?
- CSEG ENDS
- END MAIN
|
Alors docteur, c'est grave ?? |