occorrenza di un assembly x86 di un personaggio

  • introduzione
  • Problema
  • Soluzione
  • Spiegazione

introduzione

L'esercizio di assemblaggio di seguito riportato è per architetture x86 (Intel e AMD a 32 bit) e utilizza la sintassi NASM, un assemblatore, disponibile gratuitamente e

che può essere utilizzato su piattaforme diverse come Windows o Linux.

Si noti che le funzioni esterne utilizzate provengono dalla libreria C standard.

Problema

Immagina una matrice di caratteri (che non necessariamente termina con 0). Ha le sue dimensioni e vorremmo testare la presenza di un determinato personaggio

in questo array. Lo scopo sarà quello di scrivere una funzione che prenda come input una serie di caratteri, dimensioni e caratteri. Se questo personaggio è presente in

l'array, restituisce un valore diverso da zero, altrimenti restituisce zero.

Ecco cosa danno questa funzione in C:

 / la funzione int is_in_array (char * array, int size, char c); // implementazione: char tab [] = {'n', 'e', ​​'u', 'e'}; is_in_array (tab, sizeof (tab), 'u'); // Restituisce un valore diverso da 0 is_in_array (tab, sizeof (tab), 'a'); // Restituisce valore 0 Inserisci semplicemente il tuo codice in: extern printf section .data array db 'dadedidadedavivoufufifamasibifisaz' yes db 'oui', 10, 0 no db 'non', 10, sezione 0. text global main is_in_array:; Inserisci il tuo codice there main: push ebp mov ebp, esp; Test se m è nell'array push dword 'm'; lunghezza dell'array (qui 34) push dword 34; indirizzo stringa in eax push array; chiama is_in_array con l'indirizzo dell'array, ; dimensione e il valore che stai cercando chiama is_in_array test eax, eax jnz is_there; se eax! = 0 visualizza sì push no; quindi non visualizza jmp screendisplay; screendisplay della stringa con printf is_there push yes screendisplay: call printf mov eax, 0 lasciare ret 

Certamente questo non sarà abbastanza .....

Soluzione

 is_in_array:; Recupera l'indirizzo dell'array (primo parametro) in edi mov edi, [esp + 4]; Recupera la dimensione dell'array (secondo parametro) in ecx mov ecx, [esp + 8]; Recupera il personaggio da trovare (terzo parametro) in eax mov eax, [esp + 12]; Cerca il carattere repne scasb; Se il flag ZERO (ZF) ha il valore 1 significa che il carattere è stato trovato, nell'altro caso non è stato trovato; Aggiungi semplicemente valore di ZF in eax mov eax, 0; se ZF = 1 allora al = 1 (essendo gli 8 bit meno significativi di eax) setz al 

Spiegazione

 ZF = 0 ecx = lunghezza eax = carattere edi = array // Il ciclo che definisce "repne scasb" While ecx! = 0 ET ZF = 0 Do if al == [edi] Quindi ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // La condizione che definisce "setz" Si ZF = 1 Alors eax = 1 EndIf 
Articolo Precedente Articolo Successivo

I Migliori Consigli