Assembleur 8086

Fermé
mucucu2 Messages postés 1 Date d'inscription mardi 3 juin 2014 Statut Membre Dernière intervention 3 juin 2014 - Modifié par mucucu2 le 3/06/2014 à 02:12
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 4 juin 2014 à 09:42
Bonjour tt le monde ;

j ai fais se programme d add de deux nombre de 0~9
j ai un probleme au niveau de résultat plus de 10 ,, il me donne resultat en code ASCII


data segment
msg1 db 'donner la valeur de a: ','$'
msg2 db 'donner la valeur de b: $'
msg3 db 'la somme de a et b : $'
a db ?
b db ?
som db ?
retour db ' ',0Dh,0Ah,'$'
data ends
code segment
main:
mov ax,data
mov ds,ax
xor ax,ax

mov dx,offset msg1
mov ah,9h
int 21h

mov ah,01h
int 21h
mov a,al


mov dx,offset retour
mov ah,9h
int 21h

mov dx,offset msg2
mov ah,9h
int 21h

mov ah,01h
int 21h
mov b,al

mov dx,offset retour
mov ah,9h
int 21h

mov al,a
sub al,30h
mov bl,b
sub bl,30h
add al,bl

daa

mov som,al


mov dx,offset msg3
mov ah,9h
int 21h

mov ah,02
mov dl,som
int 21h

mov ah,4ch
int 21h
code ends
end main

1 réponse

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
4 juin 2014 à 09:42
Bonjour,

oui c'est normal, c'est que tu demande à une instruction affichant un seul caractère d'en afficher deux! Il faut bel et bien utiliser deux fois l'instruction d'affichage en prenant soin de diviser la valeur par dix pour recueillir le premier et le second caractère à afficher en ajoutant à chacun 30h. Tu auras l'un et l'autre en effectuant une seule division, en considérant le résultat et le reste de la division. Il est aussi possible de simplement tester si la valeur dépasse 09 ou non, et en déduire s'il faut afficher "1" devant.
Par ailleurs, puisque ton programme ne prévois pas de tester les bornes des caractères entrés, il est plus simple d'additionner les deux résultats dans la même variable puis de soustraire 60h directement, plutôt que séparément..

Je te montre juste l'extraie de la la modification envisageable pour l'addition, et je te laisse apprendre par toi-même sur le reste! Il serait aussi possible de stocker la valeur dans des registres non modifiés par les interruptions suivantes plutôt qu'en mémoire, mais ça changerait peu de choses.


mov ah,01h 
int 21h
mov a,al


mov dx,offset retour
mov ah,9h
int 21h

mov dx,offset msg2
mov ah,9h
int 21h

mov ah,01h
int 21h
sub al,60h // On soustrait directement 2*30h
add a,al // et on stocke le résultat de l'addition

mov dx,offset retour
mov ah,9h
int 21h

mov al,a
0