x86 sammansättning förekomst av en karaktär

  • Introduktion
  • Problem
  • Lösning
  • Förklaring

Introduktion

Den lilla monteringsövningen nedan gäller för (Intel och AMD 32-bitars x86-arkitekturer) och använder NASM-syntaxen, en assembler, tillgänglig gratis och

som kan användas på olika plattformar som Windows eller Linux.

Observera att externa funktioner som används kommer från standard C-biblioteket.

Problem

Föreställ dig en rad tecken (vilket inte nödvändigtvis slutar med 0). Den har sin storlek och vi skulle vilja testa närvaron av ett visst tecken

i denna array. Målet är att skriva en funktion som som inmatning innehåller en rad tecken, storlek och tecken. Om denna karaktär är närvarande i

arrayen returnerar den ett icke-zero värde, annars returnerar det noll.

Här är vad som ger den här funktionen i C:

 / funktionen int is_in_array (char * array, int storlek, char c); // implementation: char fliken [] = {'n', 'e', ​​'u', 'e'}; is_in_array (flik, sizeof (flik), 'u'); // Returnera ett annat värde än 0 is_in_array (flik, sizeof (flik), 'a'); // Returvärde 0 Sätt bara in din kod i: extern printf-sektion .data array db 'dadedidadedavivoufufifamasibifisaz' ja db 'oui', 10, 0 no db 'non', 10, 0 avsnitt .text global main is_in_array:; Sätt in din kod där huvud: push ebp mov ebp, esp; testa om m är i array push dword 'm'; längd array (här 34) tryck dword 34; string adress i eax push array; ring is_in_array med adress för array storlek och det värde du söker kallas is_in_array test eax, eax jnz is_there; Om eax! = 0 visa ja tryck nej; Visa sedan nej jmp screendisplay; screendisplay av strängen med printf is_there push ja screendisplay: call printf mov eax, 0 lämna rätt 

Visst är det inte tillräckligt .....

Lösning

 is_in_array:; Hämtar arrayens adress (första parametern) i edi mov edi, [esp + 4]; Hämtar storleken på arrayen (andra parametern) i ecx mov ecx, [esp + 8]; Hämtar tecknet för att hitta (tredje parametern) i eax mov eax, [esp + 12], Sök karaktären repne scasb; Om flaggan ZERO (ZF) har ett värde av 1 betyder det att tecken hittas; I annat fall är det inte hittat; värdet av ZF i eax mov eax, 0; Om ZF = 1 då al = 1 (al är de 8 minst signifikanta bitarna av eax) setz al ret 

Förklaring

 ZF = 0 ecx = längd eax = tecken edi = array // Loop som definierar "repne scasb" Medan ecx! = 0 ET ZF = 0 Gör om al == [edi] Då ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // Det villkor som definierar "setz" Si ZF = 1 Alors eax = 1 EndIf 
Tidigare Artikel Nästa Artikel

Bästa Tipsen