Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - [ASSEMBLER]
Forum - Altri Linguaggi - [ASSEMBLER]

Avatar
JErikaM (Normal User)
Newbie


Messaggi: 10
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 15:31
Domenica, 10/06/2012
ciao a tutti :) mi trovo oggi alle prese con un esercizio di assembler..trovare le occorrenze di una sottostringa...
stringa: ciao ciao ciak
sottostringa: ciao

devo quindi trovare quante volte c'è ciao nella stringa e stampare a video gli indici in cui si trova la parola
(esempio sopra..ciao la trovo all'indice 0 e 5

questo è il mio codice che a volte stampa giusto: o la parola è la prima, o è dopo una parola sbagliata
stampa invece indirizzi strani di memoria negli altri casi...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. void main()
  4. {
  5.  #define MAX_LEN 100
  6. //INPUT
  7. char s1[] = "ciak ciak";  //prima stringa
  8. unsigned int lungS1 = sizeof(s1)-1;
  9. char s2[] = "ciao";   //seconda stringa
  10. unsigned int lungS2 = sizeof(s2)-1;
  11. //OUTPUT
  12. unsigned int posizioni[MAX_LEN];
  13. unsigned int posizioniLen;
  14.  
  15.  
  16. _asm
  17.     {
  18.       XOR EAX,EAX //contiene il primo indice s1[ECX]
  19.       XOR EBX,EBX //è var temporanea che contiene l'indice da mettere se c'è l'occorrenza
  20.           XOR ECX,ECX
  21.           XOR EDX,EDX
  22.           XOR ESI,ESI //num occorrenze
  23.       XOR EDI,EDI
  24.  
  25.           //MOV EDI,lungS2
  26.           //DEC EDI
  27.  
  28. ciclo1: MOV AL,s1[ECX] //sposto l'indice della stringa
  29.           MOV EBX,ECX //ci sposto l'indice nche userò se trovo l'occorrenza
  30.           CMP AL,s2[EDX] //controllo il contenuto del primo indice di entrambe le stringhe  
  31.          
  32.           JNE nonuguali
  33.        
  34.  
  35. uguali:
  36.            
  37.             INC ECX   //incremento gli indici delle due stringhe
  38.                 INC EDX
  39.                 MOV AL,s1[ECX] //sposto l'indice della stringa
  40.                 CMP AL,s2[EDX] //controllo il contenuto dell'indice di entrambe le stringhe
  41.                 JNE nonuguali
  42.  
  43.                 INC EDX
  44.                         CMP EDX,lungS2
  45.                         JE occorrenza
  46.                         DEC EDX
  47.                         JNE uguali
  48. occorrenza:
  49.                
  50.                 MOV posizioni[ESI],EBX //sposto l'indice in cui si trova l'occorrenza nel vettore
  51.         INC ESI //incremento solo ora il numero delle occorrenze in modo da mettere EBX nella cella giusta
  52.          
  53. nonuguali:
  54.                 INC ECX
  55.                 CMP lungS1,ECX //confronto la lunghezza della sottostringa con il proprio indice
  56.                 JE fine
  57.                 //DEC ECX
  58.                 //INC ECX //incremento indice stringa
  59.                 XOR EDX,EDX //azzero l'indice della sottostringa per ripartire a controllare
  60.                 JMP ciclo1
  61.  
  62.   fine: MOV posizioniLen,ESI //num occorrenze
  63.  
  64.     }
  65.  
  66.     {
  67.      
  68.          unsigned int i;
  69.          for (i=0;i<posizioniLen;i++)
  70.          printf("sottostringa in posizione-%d\n",posizioni[i]);
  71.     }
  72.  
  73. }



non posso modificare il codice C... concettualmente mi pare che il ragionento cia sia tutto..ovvero...
controllo il contenuto degli indici delle due stringhe, se sono uguali contropllo che vi sia tutta la parola e in quel caso mi segno l'occorrenza memorizzandone l'indice..se invece le due lettere sono diverse proseguo nella stringa principale ma ricomincio con la sottostringa...
potete aiutarmi? :/ grazie in anticipo!

Ultima modifica effettuata da JErikaM il 10/06/2012 alle 17:43
PM Quote
Avatar
JErikaM (Normal User)
Newbie


Messaggi: 10
Iscritto: 04/01/2012

Segnala al moderatore
Postato alle 19:19
Domenica, 10/06/2012
volevo segnalare che ce l'ho fatta a risolvere il problema :) potete chiudere

PM Quote