Способы передачи аргументов в процедуру

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

Существуют следующие варианты передачи аргументов в процедуру:

- через регистры;

- через общую область памяти;

- через стек;

Передача аргументов через регистры

Это наиболее простой в реализации способ передачи данных. Данные, переданные подобным способом, становятся доступными немедленно после передачи управления процедуре. Этот способ хорошо применять при небольшом объеме передаваемых данных.

Ограничения на способ передачи аргументов через регистры:

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

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

- ограничение размера передаваемых данных размерами регистра.

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

Такой способ передачи аргументов широко применяется при вызове функций операционной системы DOS.

Передача аргументов через общую область памяти

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

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

Передача аргументов через стек. Пролог и эпилог ассемблерных процедур.

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

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

Стек обслуживается тремя регистрами: SS, ESP и EBP. Содержимое регистров SS и ESP изменять не рекомендуется, поскольку микропроцессор работает с регистрами SS и ESP в предположении, что они всегда указывают на вершину стека.

Для осуществления произвольного доступа к данным в стеке архитектура микропроцессора имеет специальный регистр EBP (Base Point – указатель базы). Так же как и для регистра ESP, использование EBP автоматически предполагает работу с сегментом стека. Перед использованием этого регистра для доступа к данным стека его содержимое необходимо правильно инициализировать, что предполагает формирование в нем адреса, который бы указывал непосредственно на переданные данные. Для этого в начало процедуры включается дополнительный фрагмент кода, который называется прологом процедуры:

//пролог

push EBP // сохраняет содержимое EBР в стеке с тем, чтобы

//исключить порчу находящегося в нем значения в вызываемой

//процедуре

mov EBP,ESP // настраивает EBP на вершину стека

Аргументы процедуры находятся в стеке, начиная с адреса [EBP+8] – для 32 разрядной адресации для far-процедур.

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

Эпилог процедуры – фрагмент кода, который восстанавливает контекст программы в точке вызова вызываемой процедуры из вызывающей программы.

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

- использовать последовательность из п команд POP xx, лучше всего это делать в вызывающей программе сразу после возврата управления из процедуры;

- откорректировать регистр указателя стека ESP на величину k*п, например, командой ADD ESP, NN, где NN=k*n, и п – количество аргументов, k-длина аргумента в байтах. Это также лучше делать после возврата управления вызывающей процедуре;

- используя машинную команду RET n в качестве последней исполняемой команды в процедуре, где п – количество байт, на которое нужно увеличить содержимое регистра ESP после того, как со стека будут сняты составляющие адреса возврата. Этот способ аналогичен предыдущему, но выполняется автоматически микропроцессором.

Например:

//эпилог

pop EBP // извлекает содержимое EBР из стека

ret // возврат из подпрограммы


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



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