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 :

[TASM][Débutant] Fonction 0AH de l'interruption 21h


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [TASM][Débutant] Fonction 0AH de l'interruption 21h
    J'ai lu les tutoriels et je reste devant une énigme (fonction 0ah de l'interruption dos, cad celle qui choppe la chaine de caractère entrée au clavier).

    J'ai recopié la méthode exposée dedans et elle ne fonctionnait pas. J'ai ensuite recopié une méthode d'un programme et celle la fonctionne. Le petit hic c'est que je ne vois pas pourquoi l'une fonctionne et l'autre pas.

    Ensuite, j'ai complété le programme qui marchait pour en compter le nombre de voyelles et le nombre de caractères (je sais que le second octet normalement le ferait mais je ne sais comment l'atteindre) alors j'ai fait une boucle comparant une chaine comprenant les 12 caractères voyelles - enfin bref vous le verrez dans le code ...

    Voici le prog de voyelle... Le problème c'est qu'il n'affiche rien de correct en ce qui concerne le nombre de voyelles et de caractères (la conversion num=>ASCII semble ne pas s'effectuer et il ne comptabilise aucune voyelle).

    Information complémentaire : j'utilise TASM sous Windows
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    .MODEL SMALL
    .STACK 128
     
    ;---------------------------- Donn‚es ------------------------------------------------;
     
    .DATA
     
     
     
    TEXT1		db 13,10,' Veuillez entrer la chaine de caractere:',13,10,'$'
    CHAINE1		db 50
    		db ?
    CHAFF		db 50 dup('$')
    		db '$'
    CRLF		db 13,10,"$"	
    voyelle 	db "aeuioyAEUIOY$"
    textevoyelle 	db 13,10,"Nombre de voyelle : "
    textecar	db 13,10,"Nombre de caractŠre: "
    v		db 0d
    c		dw 0d
     
     
     
     
     
     
    ;*--------------------------- Programme ---------------------------------------------*;
     
     
    .CODE
     
     
    DEBUT:
    mov AX,@DATA
    mov DS,AX       ; DS contient l'adresse du debut du segment de donnée
    		; Par rapport au debut de la RAM
     
     
    mov ah,09h
    lea dx,TEXT1				    
    int 21h
     
    mov ah,0Ah
    lea dx,CHAINE1
    int 21h
     
    mov ah,09h
    lea dx,CRLF			    
    int 21h
     
    mov ah,09h
    lea dx,CHAFF			    
    int 21h
     
        cld ; assure l'incrementation
     
        lea si,CHAFF;
        lea di,voyelle ;
        car_suiv :
     
        lods chaff;
        cmp al,"$";
        je Affichagec;
        inc c;
     
    	mov cx,13		;charge le compteur avec le nombre de voyelles (a,e,i,o,u)		
    	repne	scasb	;compare al avec ES:DI (voyelle)
     
    	cmp cx,0;si cx = 0 cela veut dire que le caractère n'est pas une voyelle
    	je car_suiv;
    	inc v;
    	mov si, c; affecte la position dans le scannage de la chaine a 'SI' afin de pouvoir charger le caractère suivant
    	jmp car_suiv;
     
     
        Affichagec : 
     
     
     
    			mov ah,09h
    			lea dx,textevoyelle		;affiche le nombre de voyelle
    			int 21h
     
    			add v,30h
    			mov dl, v
    		;	add dx,0030h ; conversion num=>ASCII
    			mov ah,02h
     
    			int 21h
     
    			mov ah,09h
    			lea dx,textecar		;affiche la chaine introduite
    			int 21h
     
    			mov dx,c
    			add dx,002Fh ; conversion num=>ASCII			
    			mov ah,09h
    			int 21h
     
     
    mov AX, 4C00h
    int 21h
     
    end
    Voici le prog dont rien ne fonctionne
    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
     
       .MODEL SMALL
       .STACK 256
       ;------------------------------------------------------------
       .DATA
       messageintro 	db 10,13,"Debut du programme ",10,13,"$"
       maChaine             db 50, ?
       Blackmetal           db 50 dup(?),'$'
       inverse 		db 50 DUP(" ")
       num 			db 0d
       nbcar		db ?
       ;------------------------------------------------------------
       .CODE
       MOV AX,@DATA
       MOV DS, AX
     
       mov ah,09h
       lea dx, messageintro
       int 21h
                   ;saisie de la chaine
       mov ah,0ch            
       mov al,0ah
       mov dx,offset maChaine
       int 21h
     
       mov ax,dx
     
    ;   lea dx,dl 
       mov ah,02h
    ;LEA dx,Blackmetal        ;affiche la chaine de départ
    int 21h
     
    mov ax ,4c00h
    int 21h
    END
    Un grand merci à ceux qui se pencheront sur mon problème et qui éclaireront ma lanterne.

  2. #2
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 187
    Points : 73
    Points
    73
    Par défaut
    Fonction 0Ah
    Permet de saisir une chaîne de caractère au clavier. La saisie s'arrête quand on tape la
    touche entrer, le caractère CR (13) est mémorisé avec la chaîne
    Paramètres
    DX : adresse du buffer (zone mémoire tampon) où seront stockés la longueur de la chaîne ainsi que la chaîne saisie
    [DX] : longueur max. avant d'appeler la fonction, il faut placer dans le premier octet du buffer la longueur max à ne pas dépasser, il faut compter le CR.
    Une fois la saisie terminée, la fonction place dans le deuxième octet du buffer le
    nombre de caractère effectivement saisi. La chaîne saisie est placée tous de suite derrière.

Discussions similaires

  1. Réponses: 10
    Dernier message: 18/01/2010, 18h51
  2. Réponses: 0
    Dernier message: 01/05/2009, 18h18
  3. Fonction 0Ah de l'interruption 21h
    Par REANS dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 12/04/2009, 11h27
  4. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  5. [Ada] [Débutant] Fonction et Put_Line
    Par hitchie dans le forum Ada
    Réponses: 1
    Dernier message: 18/10/2004, 09h44

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