IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Affichage des chiffres en Assembleur


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 112
    Points : 53
    Points
    53
    Par défaut Affichage des chiffres en Assembleur
    Bonsoir

    Je voudrais savoir comment il faut faire pour faire afficher par exemple le résultat d'une addition sur l'écran.

    Comme dans cet exemple qui appelle une procédure pour additionner les valeurs mises dans les registres AX et BX.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    .model small 
    .stack 64
    .data
     
     
    .code
    xyz PROC NEAR
     
    mov AX, @DATA
    mov DS, AX
    mov AX ,5
    mov BX, 3
    call SUM
     
    ; un probleme ici
    MOV AH,09h 
    MOV DX,AX
    INT 21h 
     
    mov ah, 4ch
    int 21h
     
    xyz endp
     
    SUM PROC NEAR
    ADD AX,BX
     
    RET
    SUM endp
     
     
    end
    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 18
    Points
    18
    Par défaut Afficher le contenu d'un registre à l'écran
    Bonjour,

    C'est très simple, il faut écrire une routine pour afficher le résultat !

    Le plus simple est d'abord de faire une routine pour afficher le résultat en Hexadécimal

    Puis de faire une version pour afficher en décimal.

    Je peux vous aider à les écrire si vous sêchez.

    Ce type de procédures ou macro est incontournable et tout développeur qui se respecte commence par se paufiner ce genre d'outils qu'il met dans ses bibliothèques perso.

    Il en va de soit qu'il est également nécessaire d'écrire une procédure permettant de convertir un nombre saisi au clavier de ascii vers binaire pour pouvoir faire des programmes interractifs.

    Mais si je reviens sur votre code, il y a un problème et c'est normal. Le service 09h de l'interruption 21h du DOS a pour effet d'afficher LA chaine de caractères terminée par "$" et pointée par ds:dx.

    Ce que je vous conseille de faire dans un premier temps c'est d'afficher une chaine pour comprendre ce mécanisme.

    Il existe aussi d'autres moyens d'afficher une chaine à l'écran, mais ils demandent une bonne connaissance du matériel.

    A+

    marjucarma

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 18
    Points
    18
    Par défaut Une première solution avec une macro...
    Bonjour,

    Comme personne n'est revenu sur ce poste et que j'aime bien aller jusqu'au bout des choses, voici une première solution pour afficher le contenu d'un registre. J'ai ressorti ma disquette de TASM 2.0 que j'avais eu avec TURBO PASCAL PRO 6.0 il y a quelques décénies de cela... Que de souvenirs cette époque merveilleuse où tout était simple

    voici donc le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    ; Petit programme affichant une valeur à l'écran
    ;------------------------------------------------
     
    dispreg MACRO  reg         
    LOCAL   @@mStart, @@mBoucle, @@valtmp
            jmp     @@mStart
            @@valtmp db  '____'
    @@mStart:        
            mov     [value1], reg            ;on sauve la valeur du reg … l'emplacement value1
            mov     bx, offset symboles     ;bx -> 'symboles' pour adressage de base
            mov     di, offset valeur + 3   ;es:di -> dernier caractère de 'valeur'
            std                             ;direction flag est sur d‚cr‚mentation  
            mov     cx,00h                    ;on va utiliser "artificiellement" cx comme compteur
    @@mBoucle:
            mov     si, value1              ;si = value1
            shr     si, cl                  ;on décale de cl=0 bits vers la droite
            and     si, 000Fh               ;si = 0Dh
            mov     ax, [bx][si]            ;ax = caractŠre du signe … afficher    
            stosb                           ;stocke le byte dans ax … es:di et d‚cr‚mente di
            add     cx, 4h                  ;on ajoute 4 … cx
            cmp     cx, 0Ch                 ;si cx <= 12
            jng     @@mBoucle               ;alors on recommence depuis boucle;
     
            mov     dx, offset label1       ;on affiche label1, valeur, crlf
            mov     ah,9                    ;DOS: print string
            int     21h                     ;affiche
    ENDM dispreg
     
    .MODEL  SMALL
    .STACK  100h
     
    .DATA
     
    label1          db      'Valeur : ' ; libell‚ tout simpple
    valeur          db      '____'      ; emplacement pour les caractères de la valeur à afficher    
    crlf            db      10,13,'$'   ; retour chariot et fin de ligne
     
    symboles        db      '0123456789ABCDEF' ; symboles hexadécimaux
    value1          dw      00000h    ; la valeur à afficher
     
    .CODE
    start:
      mov     ax,@data
      mov     ds, ax                  ;DS pointe sur 'data segment'
      mov     es, ax                  ;ES pointe sur 'data segment'
     
      mov     cx,00123h		  ; exemple 1
      dispreg cx       
      mov     bx,0032Ah		  ; exemple 2
      dispreg bx
     
      mov     ah,1                    ;DOS: 'get character'
      int     21h                     ;attend un caractère au clavier
      mov     ah,4ch                  ;DOS: terminate program
      mov     al,0                    ;code de retour / terminaison = 0
      int     21h                     ;fin du programme
     
    END start

    Ce petit bout de code peut certainement être modifié ou amélioré (il n'est pas terminé même si il fonctionne) . Il doit exister d'autres manières de faire et surtout n'hésitez pas à proposer d'autres solutions.

    Une première amélioration du code pourrait consister à rendre locale le tableau contenant les "Symboles" utilisés pour construire la chaine à afficher... Mais, sous peine d'allourdir le code généré lors de la compilation.
    J'ai également une version avec une procédure à la place d'une macro... mais je vais vous laisser chercher un peu de votre côté...

    A+

    majµkarma

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 783
    Points
    23 783
    Par défaut
    Merci à tous pour ces contributions.

    Je dois avouer que c'est une question relativement fréquente et bien légitime. Pourtant, je n'arrive pas à me souvenir s'il existe ou non, en fin de compte, quelque chose d'approprié ou, à tout le moins, d'approché dans les fonctions du D.O.S. pour faire cela.

    Si ce n'est vraiment pas le cas, je tâcherai de mettre une entrée dans la F.A.Q.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 18
    Points
    18
    Par défaut Haaa... Le bon vieux temps du MSDOS !
    Bonjour,

    Ce dernier WE, J'ai carrément ressortit mon vieux 286P du placard et il marche encore !

    Et j'ai le pack complet de disquettes originales de Borland pour

    TASM 2.0
    TPROFILER
    TD
    TURBO PASCAL 6.0

    Avec en plus la bonne vieille erreur d'étiquetage entre les disquettes 1/3 et 1/2 de TP6, j'avoue que j'avais oublié cette époque digne de la pré-histoire...

    Au passage, j'ai écrit un petit bout de code différent pour afficher une valeur en HEXA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    ; Afficher ax en hexa avec les masques de bits de TASM / MASM
    .MODEL  SMALL
    .STACK  100h
    .DATA
    symboles db '0123456789ABCDEF'
    resultat db '0000',13,10,'$'
    Val RECORD POS1:4, POS2:4, POS3:4, POS4:4
    DVal Val <0000b,0000b,0000b,0000b>
     
    .CODE
    start:
      mov     ax,@data
      mov     ds,ax                   ;set DS to point to the data segment
      mov     es,ax
     
      mov     ax, 1234d     ; une petite addition
      mov     bx, 2313d     ; en exemple
      add     ax, bx
      mov     [Dval], ax     ; on stocke le résultat dans DVal
      mov     bx, OFFSET symboles  ; prépare l'addressage basé indirect de symboles
      mov     di, OFFSET resultat    ; pointe sur résultat
      cld
      mov     si, DVal                    ; Contenu de
      and     si, MASK POS1           ;si = 0A000h
      mov     cl, POS1                ;shift position dans cl
      shr     si, cl                  ;on d‚cale de cl bits vers la droite 
      mov     ax, [bx][si]        ; symbole correspondant dans ax 
      movsb                         ; copie ax dans resultat
      mov     si, DVal             ; ensuite on fait pareil pour les autres positions (POS#)
      and     si, MASK POS2    ; position 2
      mov     cl, POS2
      shr     si, cl
      mov     ax, [bx][si]
      movsb
      mov     si, DVal
      and     si, MASK POS3  ; position 3
      mov     cl, POS3
      shr     si, cl
      mov     ax, [bx][si]
      movsb
      mov     si, DVal
      and     si, MASK POS4  ;position 4
    ;  mov     cl, POS2
    ;  shr     si, cl
      mov     ax, [bx][si]
      movsb
     
      mov     dx, offset resultat  ; on va afficher resultat
      mov     ah,9h                   ; fonction DOS : afficher chaine
      int     21h                        ; affiche
      mov     ah,4ch                  ;fonction DOS: terminate program
      mov     al,0                    ;return code 0
      int     21h                     ;termine 
    END start
    Heu... j'ai regardé partout dans les exemples de TASM et les fichiers LIB et INC fournis avec TASM et j'ai rien trouvé. Il existe peut-être des libs à ce sujet, mais je n'ai rien sous la main.

    Sinon, un moyen simple de visualiser les valeurs des registres est d'utiliser un débugger comme Turbo Debuger (TD).

    En tout cas, même si le mode 16bits pour DOS est un peu démodé, cela reste un outil pédagogique remarquable offrant déjà de très grandes possibilités, et le passage au mode 32 sera facile. Par contre, pour le mode 64 c'est une autre histoire...

    Maintenant il ne reste plus qu'à trouver le code pour afficher le résultat en base 10 !

    A vos Claviers, Prêt, Codez !!!


    A+

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/03/2013, 10h14
  2. Affichage des chiffres
    Par GharbiAbdo dans le forum Forms
    Réponses: 2
    Dernier message: 31/03/2011, 18h51
  3. CHARACTERSET et affichage des chiffres
    Par fakhri dans le forum Administration
    Réponses: 2
    Dernier message: 13/04/2007, 12h05
  4. Affichage des chiffres dans une phrases arabe
    Par omda dans le forum Oracle
    Réponses: 4
    Dernier message: 30/09/2005, 13h36
  5. [VB6] [Flexgrid] Format d'affichage des numériques
    Par yansolo dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/10/2002, 21h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo