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 :

[Débutant] Inverser une chaîne de caractères


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut [Débutant] Inverser une chaîne de caractères
    Bonjour

    Je débute en assembleur et je cherche comment inverser une chaine de caractères; voici le travail que j'ai effectué jusqu'ici, je copie buffer1 dans buffer2, mon probléme est que je souhaiterais indiquer dans SI la position de la dernière lettre contenue dans BUFFER1, mais je ne sais comment faire. Merci de votre aide.

    Cordialement

    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
    data segment
    	mess1 DB 'entrez votre put1 de message'
    		  DB 10,13, '$'
    	mess2 DB 'votre message'
    		  DB 10,13, '$'
    	Buffer1 DB 10,?,11 DUP ('$')
    	Buffer2 DB 10,?,11 DUP('$')
     data ends 
     
    code segment
    	assume CS: code
    	debut:
    		mov ax,data
    		mov ds,ax
    	    mov ah,09h
    		mov dx,offset mess1
    		int 21h
    		mov ah,0Ah
    		lea dx,buffer1
    		int 21h
    		mov ah,09h
    		mov dx,offset mess2
    		int 21h
    		mov cx,0
    		mov cl,offset [buffer1+1]*
                                    ; ici est mon probléme
    		;lea SI,offset buffer1:[offset buffer1 + 1] 
                                    lea DI,buffer2
         trans:
    		mov AL,[SI]
    		mov [DI],AL
    		dec SI
    		inc DI
    		loop trans
    		;affichage de la chaine inversé
    		mov ah,09h
    		mov dx,offset buffer2 + 2
    		int 21h
    		;fin programme
    		mov ah,4Ch
    		int 21h
    	code ends
    	 end debut

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Voila je me suis aidé d'un poste qui traitait de la meme question et je suis parvenu a inverser la chaine, il reste un dernier probléme, et je crois que celui ci proviens du nombre de tour dans la boucle trans mais je ne suis pas sur, lors du derniére affichage, celui de la chaine inverser, il apparait un caractére en trop et qui n'a rien a voir avec le mot taper, je vous laisse regarder.
    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
    data segment
    	mess1 DB 'entrez votre put1 de message'
    		  DB 10,13, '$'
    	mess2 DB 'votre message'
    		  DB 10,13, '$'
    	Buffer1 DB 10,?,11 DUP ('$')
    	Buffer2 DB 10,?,11 DUP('$')
     data ends 
     
    code segment
    	assume CS: code
    	debut:
    		mov ax,data
    		mov ds,ax
    	    mov ah,09h
    		mov dx,offset mess1
    		int 21h
    		mov ah,0Ah
    		lea dx,buffer1
    		int 21h
    		mov ah,09h
    		mov dx,offset mess2
    		int 21h
    		mov cx,0
    		mov cl,offset buffer1+1
    		lea SI,buffer1
    		lea DI,buffer2
    		mov bh,0
     
    		;cherche fin de la chaine
    	trouve_null:
    	    mov  bl,[SI]
    		cmp  bl, '$' 
    		je   trans 
    		inc  si 
    		jmp  trouve_null
    		mov ah,0
     
    		;inversion chaine dans buffer2
         trans:
    		mov AL,[SI]
    		mov [DI],AL
    		dec SI
    		inc DI
    		loop trans
    		mov AL,'$'
    		mov [DI],AL
     
    		;affichage de la chaine inversé
    		mov ah,09h
    		mov dx,offset buffer2 + 2
    		int 21h
     
    		;fin programme
    		mov ah,4Ch
    		int 21h
    	code ends
    	 end debut

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    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 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Je crois que ça vient de l'initialisation du compteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mov cl,offset buffer1+1
    charge l'offset de Buffer1 + 1 et non la longueur de la chaîne.

    Sinon, pourquoi ne pas utiliser également cette valeur (la taille de la chaîne lue au clavier) pour calculer l'adresse du dernier caractère de la chaîne ? Ce serait nettement plus performant

    Bonne prog !
    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]

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    ba c'est ce que j essai de faire justement! Comment faire pour mettre la longueur de la chaine dans cl???

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    J'ai trouvé

    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
     
    data segment
    	mess1 DB 'entrez votre put1 de message'
    		  DB 10,13, '$'
    	mess2 DB 'votre message'
    		  DB 10,13, '$'
    	Buffer1 DB 10,?,11 DUP ('$')
    	Buffer2 DB 10,?,11 DUP('$')
     data ends 
     
    code segment
    	assume CS: code, DS:data
    	debut:
    		mov ax,data
    		mov ds,ax
    	    mov ah,09h
    		mov dx,offset mess1
    		int 21h
    		mov ah,0Ah
    		lea dx,buffer1
    		int 21h
    		mov ah,09h
    		mov dx,offset mess2
    		int 21h
    		mov cx,0
    		mov cl,buffer1[1]
    		mov SI,cx
    		inc si
    		lea DI,buffer2+2
    		mov bh,0
     
    		;inversion chaine dans buffer2
         trans:
    		mov AL,buffer1[SI]
    		mov [DI],AL
    		dec SI
    		inc DI
    		loop trans
    		mov AL,'$'
    		mov [DI],AL
     
    		;affichage de la chaine inversé
    		mov ah,09h
    		mov dx,offset buffer2 + 2
    		int 21h
     
    		;fin programme
    		mov ah,4Ch
    		int 21h
    	code ends
    	 end debut

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2013
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Octobre 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    C'est quoi le role de buffer1+1 et buffer2+2

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

Discussions similaires

  1. Inversion d'une chaîne de caractères
    Par camoa dans le forum x86 16-bits
    Réponses: 7
    Dernier message: 31/10/2011, 13h56
  2. Inverser une chaîne de caractères
    Par Nyko17 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 10/05/2008, 19h45
  3. Réponses: 3
    Dernier message: 24/10/2007, 01h47
  4. [Débutant] Parser et réordonner une chaîne de caractères
    Par Ykaar dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/06/2007, 12h51
  5. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09

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