Code Assembleur [Résolu/Fermé]

Signaler
Messages postés
7
Date d'inscription
dimanche 16 mai 2010
Statut
Membre
Dernière intervention
30 novembre 2011
-
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
-
Bonjour,

je viens de commencer la programmation en assembleur et je me suis planter au niveau de mon premier programme,
j'aimerais écrire un programme qui accepte deux entier par le clavier et affiche la somme de ces deux dernier, j'ai essayer par ce code mais ça ne marche pas, pouvez m'aider SVP

Data Segment
chaine DB "La somme est :$"
nbre1 DB ?
nbre2 DB ?
somme db ?
Data EndS

Code Segment
Assume Cs: Code ; Ds: DATA

main: Mov AX,Data
Mov DS,AX

mov Ah,1 ; lecture de premier nbre
int 21h
mov nbre1,al

mov Ah,1 ; lecture de deuxiéme nbre
int 21h
mov nbre2,al

mov ax,nbre1
add ax,nbre2
mov somme,ax

mov DX, offset chaine
mov AH, 9h
int 21h

mov dl,somme ; affichage de la somme
mov ah,2
int 21h

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

3 réponses

Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
131
Oui, c'est normal que ça ne marche pas : tu oublies d'ajuster la valeur lue en ascii à laquelle il faut soustraire 48 pour récupérer un nombre et tu mélange l'utilisation de 'somme' en byte et word...
Data Segment
chaine DB "La somme est :$"
nbre1 DB ?
nbre2 DB ?
somme db ?
Data EndS

Code Segment
Assume Cs: Code ; Ds: DATA

main: Mov AX,Data
Mov DS,AX

mov Ah,1 ; lecture de premier nbre
int 21h
Sub AL,48; 
Js @Null  
Cmp AL,09;
Ja @null     ; test de validitée du caractère
mov nbre1,al

; AH n'est pas modifié, il est inutile de le recharger
; lecture de deuxiéme nbre
int 21h
Sub AL,48; 
Js @Null  
Cmp AL,09;
Ja @null
mov nbre2,al

mov al,nbre1
add al,nbre2
mov somme,al

mov DX, offset chaine
mov AH, 9h
int 21h

mov dl,somme ; affichage de la somme
mov ah,2
int 21h

@Null:
mov ah,4ch
int 21h
code ends
end main
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
7
Date d'inscription
dimanche 16 mai 2010
Statut
Membre
Dernière intervention
30 novembre 2011

je vous remercie infiniment
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
131
ça me fait plaisir...
Et tu as dû te rendre compte que j'ai oublié d'ajouter 48 pour retransformer la somme en caractère avant sortie !
A vrai dire l'assembleur sous dos, c'est très loin pour moi, je lui préfère très nettement la version 32 bits sous delphi , très puissant et pratique !
Et tout dépend de ce que tu veux faire, mais ce code peut bien sûr être très amélioré, ici ile teste la validitée des entrées et affiche la dizaine du résultat :
Data Segment 
chaine DB "La somme est :$" 
Data EndS 

Code Segment 
Assume Cs: Code ; Ds: DATA 

main: Mov AX,Data 
Mov DS,AX 

  mov  Ah,1          ; lecture de premier nbre 
  int  21h 
  Sub  AL,48;  
  Js   @Null   
  Cmp  AL,09; 
  Ja   @null             ; test de validitée du caractère 
  mov  BL,AL          ; utilise BL pour sauvegarder 

; AH n'est pas modifié, il est inutile de le recharger 
  int  21h 
  cmp  AL,48;  
  Jb   @Null   
  Cmp  AL,48 + 09     ; ici on garde la base 48 
  Ja   @null 
  Add  BL,al 

  mov  DX, offset chaine 
  mov  AH, 9h 
  int  21h 

  mov  ah,2 
  Cmp  BL,48 + 10; 
  Jb   @One             ; Teste si le nombre dépasse 09 
  Mov  DL,48 + 01; 
  int  21h                 ; écrit '1' 
  Sub  BL,10            ; retire la dizaine  
@One: 
  mov  dl,BL  
  int  21h 

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

Le chêne aussi était un gland, avant d'être un chêne