x86 rakstzīmju montāža

  • Ievads
  • Izdevums
  • Risinājums
  • Paskaidrojums

Ievads

Zemāk redzamais mazais montāžas uzdevums ir paredzēts (Intel un AMD 32 bitu) x86 arhitektūrām un izmanto NASM sintaksi, montētāju, kas ir pieejams bez maksas un

to var izmantot dažādās platformās, piemēram, Windows vai Linux.

Ņemiet vērā, ka izmantotās ārējās funkcijas nāk no standarta C bibliotēkas.

Izdevums

Iedomājieties rakstzīmju kopu (kas ne vienmēr beidzas ar 0). Tam ir sava izmēra un mēs vēlētos pārbaudīt konkrēta rakstura klātbūtni

šajā masīvā. Mērķis būs rakstīt funkciju, kas ievada rakstzīmi, lielumu un raksturu. Ja šī rakstzīme atrodas

masīvs, tas atgriež nulles vērtību, pretējā gadījumā tas atgriež nulli.

Lūk, kas sniedz šo funkciju C:

 / funkcija int is_in_array (char * masīvs, int izmērs, char c); // īstenošana: cilne cilne [] = {'n', 'e', ​​'u', 'e'); is_in_array (cilne, izmērs (tab), 'u'); // Atgriezt vērtību, kas nav 0 is_in_array (cilne, izmērs (tab), 'a'); // Atgriešanās vērtība 0 Vienkārši ievietojiet savu kodu: extern printf sadaļā .datu masīvs db 'dadedidadedavivoufufifamasibifisaz' jā db 'oui', 10, 0, ne db 'non', 10, 0 sadaļa .text globālais galvenais is_in_array:; Galvenais: push ebp mov ebp, esp; Pārbaudiet, vai m ir masīva push dword 'm'; masīva garums (šeit 34) spiediet dword 34; string adrese eax push masīvā; zvans ir_in_array ar masīva adresi; lielums, un vērtība, kuru meklējat, ir izsaukums is_in_array tests eax, eax jnz is_there; ja displejs ir jāuztver nē, tad displejā neparādās jmp screendisplay, parādīt virkni ar drukātfailu: zvaniet printf mov eax, 0 atstāt ret 

Protams, tas nebūs pietiekami .....

Risinājums

 iz_in_array:; izgūst masīva adresi (pirmais parametrs) edi mov edi, [esp + 4]; izgūst masīva lielumu (otrais parametrs) ecx mov ecx, [esp + 8]; (trešais parametrs) eax mov eax, [esp + 12]; meklēt rakstzīmju repne scasb; ja karoga ZERO (ZF) vērtība ir 1, tas nozīmē rakstzīmi, citā gadījumā tas nav atrasts, vienkārši pievienojiet ZF vērtība eax mov eax, 0, ja ZF = 1, tad al = 1 (al ir 8 mazāk nozīmīgie eax biti) setz al ret 

Paskaidrojums

 ZF = 0 ecx = garums eax = raksturs edi = masīvs // Loop, kas definē "repne scasb" Kamēr ecx! = 0 ET ZF = 0 Vai, ja al == [edi] Tad ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // Nosacījums, kas definē "setz" Si ZF = 1 Alors eax = 1 EndIf 
Iepriekšējais Raksts Nākamais Raksts

Top Padomi