x86 сглобяване на символи

  • Въведение
  • Проблем
  • Решение
  • обяснение

Въведение

Малката упражнение по-долу е за (Intel и AMD 32-битова) x86 архитектура и използва NASM синтаксиса, асемблер, достъпен безплатно и

които могат да се използват на различни платформи като Windows или Linux.

Имайте предвид, че използваните външни функции идват от стандартната C библиотека.

Проблем

Представете си масив от символи (който не е задължително да завършва с 0). Тя има своя размер и бихме искали да тестваме присъствието на даден характер

в този масив. Целта ще бъде да се напише функция, която поема като вход масив от символи, размер и характер. Ако този символ присъства в

масивът връща ненулева стойност, в противен случай връща нула.

Ето какво дава тази функция в C:

 / функцията int is_in_array (char * array, int размер, char c); // реализация: char tab [] = {'n', 'e', ​​'u', 'e'}; is_in_array (tab, sizeof (tab), 'u'); // Връща стойност, различна от 0 is_in_array (tab, sizeof (tab), 'a'); // Върнете стойност 0 Просто въведете кода си в: extern printf секция .data масив db 'dadedidadedavivoufufifamasibifisaz' да db 'oui', 10, 0 не db 'non', 10, 0 section. има главно: push ebp mov ebp, esp; тест, ако m е в масива push dword 'm'; дължина на масив (тук 34) натиснете dword 34; адрес на низ в eax push масив, Call is_in_array с адрес на масив, размер, и стойността, която търсите се обадите is_in_array тест eax, eax jnz is_there; Ако eax! = 0 дисплей да натиснете не, тогава не показват jmp screendisplay; напусне рет 

Разбира се, това няма да е достатъчно .....

Решение

 is_in_array: Извлича адреса на масива (първи параметър) в edi mov edi, [esp + 4], извлича размера на масива (втори параметър) в ecx mov ecx, [esp + 8]; (трети параметър) в eax mov eax, [esp + 12]; Търсене на символа repne scasb; Ако флаг ZERO (ZF) има стойност от 1, това означава, че символът е намерен; в другия случай не е намерен; стойност на ZF в eax mov eax, 0, ако ZF = 1, тогава al = 1 (al е 8-те най-малко значими бита на eax) setz al ret 

обяснение

 ZF = 0 ecx = дължина eax = символ edi = масив // Контурът, който определя "repne scasb" Докато ecx! = 0 ET ZF = 0 Да, ако al == [edi] Тогава ZF = 1 FinSi ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // Условието, което определя "setz" Si ZF = 1 Alors eax = 1 EndIf 
Предишна Статия Следваща Статия

Топ Съвети