Clairement ^^
Sinon, pareil que les autres, j'utiliserais une table de hachage pour ça…
Si tes données sont statiques tu peux généralement arriver à trouver quelque chose de très optimisé pour ton (tes) cas.
De même, si tu connais à l'avance tes besoins, tu pourrais faire une conversion de jeux de caractères au début pour que ce soit plus avantageux à manipuler par la suite. (Mais il ne faut pas que la conversion te coûte plus cher que ce qu'elle te fait gagner, bien évidemment ^^)
Par exemple, classifier les caractères en "séparateurs" et "non séparateurs":
0 ≤ c ≤ 127: séparateurs (tu n'en as pas forcément 128 ^^)
128 ≤ c ≤ 256: caractères toujours valides
Ici, tester si un caractère est valide revient juste à tester le bit 7, puis si c'est dans la catégorie "séparateur", tester que c'est bel et bien un des séparateurs autorisés.
Bref, ta routine en elle même a sans doute peu d'optimisations possibles (j'avoue j'ai la flemme de déchiffrer ton assembleur, et les commentaires ne m'aident pas), mais une bonne optimisation peut impliquer de changer d'algorithme "entièrement".
D'ailleurs ça me rappelle un bon article que j'ai lu il y a quelque temps:
http://blogs.msdn.com/shawnhar/archive/2009/12/14/algorithm-versus-implementation.aspx