Une version un peu plus lisible de ton code pour les habitués du 68k (syntaxe AT&T de GNU as):
# Même fonction que le code de Folco, je répète pas les commentaires :)
#
# entrée : %esi : StringTable
# %ebp : SeparatorTable
# %ebx : RegString
# %eax : **NextChar
#
# sortie : %edx : numéro de la chaîne, -1 si elle n'a pas été trouvée
# *NextChar mis à jour s'il n'était pas nul
#
# registres détruits : %ecx, %edx, %esi, %edi
#
Comparaison_chaines:
cld # mode post-incrémentation
movl $-1, %edx # initialise le numéro de la chaîne
Boucle_chaines:
incl %edx # incrémente le numéro de la chaîne
movl 4(%esi), %ecx # récupère la longueur de la chaîne dans StringTable
jecxz Chaine_non_trouvee # si nulle, fin de la table -> la chaîne n'a pas été trouvée
movl %ebx, %edi # pointeur de comparaison 1 = RefString
pushl %esi # sauvegarde le pointeur sur StringTable
movl (%esi), %esi # pointeur de comparaison 2 = chaîne indiquée dans StringTable
repe cmpsb # compare les chaînes
popl %esi # restaure le pointeur sur StringTable
je Verif_separateur # chaînes identiques -> vérifie le séparateur
Boucle_chaines_fin:
addl $8, %esi # passe à l'entrée suivante de StringTable
jmp Boucle_chaines #
Chaine_non_trouvee:
movl $-1, %edx # retourne le code d'erreur
ret #
Verif_separateur:
movl $nb_separateurs, %ecx # initialise le nombre de boucles
pushl %eax # sauvegarde **NextChar
movb (%edi), %al # caractère à rechercher : dernier caractère de RefString
pushl %edi # sauvegarde le pointeur sur StringTable
movl %ebp, %edi # bloc dans lequel rechercher : SeparatorTable
repne scasb # recherche le caractère
popl %edi # restaure le pointeur sur StringTable
popl %eax # restaure **NextChar
jne Boucle_chaines_fin # caractère non trouvé -> on passe à la chaîne suivante de StringTable
testl %eax, %eax # vérifie si **NextChar = NULL
jz Chaine_trouvee # si non, rien à faire
movl %edi, (%eax) # si oui, on enregistre l'adresse du séparateur trouvé
Chaine_trouvee:
ret # retourne le numéro de la chaîne