supprimer des voyelles dans une chaine de caracteres

supprimer des voyelles dans une chaine de caracteres - ASM - Programmation

Marsh Posté le 05-03-2017 à 19:22:26    

Bonjour,
 
le code que j'ai ecrit supprime(ou plutot fait un mov du caractère qui se trouve dans la case avant la voyelle dans la case où est la voyelle) et ç'est pas ça ce que je voulais faire. Je voudrais trouver les voyelles dans ma chaine et les supprimer sans rien mettre à la place... peut être en reduisant la taille de la chaine de caractères ???
la graine de poivre doit devenir l grn d pvr
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="La graine de poivre";
  5. int i;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp i, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi-1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov eax,TAILLE_VECTEUR
  32. sub eax,1
  33. jmp dwhile
  34. fin_bcl:
  35. }
  36. }

Reply

Marsh Posté le 05-03-2017 à 19:22:26   

Reply

Marsh Posté le 05-03-2017 à 21:59:28    

Salut. Plusieurs choses. Tu sembles dimensionner ta chaîne à 15 mais ce que tu mets dedans est plus long.
Ensuite c'est quoi qui indique la fin de ta chaine ? Un octet à zéro ?
Et puis sans connaître cet assembleur on a l'impression qu'en ligne 34 tu copies le caractère précédent dans cl et en 35 cl dans le caractère courant.
Si tu voulais supprimer le caractère c'est tout ce qui suit qu'il faudrait mettre dans le caractère précédent jusqu'au zéro final.

Reply

Marsh Posté le 05-03-2017 à 22:22:06    

bonjour merci pour ton aide. ça marche maintenant ça fait L grand zorro mais quand ça revient dans le dwhile le i a changé ou le edi a changé et ça tourne en boucle et je sais pas où il est. mais bon ç'est un bon début car j'ai compris que je dois faire un décalage vers la gauche de tous les elements après avoir trouvé la voyelle...
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  5. int i=0;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp edi, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi+1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov edi,i
  32.  
  33. cmp chaine[edi],0
  34. je dwhile
  35. jmp fwhilefin
  36. fin_bcl:
  37. }
  38. }

Reply

Marsh Posté le 05-03-2017 à 22:27:09    

voilà j'ai rajouté un branchement pour remettre le i à 0 et repasser dans la boucle dwhile  
ça marche maintenant j'ai vu au débogueur
mais je dois faire un dernier truc pour qu'il sort de la boucle au cas où il trouve le caractère zero ou bien quand tout est fini ... je peux faire comment car au débugeur ça continue à boucler même quand toutes les voyelles ont disparu et que la chaine s'est bien decalée?? ou bien comment réduire la taille de mon vecteur ??? parce que au debogueur y a plusieurs 0 à la fin de la chaine (en fonction du nombre de voyelles que j'ai supprimé ? je suppose)
 

Code :
  1. #include <time.h>
  2. #include <stdlib.h>
  3. #define TAILLE_VECTEUR 15
  4. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  5. int i=0;
  6. void main()
  7. {
  8. i=0;
  9. _asm
  10. {
  11. dwhile:
  12.  mov edi,i
  13.  cmp edi, TAILLE_VECTEUR
  14.     je  fin_bcl
  15.  cmp chaine[edi],'a'
  16.  je fwhilefin
  17.  cmp chaine[edi],'e'
  18.  je fwhilefin
  19.  cmp chaine[edi],'i'
  20.  je fwhilefin
  21.  cmp chaine[edi],'o'
  22.  je fwhilefin
  23.  cmp chaine[edi],'u'
  24.  je fwhilefin
  25.  inc i
  26.  jmp dwhile
  27. fwhilefin:
  28. mov cl,chaine[edi+1]
  29. mov chaine[edi],cl
  30. inc i
  31. mov edi,i
  32.  
  33. cmp chaine[edi],0
  34. je dwhile2
  35. jmp fwhilefin
  36. dwhile2:
  37. mov i,0
  38. jmp dwhile
  39. fin_bcl:
  40. }
  41. }


Message édité par bjs le 05-03-2017 à 22:52:32
Reply

Marsh Posté le 06-03-2017 à 09:23:55    

Normalement au premier trouvé lors du parcours, ça doit s'arrêter.
Une autre solution aurait été de copier les caractères un à un vers une nouvelle chaîne sauf les voyelles, sans doute plus facile.
Je ne vois pas de jump sur fin_bcl dans le cas d'un zéro
(je peux me tromper, l'assembleur j'en faisais dans les années 80 sur processeurs 6502/6510 donc je ne connais pas trop tes mnémoniques et je survole le code plus que je ne le lis)


Message édité par gzii le 06-03-2017 à 09:26:58
Reply

Marsh Posté le 06-03-2017 à 09:29:26    

Ça fait quoi mov i,0, tu mets 0 dans i ? Donc tu recommences ta boucle au début ?

Reply

Marsh Posté le 06-03-2017 à 10:14:41    

Une meilleure solution: avoir 2 index sur la chaîne de caractère, source et destination.
 
On démarre avec:
source = destination = premier caractère de chaine
 
Boucle tant que @source est non null
    Si le caractère @source n'est pas une voyelle, on copie @source dans @destination et on incrémente destination
    Dans tous les cas on incrémente @source
Fin de boucle


Message édité par h3bus le 06-03-2017 à 10:18:19

---------------
sheep++
Reply

Marsh Posté le 06-03-2017 à 16:58:48    

Ha ben voilà, c'est plus propre. :)

Reply

Marsh Posté le 07-03-2017 à 15:27:44    

J'ai pas testé:

Code :
  1. #define TAILLE_VECTEUR 15
  2. char chaine[TAILLE_VECTEUR]="Le grand zorro";
  3. const char voyelles[]="aeiouy"; // Liste des voyelles
  4. void main()
  5. {
  6.     _asm
  7.     {
  8.         mov     esi, chaine             // esi => source
  9.         mov     edi, chaine             // edi => destination
  10.         dwhile:
  11.             mov     al, [esi]           // On recupère le caractère @source
  12.             test    al, al              // @source == '\0'
  13.             jz      end_while
  14.             push    esi                 // Sauvegarde source sur le stack
  15.             mov     esi, voyelles       // esi => voyelle courante
  16.             boucle_voyelles:
  17.                 mov     bl, [esi]       // On recupère le caractère @voyelle
  18.                 test    bl, bl          // @voyelle == '\0' (fin de chaine voyelles)
  19.                 jz      pas_voyelles
  20.                 cmp     bl, al          // @voyelle == @source
  21.                 je      voyelle
  22.                 inc     esi             // voyelle suivante
  23.                 jmp     boucle_voyelles // Loop voyelles
  24.         pas_voyelles:
  25.             mov     [edi], al           // Copie @source dans @destination
  26.             inc     edi                 // destination++
  27.         voyelle:
  28.             pop     esi                 // On restore source du stack
  29.             inc     esi                 // source++
  30.             jmp     dwhile              // Loop chaine
  31.         end_while:
  32.     }
  33. }


Message édité par h3bus le 08-03-2017 à 17:11:20

---------------
sheep++
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed