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