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

Assembleur Discussion :

Affichage d'une chaîne saisie au clavier


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Affichage d'une chaîne saisie au clavier
    Bonjour tout le monde,

    Voila je débute en ASM (TASM sous WinXP) et j'essaye de faire un petit programme qui affiche a l'écran ce que je saisis juste avant (il y aurait donc deux fois le meme message). Le probleme est que...ca ne fonctionne pas; quelqu'un pourrait m'aider ?:

    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
    .386
    gruik segment use16
    assume CS:gruik, DS:gruik, SS:gruik
    org 100h
    debut:
         ecran db 255 dup (253)
         mov DX,offset ecran
         mov AH,0Ah
         int 21h
    ret
         mov AH,09h
         int 21h
    ret
    gruik ends
    end debut
    Balises code ajoutées par Alcatîz.
    Titre également modifié.
    Merci d'y penser à l'avenir


    Merci d'avance pour vos réponses.

    ==============================================
    Notre plus grande gloire n'est pas de ne jamais tomber, mais de toujours nous relever lorsque nous tombons

  2. #2
    Invité
    Invité(e)
    Par défaut Réponse
    Hello,

    Ton programme me semble assez bizarre. Si tu saisis une chaîne de caractères au clavier et que tu appuies sur ENTER ensuite, il faut réaliser une petite partie de code qui vienne mettre le caractère de fin de chaine ($) à la place du return afin de ne pas lire tout le buffer au moment de l'affichage de celui-ci, non ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ok, j'ai fait quelques progres , maintenant le programme lit sans problemes ce que j'entre a l'écran...mais il ne l'affiche pas par la suite, pourtant le programme a l'air correct a mes yeux:

    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
    .386 
     
    gruik segment use16 
     
    assume CS:gruik, DS:gruik, SS:gruik 
     
    org 100h 
     
    debut: 
     
      ecran db 255 dup (253) 
      mov DX,offset ecran 
      mov AH,0Ah 
      int 21h 
     
    ret 
     
      mov AH,09h 
      mov DX,offset affiche
      int 21h 
     
    ret 
     
    affiche dw ecran,'$'
     
    gruik ends 
     
    end debut

  4. #4
    Invité
    Invité(e)
    Par défaut Réponse
    Re,

    J'ai du mal à comprendre ta façon de programmer.
    Par exemple, lorsque tu veux entrer ta chaîne de caractères et également quand tu l'affiches, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov DX,offset ecran
    Hors, tu dois charger l'adresse effective de début du buffer, ceci grâce à l'instruction LEA (Load Effective Adress). Voici ton programme à ma sauce, avec un buffer pouvant accueillir 254 caractères (255 avec le CR) :


    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
     
    .MODEL SMALL
    .STACK
    .DATA
            BUF DB 255,?,255 DUP (?)  ; DECLARATION DU BUFFER
     
    .CODE
            MOV AX,@DATA           
            MOV DS,AX               ; SEGMENT DE DONNEES
     
     
            MOV AH,0AH              ; LECTURE D'UNE CHAINE DE CARACTERES
            LEA DX,BUF
            INT 21H
     
            LEA BX,BUF              ; PLACE LE '$' A LA PLACE DU RETURN
            ADD BX,1     
            MOV AL,[BX] 
            MOV AH,0     			
            ADD BX,AX       
            ADD BX,1		
            MOV [BX],BYTE PTR '$'
     
            LEA BX,BUF		        ; LECTURE DU BUFFER
            ADD BX,2		
            MOV AH,09H     
            LEA DX,[BX]     
            INT 21H           
     
            MOV AX,4C00H            ; REND LA MAIN AU DOS
            INT 21H
            END

  5. #5
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    L'instruction
    Fait exactement la même chose que
    Citation Envoyé par did2604
    grâce à l'instruction LEA (Load Effective Adress)
    "Offset" et "Effective Address" sont synonymes.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci pour les réponses , c'est sympa de se faire aider quand on est dans le ****. J'ai essayé ton programme mais il se passe exactement la meme chose qu'avec le mien...c'est a dire que le programme attends que j'entre une chaine de caractere, je la tape, ensuite je tape entrée et hop, il rend la main au dos...alors qu'il aurait du réafficher la chaine.
    Est il possible qu'il copie cette chaine de caractere exactement à la meme position que la 1ere ? (ce qui ferai qu'on croirait qu'il n'affiche rien).

    Je vais essayer d'enlever le premier 'ret' de mon prog, voir ce que ça donne. (ret en TASM rend la main au dos, pas besoin de l'int).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ok il se passe quelque chose: il affiche la chaine par dessus l'autre (enfin je crois), car il affiche exactement les memes lettres SAUF la premiere, qui est un espece de smiley lol. Tu sais ce que ça signifie ? Quelle est l'interruption pour effacer l'écran ? je ne le trouve ni sur le forum ni sur mon bouquin.

    Encore merci d'avance pour ton aide .

  8. #8
    Invité
    Invité(e)
    Par défaut Réponse
    "Offset" et "Effective Address" sont synonymes.
    Merci de l'information Alcatîz, on en apprend tous les jours

    J'ai essayé ton programme mais il se passe exactement la meme chose qu'avec le mien
    Normal, faut positionner le curseur sur une autre partie de l'écran sinon il affiche au même endroit, je l'avais omis lors de la conception (rapide) de mon petit programme exemple

    Pour positionner le curseur : fonction 02h/int 10h
    AH<-02H
    BH<- PAGE ECRAN
    DH<-LIGNE
    DL<-COLONNE

    Donc, ton raisonnement est exacte, la chaine est affichée au même endroit que celle rentrée précédemment

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ok, merci beaucoup a tous les deux pour vos réponses . Le programme fonctionne maintenant...mais il n'affiche pas le message que j'entre. Quoique je tape, il affichera un smiley et un seul (a l'endroit où je décide, c'est deja ca lol). Voila mon programme actuel:

    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
     ecran db 255 dup (253) ; saisie de la chaîne
      mov DX,offset ecran 
      mov AH,0Ah 
      int 21h 
     
      mov AH,02h                 ; positionnement du curseur
      mov BH,roar
      mov DH,ligne
      mov DL,colonne
      int 10h
     
      mov AH,09h                 ; affichage de la chaine
      mov DX,offset affiche 
      int 21h 
     
    affiche dw ecran,'$' 
    ligne db 20
    colonne db 30
    roar db 0
    Désolé sincerement pour toutes ces questions, c'est mon tout premier programme sans aide (enfin a part la votre ), et je suis pas tres doué apparemment. Arf, j'ai la tête en compote a penser a tous ces registres, adresses mémoires etc...j'ai juste quelques notions de Qbasic d'il y a trés longtemps .

  10. #10
    Invité
    Invité(e)
    Par défaut
    Lorsque tu mets ton caractère de fin de chaine ($) à la place du RETURN, te replaces-tu au début de ta chaine en passant les deux premiers caractères de contrôle avant de lire la chaîne ?

    Car si tu lis la chaîne à partir de là où tu as mis ton '$', tu vas avoir tout et n'importe quoi, il faut te repositionner au début

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ok j'ai trouvé le probleme, le programme final (ou presque) est:

    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
    .386 
     
    gruik segment use16 
     
    assume CS:gruik, DS:gruik, SS:gruik 
     
    org 100h 
     
    debut:
     
      ecran db 255 dup (?)     
     
      mov DX,offset ecran                   ; Saisie de la chaîne
      mov BX,0
      mov CX,255
      mov AH,0Ah 
      int 21h 
     
      mov AH,02h 		   ; positionnement curseur
      mov BH,roar 
      mov DH,ligne 
      mov DL,colonne 
      int 10h 
     
      mov AH,09h 
      mov DX,offset ecran                    ; affichage de la chaîne
      int 21h 
     
    ret 
     
    ligne db 20
    colonne db 30
    roar db 0
     
    gruik ends 
     
    end debut
    Il fonctionne tres bien a part un seul probleme...c'est ce fameux dollar. Comment le placer a la fin de la chaîne sans le taper pendant la saisie ?
    C'est ma derniere question promis .

  12. #12
    Invité
    Invité(e)
    Par défaut
    Il fonctionne tres bien a part un seul probleme...c'est ce fameux dollar.
    Il n'y a pas que ça, il n'affiche pas la chaîne de caractères rentrée

    Voir ce que j'ai mis dans un msg un peu plus haut pour le "$" et le repositionnement au début de la chaîne de caractères en passant les deux premiers caractères :
    a) pour mettre le "$" à la fin de ta chaine, tu charges l'adresse effective du début de ta chaîne dans BX. Ensuite, tu places BX à la première "case", elle contient le nombre de lettres entrées par l'utilisateur, y compris le CR (Carriage Return) que je place dans AX. Je déplace alors mon pointeur BX du nombre de cases spécifié par AX. A cet instant, je suis donc au CR, et je le remplace par un "$" (dernière ligne)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    LEA BX,BUF              ; ou MOV BX, OFFSET BUF 
    MOV AL,[BX]
    MOV AH,0              
    ADD BX,AX             
    MOV [BX],BYTE PTR '$'
    b) pour lire la chaine, il faut repositionner le pointeur BX au début de la chaine en passant les deux premiers caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LEA BX,BUF		; ou MOV BX, OFFSET BUF
    ADD BX,2

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Arf lol, ça m'embete je n'aime pas ce genre de situation, surtout quand je suis nouveau sur ce forum. J'ai essayé ton code ça ne fonctionne pas .

    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
    ecran db 200 dup (?) 
     
    mov AH,3fh 
    mov BX,0
    mov DX,offset ecran 
    mov CX,200
    int 21h 
     
    mov AH,02h 
    mov BH,roar 
    mov DH,ligne 
    mov DL,colonne 
    int 10h 
     
    mov AH,09h 
    mov DX,offset ecran
    int 21h 
     
    ligne db 20 
    colonne db 30 
    roar db 0
    Celui la fonctionne, et affiche parfaitement la chaîne saisie, seulement je suis obligé de rajouter un $ à la fin de la chaîne pour que ce qui s'affiche s'arrête au bon endroit. Sans $ la chaîne s'affiche quand même mais avec le reste de la mémoire qui suis, ce qui est normal. Tu ne connais pas une autre méthode pour ce %$!£ dollar ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Voici le code complet qui fonctionne sans aucun problème, je viens de le compiler et de le lancer :
    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
     
    .MODEL SMALL
    .STACK
    .DATA
            BUF DB 200,?,200 DUP (?)  
     
    .CODE
            MOV AX,@DATA        ; définition du segment de données       
            MOV DS,AX              
     
            MOV AH,0AH          ; scan de la chaîne    
            LEA DX,BUF
            INT 21H
     
            MOV AH,02H          ; positionnement pour le display   
            MOV BH,0               
            MOV DH,20                
            MOV DL,30              
            INT 10H
     
            LEA BX,BUF          ; ajout du '$' de fin de chaîne   
            ADD BX,1                
            MOV AL,[BX]             
            MOV AH,0                				
            ADD BX,AX               
            ADD BX,1		
            MOV [BX],BYTE PTR '$'   
     
            LEA BX,BUF	       ; on passe les 2 premiers caractères	
            ADD BX,2	         ; de début de la chaine	
     
     
            MOV AH,09H          ; on affiche la chaîne     
            LEA DX,[BX]             
            INT 21H                 
     
            MOV AX,4C00H        ; on rend la main au DOS       
            INT 21H
            END
    J'ai voulu partir de ton programme, mais cette façon de coder ne me plait pas. De plus le code que tu m'as donné ne veut absolument pas tourner, avec TASM comme avec MASM, de plus, au niveau du link, j'ai une erreur de stack. Ce code ci fonctionne, à toi de voir si tu veux l'adapter à ta façon de programmer ;-)

  15. #15
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Pour éviter le problème du fameux '$' terminal, il suffit de déclarer le buffer en mémoire comme ceci :
    Ainsi, la chaîne entrée au clavier sera toujours suivie d'un '$', même si les 200 caractères maximum sont atteints
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  16. #16
    Invité
    Invité(e)
    Par défaut
    Pas bête du tout, je ne connaissais pas cette technique, ça évite de se casser la tête pour rien

    J'espère que tout ceci profitera également à Frenchghost

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Boulalalalalala, c'est tellement évident une fois qu'on a vu la réponse, j'en ai presque honte de moi lol. Merci bien tous les deux pour votre aide ! . J'espère pouvoir aider des nouveaux un jour aussi, quand je serai un peu plus confirmé .

    Le code final donne (il fonctionne tres bien ):

    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
    .386 
     
    gruik segment use16 
     
    assume CS:gruik, DS:gruik, SS:gruik 
     
    org 100h 
     
    debut: 
     
    ecran db 200 dup ('$')
     
      mov AH,3fh                 ;saisie de la chaîne
      mov BX,0
      mov DX,offset ecran
      mov CX,199
      int 21h
     
      mov AH,02h                 ;positionnement du curseur
      mov BH,roar
      mov DH,ligne
      mov DL,colonne
      int 10h
     
      mov AH,09h                 ;affichage de la chaîne
      mov DX,offset ecran
      int 21h
     
    ret 
     
    ligne db 20
    colonne db 30 
    roar db 0 
     
    gruik ends 
     
    end debut

  18. #18
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Frenchghost
    J'espère pouvoir aider des nouveaux un jour aussi
    Ton aide sera la bienvenue !

    A présent, il ne te reste plus qu'à cliquer sur le bouton "Résolu" en bas et à gauche de la page.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

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

Discussions similaires

  1. Saisie et affichage d'une chaîne de caractères
    Par thouraya24 dans le forum x86 16-bits
    Réponses: 8
    Dernier message: 13/04/2009, 19h01
  2. recuperer une chaine saisie en clavier
    Par salim81 dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2006, 10h31
  3. Parser une ligne saisie au clavier.
    Par Sylmandel dans le forum C++
    Réponses: 5
    Dernier message: 17/10/2005, 10h12
  4. Problème d'affichage d'une chaîne à l'écran
    Par Bubonik software dans le forum C
    Réponses: 7
    Dernier message: 08/05/2004, 20h47
  5. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01

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