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éterminer si une chaîne est un palindrome


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 11
    Points
    11
    Par défaut Déterminer si une chaîne est un palindrome
    Bonsoir à tous,
    alors voilà comme l'indique le titre je débute en ASSEMBLEUR et je sais je sais l'aaassseeeembleeeeeur! Il date dis-donc plus personne ne programme en assembleur et tout et tout mais bon comme tout futur informaticien qui se respecte je dois passer par cette case doooonc, venons-en aux faits vous voulez bien?

    Donc il faut écrire une portion de programme qui permette la saisie et l'affichage d'une chaine de caractères puis d'afficher la chaine miroir (inverse) de la chaine saisie puis finalement de dire si c'est un palindrome ou pas, j'ai essayé quelque chose et j'ai un petit souci au niveau de la partie palindrome. En effet quand c'en est un il m'affiche que c'est un palindrome mais il affiche aussi le message qui vient après "Ce n'est pas un palindrome" alors qu'il ne devrait pas! Il y a deux messages à afficher selon si c'est ou pas un palindrome et quand c'en est un il affiche les deux mais quand ce n'est pas un palindrome il affiche un seul message je ne comprends pas pourquoi mon code m'a l'air correct je vous laisse juger. Si vous le tester, veuillez tester des palindromes strict parce que je n'ai pas encore traités tous les cas, notamment quand la chaine contient des espaces et des symboles etc. Essayez RADAR par exemple.


    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
    data segment
        chaine1 db 0ah,0dh,0ah,0dh,"Veuillez saisir une phrase:",0ah,0dh,'$'
        chaine2 db 0ah,0dh,0ah,0dh,"Votre phrase:",0ah,0dh,'$' 
        chaine3 db 0ah,0dh,0ah,0dh,"Phrase inverse:",0ah,0dh,'$'
        chaine4 db 0ah,0dh,0ah,0dh,"C'est un palindrome strict.",0ah,0dh,'$'
        chaine5 db 0ah,0dh,0ah,0dh,"Ce n'est pas un palindrome.",0ah,0dh,'$'
        chaine  db 250 dup (?)
        taille  db ?
        pkey    db 0ah,0dh,0ah,0dh,"Tapez une touche...$"
    ends
    
    stack segment
        dw   128  dup(0)
    ends
    
    code segment
    start:
    
        mov ax, data
        mov ds, ax
        mov es, ax 
        
        ;PROGRAMME
        lea dx,chaine1
        mov ah,09h
        int 21h
        
        mov byte ptr chaine,250
        mov ah,0ch
        ;lecture de la chaine
        lea dx,chaine
        mov ah,0ah
        int 21h
        
        lea dx,chaine2
        mov ah,09h
        int 21h
        ;affichage de la chaine
        mov dl,[chaine+1]
        mov taille,dl
        
        mov cl,taille
        mov ch,0
        mov si,2
        
        mov ax,2424h
        push ax 
         
        refaire:mov dl,chaine[si]
                mov ah,02h
                int 21h 
                
                mov al,chaine[si]
                mov ah,chaine[si+1]
                push ax
                inc si
        loop refaire
        ;affichage de la chaine inverse
        lea dx,chaine3
        mov ah,09h
        int 21h
        
        mov cl,taille
        mov ch,0
        recommencer: pop ax
        mov dx,ax
        mov ah,02h
        int 21h
        loop recommencer
        
        mov si,2
        mov cl,taille
        mov ch,0
        mov di,cx 
        inc di
        ;traitement de palindrome
        strict: mov al,chaine[si]
                mov bl,chaine[di]
               
                cmp al,bl
                jnz nonstrict
                inc si
                dec di
        loop strict
        
             lea dx,chaine4 
             mov ah,09h
             int 21h     
        
        nonstrict: lea dx,chaine5
                   mov ah,09h
                   int 21h          
        lea dx,pkey
        mov ah,09h
        int 21h
        
        mov ah,01h
        int 21h 
               
    ends
    
    end start
    Aussi si vous avez remarqué, j'ai traité toute la chaine du début à la fin alors que ce n'est pas optimal, je ne devrais tester que la moitié, en utilisant deux indices de parcours, le premier commence par le début de la chaine le second par la fin et devraient se rencontrer au milieu, si vous pouviez m'aider ce serait trop sympa de votre part. Je vous prie de bien vouloir considérer mes deux petits soucis et de m'aider du mieux que vous pouvez.

    Merci pour votre temps
    Bonne soirée

  2. #2
    Membre averti
    Avatar de Kyuudan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 100
    Points : 308
    Points
    308
    Billets dans le blog
    1
    Par défaut
    Salut !

    Mama ça fait une éternité que j'ai pas fait de l'assembleur !! Je comprend plus rien mais si je me penchais de nouveau sur le sujet ça reviendrait vite
    J'ai déjà fait un projet de palindrome en assembleur et si je le retrouve ce soir je te le posterai.
    En espérant que ça puisse t'aider.

    Cordialement,
    «Soyez la mesure de la qualité. De nombreuses personnes n’ont pas l’habitude d’un environnement où ce qui est attendu, c’est l’excellence.» Steve Jobs

    Pense à mettre un !

    de mettre vos sujets en une fois que vous avez la réponse à votre question !

  3. #3
    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 : 48
    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,

    normal, tu n'as pas de saut pour éviter l'affichage suivant une fois que la chaîne "c'est un palindrome" s'est affichée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            int 21h     
     
        nonstrict: lea dx,chaine5
                   mov ah,09h
                   int 21h          
        lea dx,pkey
    modifié comme ça, ça devrait déjà mieux marcher (j'ai pas regardé si autre chose clochait)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            int 21h     
        jmp la_suite
    
        nonstrict: lea dx,chaine5
                   mov ah,09h
                   int 21h 
      la_suite:          
        lea dx,pkey
    ...

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 11
    Points
    11
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    Forthman ça marche effectivement j'aurai du penser à rajouter un saut merci beaucoup pour le coup de main
    Kyuudan tu me serais d'une aide vraiment inestimable! J'ai quelques idées mais j'ai des soucis avec la mise en pratique. Dès que tu pourras et dès que tu l'auras retrouvé je te prie de me le poster je suis certaine que j'y trouverai une aide précieuse.

  5. #5
    Membre averti
    Avatar de Kyuudan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 100
    Points : 308
    Points
    308
    Billets dans le blog
    1
    Par défaut
    Je vais chercher ce soir sur mon DD externe et si je trouve ça je le poste sur ce topic
    «Soyez la mesure de la qualité. De nombreuses personnes n’ont pas l’habitude d’un environnement où ce qui est attendu, c’est l’excellence.» Steve Jobs

    Pense à mettre un !

    de mettre vos sujets en une fois que vous avez la réponse à votre question !

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 5
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,
    Je tiens à vous montrer mon programme final.
    Le programme doit accomplir ce qui suit:
    - Lecture d'une chaîne de caractères.
    - Affichage de la chaîne de caractères saisie.
    - Affichage de la chaîne miroir (chaîne inverse: affichage de la chaîne saisie de droite à gauche).
    - Dire si la chaine est:
    1. Un palindrome strict: contient soit des lettres majuscules uniquement, soit des lettres minuscules uniquement (exemple: RADAR ou radar)
    2. Un palindrome simple: peut contenir des majuscules des minuscules des caractères spéciaux des chiffres et des espaces, dans ce cas le programme ne devra considérer que les lettres et les convertir toutes soit en minuscule soit en majuscule pour dire ensuite si c'est un palindrome simple.
    3. N'est pas un palindrome.

    Mon code fonctionne normalement correctement j'ai testé différents cas de messages mais j'ai quelques doutes au niveau de l'optimisation, vous pourriez peut-être m'aider à le perfectionner? Je dois rendre mon travail ce samedi, donc essayez d'y jeter un coup d’œil rapide (mais minutieux HEIN ) et de me signaler le moindre problème je prend absolument toutes les remarques en considération. Vous pouvez me rajouter/supprimer des choses dans le but d'améliorer, ce que vous voulez. Je vous remercie infiniment d'avance.

    Voici mon code final:

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    data segment  
        chaine1 db 0ah,0dh,0ah,0dh,"Veuillez saisir une phrase:",0ah,0dh,'$'
        chaine2 db 0ah,0dh,0ah,0dh,"Votre phrase:",0ah,0dh,'$' 
        chaine3 db 0ah,0dh,0ah,0dh,"Phrase inverse:",0ah,0dh,'$'
        chaine4 db 0ah,0dh,0ah,0dh,"C'est un palindrome strict.",0ah,0dh,'$'
        chaine5 db 0ah,0dh,0ah,0dh,"C'est un palindrome simple.",0ah,0dh,'$'
        chaine6 db 0ah,0dh,0ah,0dh,"Ce n'est pas un palindrome.",0ah,0dh,'$'
        chaine  db 250 dup (?)
        taille  db ?
        pkey    db 0ah,0dh,0ah,0dh,"Tapez une touche...$"
    ends
     
    stack segment
        dw   128  dup(0)
    ends
     
    code segment
    start:
     
        mov ax, data
        mov ds, ax
        mov es, ax 
     
        ;PROGRAMME
        lea dx,chaine1
        mov ah,09h
        int 21h
     
        mov byte ptr chaine,250
        mov ah,0ch
     
        lea dx,chaine
        mov ah,0ah
        int 21h
     
        lea dx,chaine2
        mov ah,09h
        int 21h
     
        mov dl,[chaine+1]
        mov taille,dl
     
        mov cl,taille
        mov ch,0
        mov si,2
     
        mov ax,2424h
        push ax 
     
        refaire:mov dl,chaine[si]
                mov ah,02h
                int 21h 
     
                mov al,chaine[si]
                mov ah,chaine[si+1]
                push ax
                inc si
        loop refaire
     
        lea dx,chaine3
        mov ah,09h
        int 21h
     
     
        mov cl,taille
        mov ch,0
        recommencer: pop ax
                     mov dx,ax
                     mov ah,02h
                     int 21h
        loop recommencer
     
        mov si,2
        mov cl,taille
        mov ch,0
        mov di,cx 
        inc di
     
        strict: mov al,chaine[si]
                mov bl,chaine[di]
     
                cmp al,bl
                jnz nonstrict
                inc si
                dec di
        loop strict
     
             lea dx,chaine4 
             mov ah,09h
             int 21h 
     
        jmp fin    
     
        nonstrict: mov si,2
                   mov cl,taille
                   mov ch,0
     
                   convertir: cmp chaine[si],61h
                              jl balayer1
     
                              ;ici char>61h
                              cmp chaine[si],7ah
                              jg balayer1
     
                              ;ici 61h<char<7ah
                              sub chaine[si],20h
     
                              inc si
                              jmp convertir
     
                              balayer1: inc si   
     
                   loop convertir
     
                   mov si,2
                   mov cl,taille
                   mov ch,0
                   mov di,cx 
                   inc di
     
                   simple: mov al,chaine[si]
                           mov bl,chaine[di]
     
                           cmp al,20h
                           jz balayer2
     
                           cmp bl,20h
                           jz balayer3
     
                           cmp al,41h
                           jl balayer2
     
                           cmp bl,41h
                           jl balayer3
     
                           cmp al,5ah
                           jg balayer2
     
                           cmp bl,5ah
                           jg balayer3
     
                           cmp al,bl
                           jnz nonpalindrome
                           inc si
                           dec di
                           jmp simple
     
                           balayer2: inc si
                                     jmp fini
                           balayer3: dec di
                                     jmp fini
                   fini:loop simple
     
                   lea dx,chaine5
                   mov ah,09h
                   int 21h
                   jmp fin          
     
        nonpalindrome: lea dx,chaine6
                       mov ah,09h
                       int 21h
                       jmp fin
     
     
        fin: lea dx,pkey
             mov ah,09h
             int 21h
     
        mov ah,01h
        int 21h 
     
    ends
     
    end start
    Excellente soirée à tous

  7. #7
    Membre averti
    Avatar de Kyuudan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2015
    Messages : 100
    Points : 308
    Points
    308
    Billets dans le blog
    1
    Par défaut
    Salut !

    Alors en fouillant pendant un moment (c'est pour ça que j'ai mis autant de temps ^^) j'ai trouvé mes TP d'assembleur de DUT info.
    La version que je te passe et la dernière version normalement, elle est censé être fonctionnelle ! (Si je me suis pas trompé de version on croise les doigts).
    Si jamais tu vois qu'il ne marche pas c'est que j'ai dut me tromper dans ce cas je chercherai de nouveau la bonne version.

    Voilà en espérant que ça puisse t'aider !

    Cordialement,

    2-2.asm
    «Soyez la mesure de la qualité. De nombreuses personnes n’ont pas l’habitude d’un environnement où ce qui est attendu, c’est l’excellence.» Steve Jobs

    Pense à mettre un !

    de mettre vos sujets en une fois que vous avez la réponse à votre question !

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 18
    Points : 12
    Points
    12
    Par défaut la taille d une chaine comment était déterminer
    lea dx,chaine
    mov ah,0ah
    int 21h
    mov cl,[dx+1]
    j'ai pas compris pourquoi [dx+1] désigne le nombre des caractères saisie??

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par asma ch Voir le message
    lea dx,chaine
    mov ah,0ah
    int 21h
    mov cl,[dx+1]
    j'ai pas compris pourquoi [dx+1] désigne le nombre des caractères saisie??
    pour comprendre il faut se reporter à la doc de l'interruption 0x21 avec AH = 0xa ( http://spike.scu.edu.au/~barry/interrupts.html#ah0a )

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

Discussions similaires

  1. [Turbo Pascal] Déterminer si une chaîne est un palindrome
    Par devnino dans le forum Turbo Pascal
    Réponses: 19
    Dernier message: 01/05/2014, 23h22
  2. [Dev-Pascal] Déterminer si une phrase est un palindrome
    Par gilldas dans le forum Autres IDE
    Réponses: 2
    Dernier message: 10/06/2012, 10h38
  3. [DBF] Tester si une chaîne est vide
    Par ®om dans le forum JDBC
    Réponses: 7
    Dernier message: 26/07/2007, 16h30
  4. Voir si une chaîne est composée de nombre
    Par Destiny dans le forum C#
    Réponses: 2
    Dernier message: 26/04/2007, 09h56
  5. Réponses: 11
    Dernier message: 05/03/2006, 17h02

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