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 :

Lire une chaine entrée au clavier


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 33
    Points
    33
    Par défaut Lire une chaine entrée au clavier
    Bonjour,

    J'utilise MASM ainsi que RadASM et je code en 16 bits! (mode DOS).

    Bref, je veux tout simplement vérifier que la valeur entrée au clavier soit la bonne.

    J'ai don fait ceci:

    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;modèle de mémoire type small
    .stack 100h;taille de la pile en héxa
     
    ;la section data est faites pour intialisé nos variables
    .data
    ;nombre décimal à convertir
    nombre db 10 dup("$");chaîne de caractère de 10 octets
    pair db 13,10,"Le nombre est pair$"
    impair db 13,10,"Le nombre est impair$"
    testok db 13,10,"OK",13,10,"$"
     
    ;section du code
    .code
    ;fonction main (pas obligatoire mais c'est plus bô)
    _main:
     
    	mov	ax,@data;adresse du contenu de segment
    	mov	ds,ax;on met ça dans le registre ds
     
    	;équivalent scanf
    	;RAPPEL: ah est le registre où le DOS iras cherché le numéro de la fonction à appeller
    	mov dx,offset nombre;le DOS stockera les valeurs entré dans nombre (à partir de l'adresse de dx)
    	mov ah,10;10 est la fonction "scanf"
    	int 21h
     
    	mov dx,offset saute
    	mov ah,09h;9 est la fonction "print"
    	int 21h	
     
    	mov dx,offset nombre
    	mov ah,09h;9 est la fonction "print"
    	int 21h
    Malheuresement cela ne m'affiche rien du tout! La demande de saisie est bonne, le OK c'est bon, mais quand je demande d'afficher la valeur que je veux entré rien ne s'affiche, on dirait qu'il ignore mon 2éme print...

    en espérant que vous puissiez m'aider,

    Cordialement,

    sushis

  2. #2
    Membre averti

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Points : 341
    Points
    341
    Par défaut
    Bonjour,

    De ce que je vois ici :
    http://www.gladir.com/LEXIQUE/INTR/i...htm?Target=ASM

    Ton tampon devrait être plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre: db 7, 0, 8 dup("$")
    Et pour l'affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov dx,offset nombre + 2
    mov ah,09h;9 est la fonction "print"
    int 21h
    Je n'utilise pas ton compilateur ni les fonctions DOS, donc je ne peux te garantir le fonctionnement de ceci.

    Néanmoins, voici ce qui se passe actuellement : tu demandes au DOS de lire une chaîne de caractères d'au plus (valeur ASCII de '$'), ce qu'il te fait, avec la possibilité d'écraser tout ce qu'il y a derrière. Ensuite, tu demandes d'afficher une chaîne de caractères qui commence par '$', son caractère de fin de chaîne. Le DOS affiche alors une chaîne vide. Pour vérifier ce que je raconte, remplace par , il devrait t'afficher des horreurs.

    J'espère avoir été clair.

    Cordialement,

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    La fonction 10 (0Ah) du DOS requiert un tampon contenant la chaîne terminée par le caractère 13 de la touche ENTRÉE plus deux octets. En effet, le premier octet du tampon renseigne le DOS sur le nombre maximum de caractères à entrer et le deuxième est le nombre de caractères entrés rapporté par le DOS.
    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
     
    .MODEL small
    .stack 100h
     
    lg_nombre	equ	10			; chaîne de 10 caractères
     
     
    .data
    nombre	db lg_nombre + 1, lg_nombre + 2 dup(?)	; Nb.car.max, nb.car.lus...
    pair	db 13,10,"Le nombre est pair$"
    impair	db 13,10,"Le nombre est impair$"
    testok	db 13,10,"OK"
    	CRLF	db 13,10,"$"
     
     
    .code
    _main	proc
     
    	mov	ax,@data
    	mov	ds,ax
     
    	mov	ah,10			; Entrée d'une chaîne de car.
    	mov	dx,offset nombre
    	int	33
     
    	mov	ah,9			; Affiche msg
    	mov	dx,offset CRLF		; Retour à la ligne
    	int	33
     
    	xor	cx,cx			; CX = 0
    	mov	cl,byte ptr nombre + 1	; Total à lire dans le compteur CX
    	mov	si,offset nombre + 2	; SI pointe 1er car. de la chaîne
    	mov	ah,2			; Affichage d'un car.
    Afficher:
    	lodsb				; Car. dans AL et SI incrémenté
    	mov	dl,al
    	int	33
    	loop	Afficher
     
    (...)

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2009
    Messages : 52
    Points : 33
    Points
    33
    Par défaut
    C'est fait! ça marche reste à comprendre le code (que je comprend dejà moitié c'est dejà ça) à partir de l'initialisation de cx.

    L'assembleur c'est vraiment bourin! (et ça rend fou!)

    Enfin, allez la route est dur la route est longuemais avec mon 4x4 ça passe tranquille mais j'y arriverais!!!!!

    http://www.digitalgames.fr/wp-conten...2/berserk3.jpg

    Merci pour tout!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    On peut garder la logique de votre programme :
    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
     
    .data
    nombre	db lg_nombre + 1, lg_nombre + 3 dup('$'); Nb.car.max, nb.car.lus...
    pair	db 13,10,'Le nombre est pair$'
    impair	db 13,10,'Le nombre est impair$'
    testok	db 13,10,'OK'
    	CRLF	db 13
    	LF	db 10,'$'
     
     
    .code
    _main	proc
     
    	mov	ax,@data
    	mov	ds,ax
     
    	mov	ah,10			; Entrée d'une chaîne de car.
    	mov	dx,offset nombre
    	int	33
     
    	mov	ah,9			; Affiche msg
    	mov	dx,offset CRLF		; Retour à la ligne
    	int	33
    	mov	dx,offset nombre + 2	; DX pointe 1er car. de la chaîne
    	int	33
    	mov	dx,offset LF		; Vu que l'entrée se termine par CR
    	int	33
     
    (...)

Discussions similaires

  1. lire une chaine qui est entre 2 symboles '
    Par tibofo dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 01/12/2008, 23h05
  2. recuperer une chaine saisie en clavier
    Par salim81 dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2006, 10h31
  3. REGEXP : recupérer une chaine entre deux autres chaines
    Par dude666 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/08/2006, 09h23
  4. Réponses: 4
    Dernier message: 29/05/2006, 15h27
  5. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37

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