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 code source affichage du nom de l'utilisateur


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Problème code source affichage du nom de l'utilisateur
    Bonjour,

    Je suis débutant en nasm et je voulais faire un programme qui demande le nom de l'utilisateur et qui lui renvoie un message du genre "vous vous appelez Bernard" par exemple. Voici mon code source :
    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
    section .text
    org 100h
    mov dx,msg
    mov ah,9 ;afficher message
    int 21h 
     
     
    MOV DX, message_entree
    MOV AH, 0Ah ;entrée de l'utilisateur
    int 21h
     
    mov dx,msg2
    mov ah,9 ; affichage de "ah vous vous apellez..."
    int 21h
     
    mov dx,message_entree
    mov ah,9 ; ça cloche ici !!!
    int 21h
     
    MOV DX, message_entree
    MOV AH, 0Ah ;entrée de l'utilisateur pour pause
    int 21h
     
    mov ah,4Ch ;fin d'un exe
    int 21h
     
     
     
    section .data
    msg db 'Comment vous appelez vous ?',0Dh,0Ah,'$'
    msg2 db "Vous vous appelez donc", '$'
     
    section .bss
    message_entree times 100 resb '?'

    Mon problème est que je n'arrive pas à ré-afficher le nom de l'utilisateur avec l'interruption 21h dans "message_entree".

    Merci d'avance pour vôtre aide.

  2. #2
    Expert éminent sénior
    Avatar de JML19
    Homme Profil pro
    Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Inscrit en
    Décembre 2010
    Messages
    15 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2010
    Messages : 15 022
    Points : 23 403
    Points
    23 403
    Billets dans le blog
    10
    Par défaut
    Bonsoir

    L'instruction d'affichage est 09h de l'int 21h et pas 9

    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
    section .text
    org 100h
    mov dx,msg
    mov ah,09h ;afficher message
    int 21h 
     
     
    MOV DX, message_entree
    MOV AH, 0Ah ;entrée de l'utilisateur
    int 21h
     
    mov dx,msg2
    mov ah,09h ; affichage de "ah vous vous apellez..."
    int 21h
     
    mov dx,message_entree
    mov ah,09h ; ça cloche ici !!! ====> c'est 09h et pas 9
    int 21h
     
    MOV DX, message_entree
    MOV AH, 0Ah ;entrée de l'utilisateur pour pause
    int 21h
     
    mov ah,4Ch ;fin d'un exe
    int 21h
     
     
     
    section .data
    msg db 'Comment vous appelez vous ?',0Dh,0Ah,'$'
    msg2 db "Vous vous appelez donc", '$'
     
    section .bss
    message_entree times 100 resb '?'

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Hia,
    Citation Envoyé par JML19 Voir le message
    L'instruction d'affichage est 09h de l'int 21h et pas 9
    En l'occurrence, ça ne change rien (9 en hexa est la même chose que 9 en décimal).

    Mais c'est quand même une bonne habitude de préciser les valeurs comme elles sont données dans les docs.

  4. #4
    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 : 49
    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 : 1 905
    Points
    1 905
    Par défaut
    Bonjour,

    Je n'ai jamais utilisé cette fonction du DOS (0Ah : lecture d'une chaine)
    mais visiblement le buffer doit être paramétré avec :
    Octet 00h (1octet) : Nombre maxi de caractères du buffer
    Octet 01h (1octet) : Nombre de caractères actuellement lus
    Octet 02h (n octets) : le contenu à proprement parler

    a+ François

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    @Forthman :

    C'est ça, merci ! Mais pourquoi quand je mets juste la phrase comme elle est, ça ne marche pas ? Pourtant chaque caractère ASCII a une valeur numérique, non ?

    Et je ne comprends pas ce que signifie "nombre de caractères actuellement lus". Peux tu m'expliquer ?

  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 : 49
    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 : 1 905
    Points
    1 905
    Par défaut
    Comme je l'ai dit, je n'ai jamais utilisé cette fonction du DOS (je n'ai jamais
    beaucoup utilisé les fonctions du dos en général)

    J'imagine que la lecture des caractères s'arrête après l'appui sur la touche
    "entrée"

    Dans ce cas il serait logique que le nombre de caractère entrés soit dans l'octet 01h (le deuxième octet en fait)

    Par exemple tu définis une longueur maxi de chaine (64 caractères au hasard)
    tu auras donc :
    octet 00h = 64
    octet 01h = ?? (on s'en fout c'est la fonction dos qui placera le nombre de caractères)
    octet 02h = allocation de 64 octets correspondant au 64 caractères.

    Si ça ne marche toujours pas, je ferai un petit test de mon coté.

    a+ François

  7. #7
    Expert éminent sénior
    Avatar de JML19
    Homme Profil pro
    Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Inscrit en
    Décembre 2010
    Messages
    15 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2010
    Messages : 15 022
    Points : 23 403
    Points
    23 403
    Billets dans le blog
    10
    Par défaut
    Bonsoir

    En TASM j'écrirais comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Texte_entree DB 255 DUP (50) ; Zone de 50 caractères
     
    Mov Dx, Offset Texte_entree
    Mov Di,Dx
    Mov Byte ptr [Di],40 ; Lire maximum 40 caractères
     
    Mov Ah,0Ah
    Int 21h

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2010
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je comprends pas trop ce que tu fais JML19.

    Sinon comment utilise-t-on "times" en nasm par exemple si je veux déclarer le premier octet de message_entree à 100, le deuxième à 0, et ensuite encore 100 à '$' ?

  9. #9
    Expert éminent sénior
    Avatar de JML19
    Homme Profil pro
    Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Inscrit en
    Décembre 2010
    Messages
    15 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Retraité : Electrotechnicien Electronicien Informaticien de la SNCF
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2010
    Messages : 15 022
    Points : 23 403
    Points
    23 403
    Billets dans le blog
    10
    Par défaut
    Bonjour

    Times : Répétition d'Instructions ou Données
    Le préfixe Times indique que l'instruction assemble des temps multiples. C'est une partie présente comme l'équivalent en NASM'S de la syntaxe DUP supportée par des assembleurs MASM-COMPATIBLES, dans lesquels tu peux coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte_Entree : Times 64 db 0
    Cela veut dire recopier 64 fois 0 dans la mémoire.

    Semblables; mais Times est plus polyvalents que cela. L'argument Times n'est pas juste un numérique constant, mais une expression numérique, donc tu peux faire des choses comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Texte_Entree : Times 64-$+buffer db ' '
    Qui stockera assez d'espaces pour faire la longueur totale jusqu'à 64.

    Times peut être appliqué aux instructions ordinaires, donc tu peux y coder des boucles déroulées :

    Note : Qu'il n'y a aucune différence effective entre des temps « 100 resb 1 » et « resb 100 », sauf que le dernier sera assemblé environ 100 fois plus rapidement en raison de la structure interne de l'assembleur.

    L'opérande Times, comme celui d'EQU et celui de RESB, est une expression critique

Discussions similaires

  1. Problème code source calculatrice !
    Par MarvinBosst dans le forum C++
    Réponses: 8
    Dernier message: 30/03/2015, 19h43
  2. Problème code source SQL d'un formulaire
    Par vbenjamin dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 14/08/2012, 10h37
  3. Problème code source debutant
    Par donald54470 dans le forum Débuter
    Réponses: 10
    Dernier message: 23/07/2011, 23h09
  4. Problème Code Source de la page
    Par imparator_42 dans le forum VBScript
    Réponses: 11
    Dernier message: 14/04/2008, 11h33
  5. Affichage de caractère spéciaux absent dans le code source
    Par HNT dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 03/11/2005, 22h38

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