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 du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    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 confirmé
    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
    Points : 567
    Points
    567
    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 du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    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 confirmé
    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
    Points : 567
    Points
    567
    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.

+ 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