Функции
-
В этой статье описано что такое функции
Функциями в ассемблере называются участки кода, на которые поток может переместиться и после выполнения вернуться с помощью специальной команды
retне используя jmp на конкретный адрес. Таким образом функции могут быть вызваны из любого места что делает их универсальными.Для перемещения в функцию используется команда
call, для возврата из функции командаret. Значение результата функции обычно передаётся через регистр eax, то есть функция заполняет его значением результата, но может и любым другим способом.call- Вычитает из адреса стека 4, или 8 (в зависимости от разрядности приложения) и записывает по этому адресу адрес инструкции следующей за инструкциейcall, после чего перемещает поток по адресу который был передан.call eax //Перемещает поток на адрес находящийся в eaxret- Берёт значение адреса (или любое) находящееся по адресу стека и перемещает на него поток, после чего добавляет к адресу стека 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Подробнее про вызов функций рассказано в следующих статьях