CALL, RET, JMP - безусловная передача управления

Процедуры

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

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

Команда вызова процедуры - CALL (call a procedure -вызвать процедуру)

Эта команда, выполняет две функции:

1. Обеспечивает сохранение содержимого указателя команд IP (адреса возврата) и содержимое CS.

2.Загружает в IP новый адрес команды, соответствующий вызываемой процедуре.

Команда CALL осуществляет функции запоминания адреса возврата и передачи управления процедуре. Она помещает в стек адрес возврата, занимающий 16 битов, если процедура определена с атрибутом NEAR, и 32 бита, если она опреде­лена с атрибутом FAR. Процедуры с атрибутом NEAR могут быть вызваны только из того сегмента, в котором они находятся; процедуры с атрибутом FAR могут быть вызваны и из другого сегмента.

Команда CALL имеет формат

CALL имя

где имя - имя вызываемой процедуры (т.е. метка ее начала).

Команда RET (return from procedure - возвратиться из процедуры). заставляет микропроцессор возвратиться из процедуры в программу, вызвавшую эту процедуру делая это "откатом" всего, что сделала команда CALL. Формат команды:

RET

Команда RET обязательно должна быть последней командой процедуры, исполняемой микропроцессором. (Это не значит, что команда RET должна стоять в конце процедуры - она лишь исполняется последней.)

Команда RET извлекает из стека адрес возврата. Если процедура имеет атрибут NEAR (т.е. находится в том же сегменте команд, что и команда CALL), то команда RET извлекает из стека одно слово и загружает его в указатель команд IP. Если процедура имеет атрибут FAR (т.е. находится в другом сегменте команд), то команда RET извлекает из стека два слова: сначала смещение адреса для загрузки в указатель команд IP, а затем номер блока для загрузки в регистр CS.

Например, для вызова процедуры MY_PROC с атрибутом NEAR из некоторого места программы надо указать следующую последовательность команд (указаны также смещения адресов команд):

04F0 CALL MY PROC ;Вызвать процедуру

04F3 М2: Mov AX,BX ;Вернуться сюда из процедуры

 

0500 My_proc PROC ; Начало процедуры

Mov CL,6 ;Команды процедуры

. . .

. . .

051Е Ret ;Вернуться в основную программу
051F My proc Endp ; Конец процедуры

При исполнении команды CALL микропроцессор помещает в стек смеще­ние адреса метки М2 (04F3H), затем загружает смещение адреса процедуры MY_PROC (0500H) в указатель команд IP. Так как в псевдооператоре PROC атрибут дистанции не указан, то процедура MY_PROC по умолчанию имеет атрибут NEAR. Содержимое регистра IP изменилось, следовательно микропроцессор продол­жит исполнение с команды, имеющей это новое смещение адреса. В нашем приме­ре такой командой будет

MOV CL,6

Когда микропроцессор обнаруживает команду RET, то он извлекает адрес возврата из стека и помещает его в указатель команд IP. Это заставляет его возобновить исполнение с команды, имеющей метку М2

 

Команда JMP (jump unconditionally - перейти безусловно) застав­ляет микропроцессор извлечь новую команду не из следующей ячейки памяти, а из другой, адрес которой определен меткой. Команда JMP имеет формат:

JMP имя

где операндимяподчиняется тем же правилам, что и операнд команды CALL. Иначе говоря, он может иметь атрибут NEAR или FAR, быть прямым или косвен­ным. При прямом переходе команда JMP занимает три байта, если метка имяимеет атрибут NEAR, и пять байтов, если она имеет атрибут FAR. Например, команда

JMP М3

занимает три байта, если метка М3 находится в том же сегменте, или пять байтов, если она находится в другом сегменте. (В последнем случае, перед сегмен­том команды JMP должен быть указан псевдооператор EXTRN М3: FAR, a перед сегментом, содержащим метку, - псевдооператор PUBLIC М3.)

Если адрес метки находится не далее -128 или +128 байтов от адреса команды JMP, то можно сделать команду JMP двухбайтовой, указав, что ее операнд имеет тип SHORT (short — короткий). Например, команда

JMP SHORT М4

займет два байта. Обычно команда JMP используется для обхода группы команд, которым передается управление из другой части программы.

 








Дата добавления: 2016-01-26; просмотров: 6067;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.