Afficher la somme de 2 entiers superieur à 9

Benh_m 5 Messages postés dimanche 9 septembre 2007Date d'inscription 21 décembre 2011 Dernière intervention - 3 déc. 2011 à 15:18 - Dernière réponse :  Moncefben
- 5 mars 2018 à 22:33
Bonjour à tous !

Alors voila, j'ai un devoir en Assembleur à faire et j'ai un problème :
je dois faire la somme de deux entiers, jusque la tout va bien, puis l'afficher.

j'ai réussi à afficher la somme tant qu'elle est inférieure à 10 mais je ne sais pas comment faire pour l'afficher lorsqu'elle est supérieur, car il y a deux (voire plus) caractères à afficher et je ne trouve pas le lien entre ma somme en code ASCII et mes deux caractères. Si quelqu'un pouvais me donner un petit coup de pousse se serait génial !

voila mon bout de code :

pile segment 'stack'
base DB 100 DUP(?)
sommet DB ?
pile ends

donnees segment 'data'

messaisie1 DB 0Dh,0Ah,0Ah,'Saisir OP1 : $'
messaisie2 DB 0Dh,0Ah,0Ah,'Saisir OP2 : $'
messresult DB 0Dh,0Ah,0Ah,'La somme est : $'
messerreur DB 0Dh,0Ah,0Ah,'erreur, le caractere doit etre un entier, recommencer : $'
OP1 DB ?
OP2 DB ?

donnees ends

inst segment 'code'
assume cs:inst, ds:donnees,ss:pile
debut:
mov ax,donnees
mov ds,ax
mov ax,pile
mov ss,ax
lea sp,sommet







; Première Saisi : 

Saisie1:
;Invite_saisie :
mov AH,9
LEA DX, messaisie1
INT 21h

mov AH,1
INT 21h

MOV OP1, AL

CMP OP1, '0'
JL CasErreur1
CMP OP1, '9'
JG CasErreur1

JMP Saisie2

CasErreur1 :

mov AH,9
LEA DX, messerreur
INT 21h
JMP Saisie1


; Deuxième Saisi : 

Saisie2:
;Invite_saisie :
mov AH,9
LEA DX, messaisie2
INT 21h

mov AH,1
INT 21h

MOV OP2, AL

CMP OP2, '0'
JL CasErreur2
CMP OP2, '9'
JG CasErreur2

JMP Traitement


CasErreur2 :

mov AH,9
LEA DX, messerreur
INT 21h
JMP Saisie2




; Traitement :

Traitement :
ADD OP1, AL
ADD OP1, -48

CMP OP1,'9'
;JG sup9

JMP inf10



; Affichage : 

inf10 :

mov AH,9
LEA DX, messresult
INT 21h

MOV AH,2
MOV DL, OP1
INT 21h



;sup9 :



RetourSysteme:
mov ah,4Ch
int 21h
inst ends
end debut



NB : j'en suis à mon 3ème cour d'assembleur alors soyez indulgent :)
Afficher la suite 

10 réponses

Répondre au sujet
BLUEBIBUBBLE 116 Messages postés samedi 4 juin 2005Date d'inscription 10 avril 2013 Dernière intervention - 14 déc. 2011 à 21:59
0
Utile
comme on est en base 10, il faut un algo du style:

Début:
- diviser la valeur par 10
- afficher le reste
- si la valeur > 0 => jmp Début

