GameHackLab[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти

    Функции

    Запланировано Прикреплена Закрыта Перенесена Базовая информация
    функциипотоквызов функций
    1 Сообщения 1 Posters 221 Просмотры
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • PromisingP
      Promising
      отредактировано Promising

      В этой статье описано что такое функции


      Функциями в ассемблере называются участки кода, на которые поток может переместиться и после выполнения вернуться с помощью специальной команды 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
      

      Подробнее про вызов функций рассказано в следующих статьях

      1 ответ Последний ответ Ответить Цитировать 3
      • Первое сообщение
        Последнее сообщение