Eccomi qui con un altro problema .-. qui è proprio misero..non ha senso

in questo programma devo cercare le occorrenze della stringa 2 nella stringa 1
il programma funziona con tutte le stringhe che ho provato...tranne che con
"Sette scettici sceicchi sciocchi con la sciatica a Shanghai"
"icchi"
non capisco perchè..in quanto questa stringa mi pare a concetto uguale a "icchi sceicchi cane sceicchi cane icchi icchi icchi icchi cane" con la quale il programma funziona correttamente o.o
non riesco a trovare l'errore!!


codice:
 
#include <stdio.h>


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

_asm
    {
       //azzeramento registri
	  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 //per scorrere s1
	  XOR EDX,EDX //per scorrere s2
	  XOR ESI,ESI //num occorrenze
           XOR EDI,EDI //lo uso per la lunghezza 

	  //se s1<s2 termino il programma perchè non ho occorrenze
          MOV EDI,lungS1
	  CMP EDI,lungS2
	  JB fine
  
ciclo1: 
	    MOV AL,s1[ECX] //sposto l'indice della stringa in AL (8bit)
	    MOV EBX,ECX //ci sposto l'indice che userò se trovo l'occorrenza (sarà l'indice che visualizzo nella stampa)
 	    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 per scorrerle
	INC EDX   
	MOV AL,s1[ECX] //sposto l'indice della stringa in AL (8bit)
	CMP AL,s2[EDX] //controllo il contenuto dell'indice di entrambe le stringhe 
	JNE nonuguali 
	INC EDX //incremento EDX per controllare se sono arrivata alla fine del vettore 
	CMP EDX,lungS2 //confronto l'indice con la lunghezza si s2, se sono uguali ho terminato di scorrere
	JE occorrenza
	DEC EDX //decremento EDX siccome prima l'avevo incrementata
	JNE uguali
occorrenza:
		MOV posizioni[ESI*4],EBX //sposto l'indice in cui si trova l'occorrenza nel vettore. è *4 siccome un unsigned int è 4byte 
              INC ESI //incremento solo ora il numero delle occorrenze in modo da mettere EBX nella cella giusta
		XOR EDX,EDX
		JMP nonuguali2
nonuguali:
             XOR EDX,EDX
             CMP AL,s2[0] //nel caso in cui le due lettere sono diverse faccio questo controllo che controlla che la lettera in questione sia uguale alla prima della parola da cercare...così se mi trovo nel caso "sceicchi" e devo cercare "icchi", quando controllo la i che è diversa dalla mia h, vedo però che è uguale alla i della s2 quindi riparto col procedimento di controllo solito    
             JE ciclo1
nonuguali2:	
		INC ECX //incremento l'indice della stringa principale 
		CMP lungS1,ECX //confronto la lunghezza della sottostringa con il proprio indice, se sono uguali significa che ho finito tutta la stringa dove cercare le occorrenze
               JE fine
		XOR EDX,EDX //azzero l'indice della sottostringa per ripartire a controllare
		JMP ciclo1
fine:   
		MOV posizioniLen,ESI //num occorrenze trovate	 
    }
{
     
	 unsigned int i;
	 for (i=0;i<posizioniLen;i++)
	 printf("sottostringa in posizione-%d\n",posizioni[i]);
    }

}
Help ç_çe grazie ancora!