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 :

Problème d'affichage lettre


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Problème d'affichage lettre
    Salut !
    J'ai un petit problème que mon niveau pitoyable ne permet pas de résoudre ^^
    Voilà le code du premier fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %include "FUNC-IO.asm"
    org 0x0100
    mov si, lettre
    call echo
    ret
     
    lettre: db 'T'
    Il fait appel à la seule et unique fonction du deuxième fichier (echo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo:
    mov ah, 0Ah
    mov al, [si]
    mov cx, 1
    xor bx, bx
    int 10h
    ret
    Sauf qu'au lieu d'afficher un T il affiche une sorte de T avec un rotation à 90° vers la gauche (180 en ASCII étendu).
    J'ai essayé de mettre si dans la pile puis de le récupérer dans l'autre fichier sauf que dans ce cas j'obtiens un =
    Je suis débutant, désolé si la question semble débile.

    Merci d'avance

  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 : 565
    Points
    565
    Par défaut
    Bonjour

    Et comme çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    org 0x0100
    mov si,offset lettre
    call echo
    ret
    %include "FUNC-IO.asm"
     
    lettre: db 'T'
    qu'est-ce que cela donne ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Pareil

  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 : 565
    Points
    565
    Par défaut
    Code proposé :

    offset a bien été ajouté devant lettre ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci de tes réponse
    ça ne marche cependant toujours pas
    Images attachées Images attachées  

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Salut,

    C'est pour quoi l'image attachée de ton dernier post ?
    quel compilateur utilises-tu ?
    Les modifs de Prof devraient pourtant fonctionner

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    L'image seravait pour l'erreur de compilation.
    J'utilise nasm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %include "FUNC-IO.asm"
    org 0x0100
    mov si, offset LETTRE
    push si
    call echo
    ret
    LETTRE: db "E"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    org 0x0100
    mov si,offset lettre
    call echo
    ret
    %include "FUNC-IO.asm"
     
    lettre: db 'T'
    Dans les 2 cas ça marche pas... ;(

  8. #8
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Ok, je n'avais pas regardé la fenêtre "terminal"

    Du coup je ne comprends pas trop comment tu compiles ton code

    Pourquoi ne pas utiliser un compilateur Nasm pour DOS ?

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    J'ai un mini script bash qui compile le fichier indiqué en .com puis il lance DOSBox
    J'utilise nasm parce que je veux aussi faire des programmes bootable donc je voulais pas m’embêter avec 2 compilateur

  10. #10
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    et pourtant je pense que ton problème vient bien le là
    à la 2eme ligne du terminal on voit bien qu'il y a 3 erreur, je ne connais pas la syntaxe de Nasm, à voir si tes instructions sont compatibles

  11. #11
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Bon, j'ai pris mon courage à deux mains, et j'ai installé nasm (pour DOS)
    déjà, il est super instable sous dosbox et me kill dosbox à la 2eme compilation
    Mais... je confirme qu'en plaçant le %include à la fin, ça fonctionne et ça m'affiche un T de toute beauté

  12. #12
    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 : 565
    Points
    565
    Par défaut
    Bonjour.

    Citation :
    J'ai essayer de mettre si dans la pile puis de le récupérer dans l'autre fichier ...
    Il n'y a qu'un seul fichier qui est envoyé à la compilation.
    La directive %include recopie le fichier FUNC-IO.asm à la position courante.
    C'est comme si on faisait un copier-coller.

    Avec le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     %include "FUNC-IO.asm"
    org 0x0100
    mov si, lettre
    le code qui se trouve dans le fichier FUNC-IO.asm est recopié en premier.
    Il sera donc compilé et placé à partir de l'offset 0 du segment.

    Puis le compilateur trouve la directive "org 0x0100" qui lui dit de compiler la suite à l'offset 0100h.
    Les instructions suivantes seront donc placées à partir de 0100h dans le segment.

    Finalement le code exécutable se trouve en partie au début du segment, puis il y a un trou rempli de 0 et le reste du code exécutable se trouve après l'offset 0100h.
    Normalement, un tel code ne devrait pas permettre d'obtenir un exécutable de type .com puisqu'il faut pour cela que tout le code exécutable soit placé à partir de l'offset 0100h.
    Dans un exécutable .com, les 256 premiers octets sont remplis par le DOS qui y met des renseignements utiles pour l'exécution.
    Ce qui écrase au passage tout ce qui se trouverait là.

    Si l'utilitaire qui transforme le programme .exe en programme .com déplace le code exécutable à partir de l'offset 0100h, alors c'est le code qui était placé dans le fichier FUNC-IO.asm qui se trouve maintenant à l'offset 0100h et c'est lui qui est exécuté en premier.
    Et au premier ret, on sort du programme.
    On n'arrive donc jamais à l'instruction "mov si, lettre".

    Placer la directive %include avant la directive org 0x0100 est donc une erreur.
    C'est la raison pour laquelle je l'avais déplacé après le code qui doit être exécuté à l'entrée dans le programme, sachant que la directive org 0x0100 doit être placée au tout début.

    Puis j'avais rectifié "mov si,lettre" en "mov si,offset lettre" car j'utilise TASM et je suis habitué à sa syntaxe.
    Mais avec NASM, je crois que "mov si,lettre" met dans si l'adresse de lettre, ce qui est le but recherché.
    Si cela est le cas, l'instruction initiale "mov si,lettre" est correcte et n'a pas besoin d'être changée.

    Autre remarque : la fonction 0Ah de l'interruption 10h ne fait pas avancer le curseur après l'écriture.
    Il est possible de remplacer la fonction 0Ah par la fonction 0Eh, qui est bien plus simple à utiliser et qui a l'avantage d'avancer le curseur après l'écriture.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci de ta réponse complète et détaillée.
    Grâce à toi j'ai obtenu un code fonctionnel
    OS.asm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    org 0x0100
    mov si, lettre
    ;push si
    call echo
    ret
     
    ;Variables
    lettre: db 'T'
     
    ;Inclusions
    %include "FUNC-IO.asm"
    FUNS-IO.asm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ;Fichier contenant des fonctions d'entré sortie
     
    echo:
    ;pop si
    mov ah, 0Ah
    mov al, [si]
    mov cx, 1
    xor bx, bx
    int 10h
    ret
    Comme tu as déjà du le remarquer, j'ai commenter la mise en pile car je n'obtient pas un "T" mais une magnifique... ligne vide ;(

    De plus, j'ai fais 2 ou 3 petits tests après avoir lu ton message sur la position de l'include. Je me suis dis que étant donné que la première ligne de code de FUNC-IO.asm était une fonction, si je mettais l'include juste après org ça devrait marcher puisque la vrai première ligne qui devrait faire quelque chose serait la 3ème. Mais il s'avère qu'on revient au problème initial

    Voilà voilà c'est vraiment sympa de m'aider à bien débuter sur ce langage assez complexe alors que j'ai à peine commencer à apprendre le C xD

  14. #14
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Du coup ça fonctionne ou pas ?

    un Call dépose sur la pile l'adresse de retour, tu ne peux donc pas passer (simplement) d'arguments par la pile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    push si
    call machin
    ....
    ...
    ...
    machin:
    pop si ; si va contenir l'adresse de retour du call
    ...
    ..
    ret ; le retour va se faire sur l'adresse pointée par si avant le call ... gros plantage en perspective

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Ouai ça marche
    Si je veux accéder au si dans la pile je dois dépiler 2 fois ?

  16. #16
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Si ton proc est en 16 bits (un .COM l'est toujours) alors un CALL near fait bien 16bits, par contre un far fait 32
    (bon, là c'est forcément un near)
    Et il n'est pas toujours possible de savoir sur un CALL est near ou far

    De plus tu vas devoir sauver ta valeur dans un registre qui ne pourra pas être sauvegardé
    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pop ax ; adresse de retour dans AX
    pop si ; récupère la bonne valeur dans SI
    push ax ; replace la valeur de retour sur la pile
    dans ce cas, la valeur de AX devra être sauvée AVANT le call car ne pourra pas l'être dans la sous-routine

    c'est pour la même raison que lors d'appels d'interruptions, les données sont placées dans des registres et
    non pas sur la pile.
    ça permet d'éviter des erreurs car les registres sont officiellement modifiés avant l'appel (et donc peuvent êtres
    utilisés dans la routine)

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Ok, c'est noté. J'ai plein d'autres questions j'ouvre un nouveau topic xD ?

  18. #18
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 702
    Points : 2 019
    Points
    2 019
    Par défaut
    Je pense que tu peux ouvrir autant de sujets que tu veux, il n'y a pas foule sur ce forum

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2015
    Messages : 20
    Points : 6
    Points
    6
    Par défaut De retour :P
    Me revoilà x)
    Alors toujours avec nos 2 fichiers
    OS.asm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    org 0x0100
    OS:
    mov si, string
    call scan
    mov si, string
    call print
    ;jmp OS
    ret
     
    ;Variables
    string: db "Hello", 0
     
    ;Inclusions
    %include "FUNC-IO.asm"
    FUNC-IO.asm :
    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
    ;------------------------------------------------------------------------AFFICHAGE CHA�NE DE CARATERE---------------------------------------------------------------------------
    print:
    mov ah, 0Eh	;Code d'instruction �criture d'un caract�re
    xor bx, bx	;RAZ (param�tres inutiles)
     
    print1:
    mov al, [si]	;Déplace caractère à afficher dans AL
    or al, al		;Test de fin de variable (si AL = 0)
    jz STOP			;Si AL = 0 nouvelle ligne
     
    int 10h		;INT gestion affichage
    inc si		;Caractère suivant
    jmp print	;Boucle affichage
    ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
     
    ;-------------------------------------------------------------------------GESTION CLAVIER-----------------------------------------------------------------------------------------------------
    scan:
    mov ah, 01h	;Teste buffer clavier
    scan1:
    int 16h		;INT gestion clavier
    jz scan1		;Boucle si aucune touche pr�s�e
     
    xor ax, ax	;RAZ du code d'instruction
    int 16h		;INT gestion clavier
     
    cmp al, 13	;Test retour chariot
    je STOPSCAN	;Fin de la fonction si retour chariot
     
    mov [si], al	;Met le caract�re �crit dans si
    mov ah, 0Eh	;Code d'instruction �criture d'un caract�re
    int 10h		;INT gestion affichage
     
    inc si		;Passe à l'octet suivant de la variable
    jmp scan		;Boucle
     
    STOPSCAN:	;Sortie de fonction
    mov ah, 03h     ;
    int 10h         ;
    inc dh         ;Nouvelle ligne
    xor dl, dl      ;
    mov ah, 02h     ;
    int 10h         ;
    mov [si], dl ;Fin de variable 0 à la fin dl = 0
    ret
    ;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    STOP:
    ret
    Le problème semble se situer au niveau du saut de ligne (STOPSCAN)

    Globalement le programme :
    Clavier --> affiche ce que j'écris + change la valeur de string:
    String: --> Affiche string

    Sauf que comme on peut le voire sur la photo, la première ligne (que je viens d'écrire) s'affiche correctement mais après le saut de ligne, un espace de source inconnu (alien peut-être) s'affiche à la place de mon 't'

    Ça doit maintenant faire une semaine que je bloque, je vous en prie venez-moi en aide

    Merci beaucoup

    Nom : bug de l'infini.JPG
Affichages : 335
Taille : 110,6 Ko

  20. #20
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    14 356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 14 356
    Points : 33 022
    Points
    33 022
    Par défaut
    Dans la fonction FUNC-IO.asm, ligne 30, le caractère lu au clavier est affiché à l'écran. Ca ferait pas double emploi avec l'affichage des caractères du buffer effectués par print ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2014, 10h22
  2. Réponses: 2
    Dernier message: 14/04/2014, 16h38
  3. [Kylix] problème d'affichage
    Par scalvi dans le forum EDI
    Réponses: 1
    Dernier message: 18/06/2003, 10h07
  4. Réponses: 1
    Dernier message: 06/03/2003, 11h57
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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