Code Assembleur

Résolu
amigos22 Messages postés 7 Statut Membre -  
nicocorico Messages postés 846 Statut Membre -
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

  1. nicocorico Messages postés 846 Statut Membre 138
     
    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
  2. amigos22 Messages postés 7 Statut Membre
     
    je vous remercie infiniment
    0
  3. nicocorico Messages postés 846 Statut Membre 138
     
    ç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