Меню сайта

Урок 51. Передача параметров

Стек также служит удобным местом дляпередачи информации в
— — — подпрограммы и из них. Обычно программапередает параметры в
— — — подпрограмму, помещая их в регистры,однако в некоторых случаях
— — — число параметров превышает размерырегистрового пространства. В
— — — таких случаях програииа может поместитьпараметры в стек до
— — — выполнения команды CALL (вызовподпрограммы). Как мы увидим в
— — — гл.10, стек является единственнымсредством передачи параметров в
— — — подпрограммы, написанные на языкеассемблера, из языков высокого
— — — уровня Бейсик и Фортран.

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

— — — — — MOV BP, SP

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

— — — — — Конструкторы микропроцессора 8088определенно помнили об
— — — описанном выше методе передачи параметров,так как при доступе к
— — — данным регистр BP использует по умолчаниюрегистр стекового
— — — сегмента SS в качестве сегментногорегистра. Во всех других
— — — нормальных случаях доступа к данныммикропроцессор использует
— — — регистр DS. Поскольку стек находится встековом сегменте,
— — — регистровую пару SS:BP очень естественноиспользовать для адресации
— — — информации в стеке.

— — — — — На Фиг. 4.7 изображен пример,демонстрирующий использование
— — — регистра BP для доступа к параметрам,переданным через стек. В этом
— — — примере головная программа передвыполнением команды CALL поместила
— — — четыре слова в стек. Подпрограммазагружает в BP указатель данных в
— — — стеке. Заметим, что смещения, используемыедля доступа к данным в
— — — стеке, учитывают тот факт, что адресвозврата также был записан в
— — — стек в результате выполнения команды CALL.

— — — — — В подпрограмме этого примера в вершинестека лежит адрес
— — — возврата, и регистр BP содержит смещениеэтой ячейки. Двумя байтами
— — — ниже в стеке лежит помещенный последнимпараметр, регистр DX-
— — — далее, через двухбайтовые интервалы -регистры CX, BX и AX. Таким
— — — образом, правильным адресом для чтенияпараметра, содержащегося в
— — — регистре DX, будет [BP+2], а другие адресаследуют через
— — — двухбайтовые интервалы. В данном примерезначение, находившееся в
— — — регистре DX, попадает в регистр AX, CX вBX и т.д.

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

— — — — — Многим подпрограммам в течение ихвыполнения также необходима
— — — локальная память, и подпрограммы могутдинамически расположить ее в
— — — стеке. Всякий раз, когда программавызывается, она может вычесть
— — — размер этой области памяти из содержимогоуказателя стека. Так как
— — — стек растет по направлению к младшимадресам, вычитание числа из
— — — регистра SP идентично помещению в стектакого же количества данных
— — — — за исключением тех данных, которые неинициализированы. После
— — — этого подпрограмма может использоватьрегистр BP для адресации
— — — такой области памяти. Когда наступаетмомент возврата, подпрограмма
— — — может прибавить соответствующее значение куказателю стека, и тем
— — — самым восстановить его прежнее значение.Динамическая организация
— — — данных означает, что программа используетобласть памяти только
— — — тогда, когда она нео
бходима для работы, ине занимает эту память
— — — все остальное время, поэтому программуможно выполнять на машине с
— — — малым объемом памяти, что невозможно придругой организации данных.
— — — Но лучшим является то, что программист недолжен создавать сложную
— — — подсистему управления памятью, так как всенаходится под
— — — управлением стековой структуры.

— — — — — Оператор возврата из подпрограммы на Фиг.4.7 демонстрирует еще
— — — одну возможность набора командмикропроцессора 8088. Команда
— — — возврата из подпрограммы RET может иметьоперанд, который
— — — представляет собой значение, прибавляемоемикропроцессором к
— — — содержимому указателя стека послеизвлечения адреса возврата. В
— — — примере используется значение 8- этоозначает, что восемь байт, или
— — — четыре слова данных должны быть удалены изстека после возврата.
— — — Эти значения исчезают навсегда. Результаттот же, какой был бы в
— — — итоге извлечения значений из стека, чтобыуничтожить их- команда
— — — возврата уже сделала это автоматически.

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

— — — — — Подпрограмма может возвратить в стекенекоторую информацию
— — — вызывающей программе. Если вызывающаяпрограмма помешает параметры
— — — в стек, подпрограмма может изменить ихзначения и оставить в стеке,
— — — а вызывающая программа может извлечь ихпосле возврата. Если
— — — подпрограмма возвращает только одинпараметр, но вызывалась с тремя
— — — параметрами в стеке, то выполнить возвратона может с помощью
— — — команды RET 4. При этом последние двапараметра извлекаются из
— — — стека и только возвращаемый параметростается в стеке.
— — — — — В гл.10, где мы используемподпрограммы на языке ассемблера с
— — — языками высокого уровня, головнаяпрограмма помещает параметры в
— — — стек. Но эти параметры — адреса данных, ане собственно данные. Это
— — — означает, что ассемблерная подпрограмма недолжна возвращать
— — — параметры в стеке и обязана извлечь всепараметры из стека при
— — — возврате.

Категория: Программирование на Ассемблере | Дата: 10.02.13

Меню раздела
Блок