Передача параметров через стек.

Параметры процедуре, написанной на языке ассемблера, можно передать следующими способами:

  • В регистрах;
  • В глобальных переменных (различными способами);
  • Через общую область памяти;
  • Через стек.

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

Передача параметров через стек.

Рассмотрим этот способ передачи параметров более подробно. Перед вызовом функции вызывающая программа помещает в стек те параметры, которые нужно передать процедуре. Пример вызова процедуры на языке Pascal и эквивалентный ему код на языке ассемблера изображен на слайде. После загрузки параметров, в стек при выполнении команды CALL помещается адрес возврата. Таким образом, при вызове процедуры вершина стека указывает на адрес возврата, сразу за которым следуют помещенные в стек параметры.

Для получения доступа к параметрам из процедуры наиболее удобно пользоваться косвенной адресацией относительно регистра BP. Предварительно при входе в процедуру значение BPдолжно быть проинициализировано адресом вершины стека, тогда параметры можно будет адресовать следующим образом:

<DISP>[BP],

где <DISP> представляет собой смещение в байтах относительно BP.

Однако нельзя забывать о том, что при инициализации BP значением вершины стека старое его значение стирается, поэтому перед инициализацией старое значение BPнужно сохранить в стеке, чтобы при выходе из процедуры оно могло быть восстановлено. Как раз для этих целей в подавляющем большинстве процедур используется стандартный пролог и эпилог.

При входе в процедуру в стеке сохраняется регистр BP, поскольку в дальнейшем мы планируем загрузить в него значение SP. Из этих команд и состоит стандартный пролог. В стандартном эпилоге восстанавливают значения регистров, которые были до входа в процедуру, и при помощи команды RET и числового аргумента возвратиться в вызывающую программу, при этом удалив из стека переданные процедуре параметры помимо адреса возврата (ParmSize– число байтов, занятых параметрами, которые нужно удалить из стека).

В различных языках высокого уровня стандартный эпилог реализован по-разному: в языке Pascal он реализован именно так, как мы только что рассмотрели, а в языке С очистку стека производит вызывающая программа (RETвызывается без параметров).

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

Ссылка на основную публикацию
Adblock detector