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 :

Saut de ligne avec int 0x10


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut Saut de ligne avec int 0x10
    Bonjour,

    Bon voilà j'ai décidé de me lancer sur ce tutoriel : http://esauvage.developpez.com/tutor...e=page_2#LII.4

    Et donc dans le code final j'ai changé la chaine de caractère par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hello: db 'Bonjour papi.', 13, 'Oui, mon enfant.', 0
    Bon le saut de ligne marche toujours mais à ma grande surprise il ne continue pas à lire la suite (Bon vu que je le lance dans dosBox j'ai pas pu faire un copier-coller de la sortie en console, mais c'est le même résultat qu'avant sauf qu'il ne continue pas à lire le reste).

    J'ai essayé 2, 3 "inc si" avant le jmp mais les autres caractères ne s'affichent pas ... Mon curseur n'est-il pas placé à la bonne position ?

  2. #2
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    Bonjour.

    Le code proposé dans ce tutoriel est faux.

    Ce n'était pas visible car le caractère 13 de la chaîne initiale était suivi par un 0.
    Modifier cette chaîne afin qu'elle affiche d'autres lettres après le retour à la ligne a fait apparaître l'erreur de programmation.

    Lorsqu'on trouve le caractère 13, il faut effectivement incrémenter dh et mettre dl à 0, puis positionner le curseur.
    Mais il ne faut pas afficher le caractère contenu dans al comme le fait le code proposé dans le tutoriel.
    A la place, il faut incrémenter si puis revenir à affiche_suivant.

    La procédure nouvelle_ligne doit donc être modifiée comme je viens de l'expliquer.

    Je signale qu'il est plus simple d'utiliser l'instruction lodsb à la place des deux instructions mov al,[si] et inc si.
    Cela évite de placer l'instruction inc si à deux endroits.

    Je signale aussi que l'auteur de ce tutoriel confond les caractères de contrôle CR et LF.
    Le caractère CR ( Cariage Return ) qui vaut 13, ramène à la première colonne : il faut mettre dl à 0.
    Le caractère LF ( Line Feed ) qui vaut 10, fait passer à la ligne suivante : il faut incrémenter dh.
    Dans tous les textes correctement remplis, le changement de ligne est signalé par les 2 caractères de contrôle CR, LF, placés à la suite et dans cet ordre.
    Voir http://fr.wikipedia.org/wiki/Carriage_Return_Line_Feed

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Par défaut
    Lorsqu'on trouve le caractère 13, il faut effectivement incrémenter dh et mettre dl à 0, puis positionner le curseur.
    Mais il ne faut pas afficher le caractère contenu dans al comme le fait le code proposé dans le tutoriel.
    A la place, il faut incrémenter si puis revenir à affiche_suivant.
    Oui ça marche. Par contre j'avais essayé ça mais je ne comprends pas pourquoi ça ne marche pas vu que [si] est sensé déjà avoir la valeur de 'O' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nouvelle_ligne:
    inc dh
    xor dl, dl
    inc si
    mov al, [si]
    jmp positionne_curseur
    Je signale aussi que l'auteur de ce tutoriel confond les caractères de contrôle CR et LF.
    Le caractère CR ( Cariage Return ) qui vaut 13, ramène à la première colonne : il faut mettre dl à 0.
    Le caractère LF ( Line Feed ) qui vaut 10, fait passer à la ligne suivante : il faut incrémenter dh.
    Dans tous les textes correctement remplis, le changement de ligne est signalé par les 2 caractères de contrôle CR, LF, placés à la suite et dans cet ordre.
    Oui, mais cela revient à faire 2 tests pour CR et LF alors qu'ici je pense que l'auteur voulait faire simple en ne testant qu'une valeur pour le retour à la ligne non ?

    En ce qui concerne lodsb :
    Cette instruction permet de copier un élément de l'adresse DS:SI dans le registre accumulateur et incrémente/décrémente le registre SI en fonction de la taille de l'opérande source et de l'état du drapeau de direction.
    Je ne comprends pas trop l'une des conditions sur l'incrément/décrément : comment ça en fonction de la taille de l'opérande source ?

  4. #4
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    1) La modification proposée est fausse car le test al est-il nul ? doit être fait avant l'affichage.
    Or, ici, on charge dans al le caractère suivant et on saute directement à positionne_curseur, donc à l'affichage, et cela quelle que soit la valeur de al.
    Le programme ne tournera pas correctement si le caractère 13 est suivi de 0.

    2) Effectivement, il est possible que dans un souci de simplicité, l'auteur ait souhaité n'avoir qu'une valeur particulière à tester.

    3)
    Cette instruction permet de copier un élément de l'adresse DS:SI dans le registre accumulateur et incrémente/décrémente le registre SI en fonction de la taille de l'opérande source et de l'état du drapeau de direction.
    Ce commentaire s'applique en fait à lods qui peut être employé seul ( voir le manuel Intel ).

    Pour lodsb, qui charge dans al l'octet situé à l'adresse ds:si, le registre si est incrémenté de 1.

  5. #5
    Membre confirmé

    Homme Profil pro
    Sans emploi
    Inscrit en
    Août 2019
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Sans emploi

    Informations forums :
    Inscription : Août 2019
    Messages : 82
    Par défaut
    Bonjour je remonte ce sujet, car j'ai aussi fait l'exercice de ce tutoriel et même erreur en NASM sous DOS.

    Voici un code fonctionnel sous DOS basé entre autre sur celui du tutoriel en NASM et ce que j'ai pu trouver en ligne.
    Je me demandais si il n'y avait pas plus concit? Enfin ici je passe de l'interrupteur BIOS (int 0x10) à une fonction de DOS (int 21h)
    Je ne suis jamais parvenu à faire ce retour chariot+nouvelle ligne via l'instruction BIOS.
    Je me demande si une personne pourrait m'aiguiller ce concernant?

    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
    org 0x0100 ;Adresse de debut .COM
     
            ;Ecriture de la chaine hello dans la console
            mov si,hello ;Adresse de la chaine a afficher dans le registre SI
            xor bh,bh ;BH=0, stocke la page d'affichage 
            mov ah,0x03
            int 0x10 ;Appel de l'interruption BIOS donnant la position du curseur
                     ;stockee dans DX
            mov cx,1 ;Nombre  de fois ou l'on va afficher un caractere.
            affiche_suivant:
                    mov al,[si] ;On place le caractere dans AL
                    or al,al ;On compare AL a 0 pour savoir si on doit arreter
                    jz fin
                    cmp al,13
                    je retour_chariot
            positionne_curseur:
            mov ah,0x02 ;On positionne le curseur
            int 0x10
            mov ah,0x0A ;On affiche le caractere courrant CX fois
            int 0x10
            inc dl ;Om passe a la colonne suivante
            index_char:
            inc si ;On passe au caractere suivant
            jmp affiche_suivant
            fin:
                    ret
                    nouvelle_ligne:
                            mov ah,02h 
                            mov dl,10
                            int 21h
                            mov dl,13
                            mov ah,02h
                            int 21h
                            xor dl,dl
                            jmp index_char
     
                    retour_chariot:
                            inc si
                            mov al,[si]
                            cmp al,10
                            je nouvelle_ligne
                            jmp affiche_suivant
     
            hello: db 'Bonjour papi.',13,10,'OLA',0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Saut de ligne avec sed
    Par melmouj dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 11/12/2009, 14h03
  2. Sauts de ligne avec Writeln
    Par Charly910 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/02/2009, 10h54
  3. Pb saut de ligne avec <form></form>
    Par JSuper_Kitten dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/10/2005, 16h02
  4. [FLASH MX] PB de saut de ligne avec XML
    Par yoda_style dans le forum Flash
    Réponses: 2
    Dernier message: 07/04/2005, 11h16
  5. le caractere de saut de ligne avec SetDlgItemText
    Par matthieup dans le forum Windows
    Réponses: 4
    Dernier message: 07/11/2004, 18h31

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