occurrence d'assemblage x86 d'un personnage

  • introduction
  • Problème
  • Solution
  • Explication

introduction

L’exercice de montage suivant est destiné aux architectures x86 (Intel et AMD 32 bits) et utilise la syntaxe NASM, un assembleur, disponible gratuitement.

qui peut être utilisé sur différentes plates-formes telles que Windows ou Linux.

Notez que les fonctions externes utilisées proviennent de la bibliothèque standard C.

Problème

Imaginez un tableau de caractères (qui ne se termine pas nécessairement par 0). Il a sa taille et nous aimerions tester la présence d'un personnage donné

dans ce tableau. L’objectif sera d’écrire une fonction prenant en entrée un tableau de caractères, de taille et de caractère. Si ce personnage est présent dans

le tableau, il renvoie une valeur non nulle, sinon il renvoie zéro.

Voici ce qui donne cette fonction en C:

 / la fonction int is_in_array (char * array, taille int, char c); // implémentation: char tab [] = {'n', 'e', ​​'u', 'e'}; is_in_array (tab, sizeof (tab), 'u'); // Retourne une valeur autre que 0 is_in_array (tab, sizeof (tab), 'a'); // Valeur de retour 0 Insérez simplement votre code dans: section print printf. Tableau de données db 'dadedidadedavivoufufifamasibifisaz' oui db 'oui', 10, 0 non db 'non', 10, 0 section .text global principal is_in_array:; Insérez votre code il teste si m est dans le tableau push dword 'm'; longueur du tableau (ici 34) push dword 34; adresse de chaîne dans eax push array; appelez is_in_array avec l'adresse du tableau, ; size, et la valeur que vous recherchez, appelez is_in_array test eax, eax jnz is_there; Si eax! = 0 display yes, no display, puis no display; jre screendisplay; screendisplay de la chaîne avec printf is_there push yes laisser ret 

Ce ne sera certainement pas suffisant .....

Solution

 is_in_array:; Récupère l'adresse du tableau (premier paramètre) dans edi mov edi, [esp + 4]; Récupère la taille du tableau (second paramètre) dans ecx mov ecx, [esp + 8]; Récupère le caractère à rechercher (troisième paramètre) dans eax mov eax, [esp + 12]; recherchez le caractère repne scasb; si l'indicateur ZERO (ZF) a la valeur 1, cela signifie qu'un caractère est trouvé; dans l'autre cas, il n'est pas trouvé; ajoutez simplement le valeur de ZF dans eax mov eax, 0; Si ZF = 1 alors al = 1 (tous les 8 bits les moins significatifs de eax) setz al ret 

Explication

 ZF = 0 ecx = longueur eax = caractère edi = array // La boucle qui définit "repne scasb" tant que ecx! = 0 ET ZF = 0 Do si al == [edi] Alors ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // La condition qui définit "setz" Si ZF = 1 Alors eax = 1 EndIf 
Article Précédent Article Suivant

Les Meilleurs Conseils