Функции
-
В этой статье описано что такое функции
Функциями в ассемблере называются участки кода, на которые поток может переместиться и после выполнения вернуться с помощью специальной команды
ret
не используя jmp на конкретный адрес. Таким образом функции могут быть вызваны из любого места что делает их универсальными.Для перемещения в функцию используется команда
call
, для возврата из функции командаret
. Значение результата функции обычно передаётся через регистр eax, то есть функция заполняет его значением результата, но может и любым другим способом.call
- Вычитает из адреса стека 4, или 8 (в зависимости от разрядности приложения) и записывает по этому адресу адрес инструкции следующей за инструкциейcall
, после чего перемещает поток по адресу который был передан.call eax //Перемещает поток на адрес находящийся в eax
ret
- Берёт значение адреса (или любое) находящееся по адресу стека и перемещает на него поток, после чего добавляет к адресу стека 4, или 8.
Если у инструкции есть аргумент в виде числа, тогда дополнительно сдвигает стек после переноса потока по адресу.
Например, по стандарту ret должен был сдвинуть 4 байта, но это была инструкцияret 8
и в итоге ret сдвинет стек (добавит к адресу стека в esp) на 12 байт.ret //Простой ret 8 //С дополнительным сдвигом
Пример функции "fo" без аргументов которая всегда возвращает значение 16:
fo: mov eax,5 mov ecx,#11 add ecx,eax mov eax,ecx ret
Пример "fo2" функции с аргументами, которая принимает через стек 2 аргумента и складывает их, после чего возвращает значение результата через регистр eax и убирает из стека помещённые значения:
//После вызова с помощью call в [esp] находится адрес куда вернуться потоку, в [esp+4] и [esp+8] находятся аргументы. fo2: mov eax,[esp+4] add eax,[esp+8] ret 8
Пример вызова функции "fo2" с аргументами:
push 9 //Загрузка первого аргумента push 7 //Загрузка второго аргумента call fo2 // Теперь в eax находится число 16
Подробнее про вызов функций рассказано в следующих статьях