26Fermer28
Kevin KoflerLe 07/03/2010 à 07:34
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