Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты Дорогов.docx
Скачиваний:
9
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

7 Билет

JMP, CALL – обеспечивает как ближние, так и дальние вызовы (между сегментами)

JMP адрес БЕЗУСЛОВНЫЙ ПЕРЕХОД

По этой инструкции управление безусловно передаётся по указанному адресу. В отличие от CALL инструкция JMP не помещает в стек никакой информации, и возврата к следующей за JMP инструкции не обеспечивается. Подобно CALL адрес получающей управление инструкции может быть получен из самой JMP (прямая JMP) или из ячейки памяти или регистра, специфицированных в JMP (непрямая JMP). С другой стороны, передача управления может быть как внутрисегментной, так и межсегментной. Внутрисегментная прямая JMP изменяет содержимое регистра IP, добавляя туда смещение целевой инструкции относительно себя. Если ассемблер обнаружит, что эта инструкция отстоит от JMP не более, чем на 127 байтов, он автоматически генерирует двухбайтную форму инструкции (короткая JMP); в противном случае формируется ближний JMP, который может адресовать цель в пределах от -32К до +32К. Эти формы JMP являются самоотносительными и динамически переместимыми (JMP и целевая инструкция находятся в одном сегменте и перемещаются вместе) и могут поэтому использоваться в адресно независимых программах. Внутрисегментная непрямая JMP может функционировать через память или через регистр. В первом случае содержимое адресуемого инструкцией слова памяти помещается в регистр IP. Во втором новое значение IP выбирается из указанного 16-битового регистра. Межсегментная прямая JMP помещает в регистры IP и CS значения, специфицированные инструкцией. Межсегментная непрямая JMP может функционировать только через память. Первое слово из адресуемого инструкцией 4-байтного указателя помещается в регистр IP, второе - в CS.

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

CALL имя-процедуры ВЫЗОВ ПРОЦЕДУРЫ Инструкция CALL активизирует указанную процедуру, сохраняя в стеке адрес следующей за CALL инструкции. Ассемблер генерирует инструкцию CALL разных типов в зависимости от того, с каким описателем объявлено имя-процедуры: NEAR или FAR. Для корректного возврата из процедуры тип инструкции CALL должен соответствовать типу инструкции RET, выполняющей этот возврат. Потенциальная возможность несоответствия имеет место, когда инструкция CALL и сама процедура находятся в раздельно транслируемых частях программы. Обычно ассемблер сам следит за соответствием вызовов и возвратов. Дополнительно об этом см. «Система программирования на макроассемблере MS-DOS. Часть 3. Директивы языка ассемблера», п. 3.2. Различные формы CALL позволяют получать адрес процедуры из самой инструкции (прямая CALL) или из области памяти или регистра, на которые ссылается CALL (непрямая CALL). Следует помнить, что процессор автоматически устанавливает регистр IP указывающим на следующую инструкцию до сохранения его в стеке. Для внутрисегментной прямой CALL содержимое регистра SP уменьшается на 2, и в стек помещается содержимое регистра IP. Затем к содержимому IP добавляется относительное смещение адреса процедуры, изменяющееся в пределах от –32К до +32К. Эта форма CALL является самоотносительной и динамически переместимой (CALL и процедура находятся в одном сегменте и перемещаются вместе) и может поэтому использоваться в адресно независимых программах. Внутрисегментная непрямая CALL может функционировать через память или через регистр. Содержимое SP уменьшается на 2, и в стек помещается содержимое IP. Смещение процедуры извлекается из специфицированных в инструкции слова памяти или 16-битового регистра и заносится в IP. Для межсегментной прямой CALL содержимое SP уменьшается на 2, и в стек помещается содержимое регистра CS. В CS заносится полученное из инструкции слово сегмента. SP снова уменьшается на 2, и в стек помещается содержимое IP, а в сам IP заносится слово смещения из инструкции. В случае межсегментной непрямой CALL, которая может функционировать только через память, содержимое SP уменьшается на 2, в стек заносится регистр CS, в который затем копируется 2-е слово из адресуемого инструкцией 4-байтного указателя. SP снова уменьшается на 2, и в стек помещается содержимое регистра IP, куда затем заносится 1-е слово указателя.