Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
66
Добавлен:
15.06.2014
Размер:
205.82 Кб
Скачать

6

Лабораторная работа № 5 Подпрограммы. Передача параметров. Цель работы

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

Введение

Механизм вызова подпрограмм и возврата в точку вызова заложен в систему команд любого процессора. Не оказалась исключением и линейка процессоров Intel. Этот механизм реализуется с использованиемкомандCALLиRET. Особенности их применения обусловлены необходимостью выполнять вызовы и возвраты не только внутри сегмента, но и между сегментами.

Для облегчения описания программ и подпрограмм в Ассемблерах предусмотрены специальные средства. В ассемблерах MASM,TASMи др. таким инструментом являются процедуры, для описания которых существуютдирективыPROCиENDP.

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

  • необходимость сохранения используемых подпрограммой регистров

  • способ передачи параметров подпрограмме

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

Команды call и ret

Команды CALLиRETявляются командами передачи управления, по своему действию похожие на команду безусловного переходаJMPт.к. они тоже изменяют естественный порядок выборки и исполнения команд, передавая управление в другую точку памяти. Главным и единственным отличием командыCALLотJMPсостоит в том, что перед изменением регистров, содержащих указатель на следующую команду, их содержимое – адрес возврата – сохраняется в стеке, и лишь после этого выполняется переход на указанный адрес. Действие командыRETсостоит в том, что она восстанавливает из стека содержимое регистров, указывающих на адрес следующей команды, выполняя возврат в точку вызова – на команду, следующую за соответствующей командойCALL.

Полный указатель на следующую исполняемую команду содержится в паре регистров CS:IP(CS:EIP). РегистрCSсодержит указатель на сегмент, а регистрIPсодержит значение смещения внутри сегмента. В 16-битной модели памяти если для сохранения информации о полном адресе в стек заносятся два 16-разрядных слова (содержимоеCSиIP), то обеспечивается возможность последующего возврата из другого сегмента. Так «работает» командаCALLпри межсегментном вызове и называется поэтому «дальним вызовом» (call far). Если вызываемая процедура находится в том же сегменте, что и вызывающая программа, то значение регистраCSне изменяется, значит, запоминать его нет необходимости, и в стек заносится только одно слово – текущее значение регистраIP. Такой внутрисегментный вызов называют «ближним вызовом» (call near). Очевидно, что при возврате, который реализует командаRET, должно восстанавливаться из стека ровно столько же слов, сколько было сохранено при вызове, т.е. тип возврата – «ближний» или «дальний» – должен строго соответствовать типу своего вызова. Таким образом, существуют возвратыretfarиret near.

Процедуры

Если команда вызова подпрограммы и команда возврата из этой полпрограммы имеют разное типы (farиnearили наоборот), то после выполнения команды возврата из стека выталкивается неправильное количество слов, а в случаеretfarвCSзагружается неопределенная информация. Все это приводит к краху программы и прекращению ее выполнения операционной системой. Чтобы избежать подобных ошибок, а также для получения дополнительных удобств при программировании, следует использовать описание подпрограмм, как процедур.

Для описания процедуры используются директивы PROCиENDP. При открытии процедуры указывается ее имя и тип. Тип указывать не обязательно, если этоnear, т.к. типnearпринят по умолчанию.

Пример:

abc proc far ; открытие процедуры дальнего типа

; тело процедуры

ret ; команда возврата

endp ; закрытие процедуры

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

Пример:

prog1 proc ; открытие процедуры ближнего типа

push ax ; сохранение регистров

push dx ;

. . . ;

jnz m1 ;

pop dx ; восстановление регистров

pop ax ;

ret ; команда возврата

m1: ;

. . . ;

pop dx ; восстановление регистров

pop ax ;

ret ; команда возврата

endp ; закрытие процедуры

Соседние файлы в папке Лаба Лаб_1-5 Методички