on affiche l'unité en premier, puis les dizaines, puis les centaine, etc...
Commenter la réponse de BLUEBIBUBBLE
Benh_m 5 Messages postés dimanche 9 septembre 2007Date d'inscription 21 décembre 2011 Dernière intervention - 14 déc. 2011 à 23:01
0
Utile
ah ouiiiii merci ! je faisais pareil mais en enlevant 10 à chaque fois.. mais mon problème est maintenant de réussir a trouver une méthode pour convertir en chiffre, les codes ASCII obtenus :(
Commenter la réponse de Benh_m
BLUEBIBUBBLE 116 Messages postés samedi 4 juin 2005Date d'inscription 10 avril 2013 Dernière intervention - 15 déc. 2011 à 09:07
0
Utile
add al,'0'
Commenter la réponse de BLUEBIBUBBLE
BLUEBIBUBBLE 116 Messages postés samedi 4 juin 2005Date d'inscription 10 avril 2013 Dernière intervention - 15 déc. 2011 à 09:09
0
Utile
ou plutôt:
add dl,'0'
Commenter la réponse de BLUEBIBUBBLE
Benh_m 5 Messages postés dimanche 9 septembre 2007Date d'inscription 21 décembre 2011 Dernière intervention - 15 déc. 2011 à 18:44
0
Utile
quel est la différence entre AL et DL ?

donc si j'ai bien compris, je fais tout mon traitement et à la fin pour l'affichage j'ajoute '0' à mes variables ?
Commenter la réponse de Benh_m
BLUEBIBUBBLE 116 Messages postés samedi 4 juin 2005Date d'inscription 10 avril 2013 Dernière intervention - 18 déc. 2011 à 22:48
0
Utile
DL est intéressant parce qu'il reçoit le RESTE lors d'une division.
Example:

mov eax,Nombre a afficher
mov edi,OFFSET Fin du Tampon qui doit recevoir la chaine
mov ecx,10 ;Base 10
Label1:
xor edx,edx ;met edx a zéro
div ecx ;divise EDX:EAX par ECX, Résultat dans EAX, reste dans EDX
add dl,'0' ;'0' = Code ASCII du zéro
dec edi ;on se déplace d'un caractère vers la gauche
mov [edi],dl ;on affiche le chiffre
or eax,eax ;test si eax (Résultat) = ZÉRO
jnz Label1 ;Si pas 0, Répète pour les dizaines, les centaines, etc...

En 16 bit c'est pareil
On divise DX:AX par CX, résultat dans AX, reste dans DX
le reste tient évidemment dans DL, (0-9)
Il faudra surement préciser le segment (mov ds:[di],dl ;si je me souvient bien)
Commenter la réponse de BLUEBIBUBBLE
Benh_m 5 Messages postés dimanche 9 septembre 2007Date d'inscription 21 décembre 2011 Dernière intervention - 19 déc. 2011 à 10:17
0
Utile
humm... mon prof d'assembleur m'a dit qu'on pouvait pas diviser en asm, surement qu'il veut qu'on le fasse autrement. mais je pense avoir trouver une solution pas mal ( qui marche pas mais bon ^^ )

voila mon traitement : val1 val2 et val3 corresponde respectivement au chiffre dizaine, centaine :

Traitement1 :



CMP VAL1, 9 	; on compare VAL1 qui est la somme des chiffres pour voir s'il est superieur à 9
JG sup91 		; si superieur à 9 on jump jusqu'à sup91
CMP VAL1, 9
JL Traitement2 ; sinon on jump au traitement numéro 2

sup91:

SUB VAL1,10		;	on enlève 10 à VAL1
ADD VAL2,1		;	on ajoute dans VAL2 1

JMP Traitement1


Traitement2 :

CMP VAL2, 9  ; on compare VAL2 qui est la somme des dizaine pour voir ;s'il est superieur à 9
JG sup92 ; si superieur à 9 on jump jusqu'à sup92
CMP VAL2, 9
JL Affichage ; sinon on jump à l'affichage

sup92 :

SUB VAL2,10	;	on enlève 10
ADD VAL3,1	;	on ajoute dans VAL3 1

JMP Traitement2


Affichage :

; affichage résultat de la somme

mov AH,9
LEA DX, messresult	; affichage texte
INT 21h

ADD VAL3, '0'
MOV AH,2
MOV DL, VAL3		; centaine
INT 21h

ADD VAL2, '0'
MOV AH,2
MOV DL, VAL2		; dizaine
INT 21h

ADD VAL1, '0'
MOV AH,2
MOV DL, OP1			; chiffre
INT 21h
Commenter la réponse de Benh_m
BLUEBIBUBBLE 116 Messages postés samedi 4 juin 2005Date d'inscription 10 avril 2013 Dernière intervention - 20 déc. 2011 à 22:48
0
Utile
Inutile d'afficher les centaines, si le plus grand nombre saisissable est 9...
... 9 + 9 = 18
Commenter la réponse de BLUEBIBUBBLE
Benh_m 5 Messages postés dimanche 9 septembre 2007Date d'inscription 21 décembre 2011 Dernière intervention - 21 déc. 2011 à 02:47
0
Utile
1
ah oui pardon, c'est parce que je suis passé a la question suivante à savoir faire la somme de deux nombres a deux chiffres ^^ donc au max 99+99= 198
Et dire que en 2018 j'ai le même devoir a faire et que je suis vraiment au même niveau que toi question rélisation
Commenter la réponse de Benh_m

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.