Найти тему

Альтернатива CALL

Продолжаю забавы с ассемблером. Предыдущая статья из этой серии здесь. А сегодня о том, каким набором инструкций можно заменить команду CALL.

Эта команда выполняет вызов процедуры. А замена её с помощью набора других команд поможет понять, как выполняется вызов процедуры в ассемблере и что при этом происходит.

Итак, сначала пример с обычным вызовом процедуры:

А теперь вызовем ту же процедуру, но без использования CALL:

-2

Как видите, всё достаточно просто. Нам надо лишь в том месте, где была CALL, создать какую-то метку (в нашем примере это ProcRET), которая будет использоваться как адрес возврата в программу из процедуры. А перед этой меткой добавить три команды. Первые две помещают в стек адрес возврата из процедуры, а третья выполняет безусловный переход на процедуру.

Таким образом, эта часть программы будет работать так:

  • Записываем в стек адрес возврата из процедуры
  • Переходим на метку процедуры
  • Выполняем код процедуры
  • Когда в процедуре доходим до команды RET, то эта команда вытаскивает из стека адрес возврата, а там у нас адрес метки ProcRET, и переходит на этот адрес, следовательно, при завершении процедуры мы переходим на метку ProcRET (в нашем случае это конец программы)

Ну вот как-то так…

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.