Oppure

Loading
10/06/12 13:31
JErikaM
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...

#include <stdio.h>

void main()
{
 #define MAX_LEN 100
//INPUT
char s1[] = "ciak ciak";  //prima stringa
unsigned int lungS1 = sizeof(s1)-1;
char s2[] = "ciao";   //seconda stringa
unsigned int lungS2 = sizeof(s2)-1;
//OUTPUT
unsigned int posizioni[MAX_LEN];
unsigned int posizioniLen;


_asm
    {
      XOR EAX,EAX //contiene il primo indice s1[ECX] 
      XOR EBX,EBX //è var temporanea che contiene l'indice da mettere se c'è l'occorrenza 
	  XOR ECX,ECX 
	  XOR EDX,EDX 
	  XOR ESI,ESI //num occorrenze
      XOR EDI,EDI

	  //MOV EDI,lungS2
	  //DEC EDI

ciclo1: MOV AL,s1[ECX] //sposto l'indice della stringa
	  MOV EBX,ECX //ci sposto l'indice nche userò se trovo l'occorrenza
 	  CMP AL,s2[EDX] //controllo il contenuto del primo indice di entrambe le stringhe  
	  
	  JNE nonuguali
	

uguali: 
	    
	    INC ECX   //incremento gli indici delle due stringhe
		INC EDX
		MOV AL,s1[ECX] //sposto l'indice della stringa
		CMP AL,s2[EDX] //controllo il contenuto dell'indice di entrambe le stringhe 
		JNE nonuguali

		INC EDX
			CMP EDX,lungS2
			JE occorrenza
			DEC EDX
			JNE uguali
occorrenza:
		
		MOV posizioni[ESI],EBX //sposto l'indice in cui si trova l'occorrenza nel vettore 
        INC ESI //incremento solo ora il numero delle occorrenze in modo da mettere EBX nella cella giusta
	 
nonuguali:
		INC ECX
		CMP lungS1,ECX //confronto la lunghezza della sottostringa con il proprio indice
		JE fine
		//DEC ECX
		//INC ECX //incremento indice stringa
		XOR EDX,EDX //azzero l'indice della sottostringa per ripartire a controllare
		JMP ciclo1

  fine: MOV posizioniLen,ESI //num occorrenze

    }

    {
     
	 unsigned int i;
	 for (i=0;i<posizioniLen;i++)
	 printf("sottostringa in posizione-%d\n",posizioni[i]);
    }

}




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 10/06/12 15:43
aaa
10/06/12 17:19
JErikaM
volevo segnalare che ce l'ho fatta a risolvere il problema :) potete chiudere
aaa