Code Assembleur

Résolu/Fermé
amigos22 Messages postés 7 Date d'inscription dimanche 16 mai 2010 Statut Membre Dernière intervention 30 novembre 2011 - 28 nov. 2011 à 00:34
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 1 déc. 2011 à 06:51
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
A voir également:

3 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
28 nov. 2011 à 07:31
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
amigos22 Messages postés 7 Date d'inscription dimanche 16 mai 2010 Statut Membre Dernière intervention 30 novembre 2011
30 nov. 2011 à 23:36
je vous remercie infiniment
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 1/12/2011 à 06:54
ç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
0