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