Для чтения параметров процедуры из стека используют не команду POP, а регистр ВР, в который помещают адрес вершины стека после входа в процедуру

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

Передача параметров в глобальных переменных

Передача параметров в регистрах

Call procedure


Если процедура получает небольшое число параметров, то лучше всего их передавать через регистры. Примерами использования этого метода могут служить практически все вызовы прерываний DOS и BIOS. Языки высокого уровня обычно используют регистр АХ (ЕАХ) для того, чтобы возвращать результат работы функции.

Недостатки данного способа:

– существуют ограничения на способ передачи аргументов через регистры;

– имеется небольшое число доступных для пользователя регистров;

– необходимо постоянно помнить о том, какая информация в каком регистре находится;

– имеется ограничение размера передаваемых данных размерами регистра. Если размер данных превышает 16 или 32 бита, то передачу данных посредством регистров произвести нельзя. В этом случае передавать нужно не сами данные, а указатели на них.

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


Текущее значение вершины стека хранится в регистре ESP. При записи в стек значение этого регистра уменьшается, то есть стек растет вниз от максимально возможного адреса (рис. 4).

Рис. 4. Стек.

При вызове подпрограммы параметры в большинстве случаев помещают в стек, а в EBP записывают текущее значение ESP. Тогда, если подпрограмма использует стек для хранения локальных переменных, ESP изменится, но EBP можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения будут записываться как EBP+номер параметра).


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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: