x86 charakterio pasirodymas

  • Įvadas
  • Problema
  • Sprendimas
  • Paaiškinimas

Įvadas

Žemiau pateikta nedidelė surinkimo užduotis skirta (Intel ir AMD 32 bitų) x86 architektūroms ir naudoja NASM sintaksę, montuotoją, prieinamą nemokamai ir

kuri gali būti naudojama įvairiose platformose, pvz., „Windows“ arba „Linux“.

Atkreipkite dėmesį, kad naudojamos išorinės funkcijos gaunamos iš standartinės C bibliotekos.

Problema

Įsivaizduokite simbolių masyvą (kuris nebūtinai baigiasi 0). Jis turi savo dydį ir norėtume išbandyti tam tikro simbolio buvimą

šiame masyve. Tikslas bus parašyti funkciją, kuri įvestų simbolių, dydžio ir pobūdžio masyvą. Jei šis simbolis yra

masyvas, jis grąžina nulinę vertę, kitaip jis grąžina nulį.

Štai ką ši funkcija suteikiama C:

 / funkcija int is_in_array (char * masyvas, int dydis, char c); // įgyvendinimas: char tab [] = {'n', 'e', ​​'u', 'e'}; is_in_array (skirtukas, dydis (skirtukas), 'u'); // Grąžinkite kitą vertę nei 0 is_in_array (skirtukas, sizeof (skirtukas), 'a'); // Grąžinimo reikšmė 0 Tiesiog įdėkite savo kodą į: extern printf skyrių .data masyvas db 'dadedidadedavivoufufifamasibifisaz' taip db 'oui', 10, 0 ne db 'non', 10, 0 sekcija .text global main is_in_array:; yra pagrindinis: push ebp mov ebp, esp; testas, jei m yra masyvo stumti dword 'm', masyvo ilgis (čia 34) stumkite dword 34, eilutės adresas eax stūmimo masyve, skambinkite is_in_array su masyvo adresu; dydis, o vertė, kurią ieškote, skambina is_in_array test eax, eax jnz is_there; jei „eax! = 0“ rodomas taip, paspauskite „ne“, tada nerodykite „jmp screendisplay“; palikti ret 

Žinoma, to nepakaks .....

Sprendimas

 is_in_array:; suranda masyvo adresą (pirmasis parametras), esančią edi mov edi, [esp + 4]; suranda masyvo dydį (antrasis parametras) ecx mov ecx, [esp + 8]; (trečiasis parametras) „eax mov eax“, [esp + 12]; ieškoti simbolių repne scasb; jei vėliava „ZERO“ (ZF) yra 1 reikšmė, tai reiškia simbolį, o kitame - nerandama, tiesiog pridėkite ZF reikšmė eax mov eax, 0, jei ZF = 1, tada al = 1 (al yra 8 mažiausiai reikšmingi eax bitai) setz al ret 

Paaiškinimas

 ZF = 0 ecx = ilgis eax = simbolis edi = masyvas // Loop, kuris apibrėžia „repne scasb“, o ekx! = 0 ET ZF = 0 Ar, jei al == [edi] Tada ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // Būklė, kuri apibrėžia „setz“ Si ZF = 1 Alors eax = 1 EndIf 
Ankstesnis Straipsnis Kitas Straipsnis

Geriausi Patarimai