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 :

Supprimer les espaces dans une chaîne


Sujet :

x86 16-bits Assembleur

  1. #1
    karaz_karaz
    Invité(e)
    Par défaut Supprimer les espaces dans une chaîne
    Bonjour, je suis débutant en Assembleur x86, j'ai voulu écrire l'algorithme suivant en Assembleur mais ça ne marche pas et je veux bien que quelqu'un me corrige mes erreurs et merci :
    On veut que le programme lise au clavier une chaîne de caractères et puis l'affiche et affiche cette même chaîne de caractères mais sans les espaces.
    Exemple : "salut ca va " ====> "salutcava"
    Mon algorithme est :

    j'utilise deux pointeurs, l'un d'écriture et l'autre de lecture
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tant que le caractère est différent de $ faire
          Si on lit un caractère different de "espace" alors
              je remplis la liste d'écriture par celle de lecture
              j'avance les deux pointeurs : lecture et écriture
         Sinon j'avance le pointeur de lecture seulement
         Fsi
    Fait
    Finalement, je parcours ma liste d'écriture pour l'afficher.

    Le code que j'ai écrit 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
    38
    39
    40
    ;----------------- Definition des données ------------------
     
    SEG_DON  Segment Para Public 'data' 
    ;------------------Les variables (DB, DW, DD, DQ, DT)-------
    message  db     13,10,'BONJOUR!!'
             db     13,10,"Ecrivez une chaine de caracteres,'$'
    chaine   db     100,0,100 dup(' ')                                    ;100 caractŠres maximum 
     
     
    dos      equ    21h
     
    CrLf	 db 	13,10,'$'
     
    SEG_DON  Ends                       
    ;------------------fin du segment---------------------------
     
    ;------------------------ Code -----------------------------
     
    SEG_CODE Segment Para Public
             Assume CS:SEG_CODE, DS:SEG_DON, ES:SEG_DON, SS:SSTACK
     
     
    start    Proc  Far
             mov ax,SEG_DON        ;adresse du Segment de données
             mov ds,ax             ;initialisation adresse Segment
             mov es,ax
     
             mov ah,9              ;fonction envoi d'un message a l'écran
             lea dx,message        ;adresse du message
             int dos               ;appel … ms-dos
     
             mov ah,10             ;fonction lecture clavier
             lea dx,chaine         ;adresse de la chaine saisie
             int dos               ;appel … ms-dos
     
             lea di,chaine         ;adresse du 1er caractère de la chaine saisie
             or  byte ptr [di],20h ;conversion du caractŠre en minuscule
             mov al,32h            ;caractère ' ' en hexadecimal = 32h
             scasb                 ;comparaison
             jz cond1              ;saut à cond1 si caractère est ' ' (espace)
    Dernière modification par Alcatîz ; 27/05/2008 à 22h26. Motif: balises code et orthographe

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    C'est moi ou il manque une partie du code ?

    mov al,32h ;caractère ' ' en hexadecimal = 32h
    Tu peux aussi écrire mov al, ' '.

    Voilà un code qui a l'air de fonctionner (avec MASM) :
    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
    .model small
    .stack 4096
    .386
     
    .data
            chaine db "salut ca va$"
     
    .code
    main proc
            mov ax, @data
            mov ds, ax
            mov es, ax
     
    ; Modification de la chaîne
            mov si, offset chaine
            sub si, 1
     
            ; On passe tous les caractères jusqu'à ce qu'on rencontre un espace
    suivant:
            add si, 1
            mov al, [si]
            cmp al, '$'
            je fin
            cmp al, ' '
            jne suivant
     
            mov bx, si
     
            mov al, [si]
     
    suivant2:
            cmp al, ' '
            je pasCopie  ; on copie tout sauf les espaces
     
            mov [bx], al
            add bx, 1
     
    pasCopie:
            add si, 1
     
            mov al, [si]
            cmp al, '$'
            jne suivant2
     
            mov byte ptr[bx], '$'
     
    fin:
    ; Affichage de la chaîne
            mov ah, 09h
            mov dx, offset chaine
            int 21h        
     
    ; Attente d'une touche
            mov ah, 01h
            int 21h
     
    ; Fin du programme
            mov ax, 4C00h
            int 21h
    main endp
     
    END main
    :wq

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Mau,
    mov al,32h ;caractère ' ' en hexadecimal = 32h
    Non, caractère ' ' = 32 décimal, = 20h.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Chaîne rentrée au clavier, non ? Si c'est le cas, tu compares chaque caractère lu par le controlleur du clavier à ' ', si la comparaison est satisfaite, tu ignores le caractère, si ce n'est pas le cas, tu l'ajoutes dans ton buffer .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

Discussions similaires

  1. Supprimer les espaces dans une chaîne de caractère
    Par Med_be dans le forum Débuter
    Réponses: 7
    Dernier message: 15/11/2010, 03h17
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. [XPATH] supprimer les espaces dans une chaîne
    Par joeyd dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 17/10/2007, 15h56
  4. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13
  5. supprimer les espaces dans une chaîne de caratères.
    Par Empty_body dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2006, 18h43

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