Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Программир на ассемблере.doc
Скачиваний:
8
Добавлен:
17.09.2019
Размер:
605.7 Кб
Скачать

7.5.4. Команды возвратов (из подпрограмм)

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

В соответствии с типом команды вызова необходимо применять команды возвратов двух типов: внутрисегментная и межсегментная.

Однобайтная команда RET c КОП C3 реализует внутрисегментный возврат. Ее действия заключаются в том, что верхнее слово стека передается в IP, а содержимое указателя стека SP увеличивается на 2.

Однобайтная команда RET с КОП CB осуществляет межсегментный возврат. Ее выполнение сводится к следующим действиям:

1) Слово из вершины стека передается в IP;

2) Производится инкремент SP на 2;

3) Слово из новой вершины стека передается в регистр CS;

4) Производится инкремент SP на 2;

Пример:

SP:= 1080

SS:= A900

(AA080) = 3740

(AA082) = 57A8

RET (CB)

IP:= (EAS)

EAS = SP + (SS)0 = 1080 + A9000 = AA080

IP:= (AA080)

IP:= 3740

SP:=(SP) + 2 = 1080 + 2 = 1082

CS:= (EAS)

EAS = SP +(SS)0 = 1082 +A9000 = AA082

CS:= (AA082) = 57A8

SP:= (SP) +2 = 1082 +2 = 1084

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

7.5.5. Команды управления циклами

В этих командах предусматривается использование регистра СХ в качестве счетчика цикла. Формат команды:

КОП disp

Второй байт интерпретируется как знаковое целое и при необходимости передачи управления прибавляется к содержимому IP. Следовательно, диапазон переходов этих команд составляет -128...+127 байт от следующей команды.

Команда LOOP - цикл - производит декремент регистра CX и, если СХ 0, смещение прибавляется к IP - происходит переход к началу цикла; в противном случае (СХ=0) цикл окончен и выполняется следующая по порядку команда.

Команда LOOP эквивалентна двум командам:

DEC CX

JNZ disp

Команда LOOPE и LOOPZ - цикл, если равно или нуль - производят декремент регистра СХ, а затем передают управление в начало цикла, если (СХ)0 и ZF=1. В противном случае, будет выполнятся следующая по порядку команда.

Команда LOOPNE и LOOPNZ - цикл, если не равно или не нуль - производят декремент регистра СХ, а затем передают управление в начало цикла, если (СХ)0 и ZF=0. В противном случае будет выполнятся следующая по порядку команда.

7.5.6. Команды прерываний

Команда INT type - прерывание - вызывает подпрограмму обработки, определяемую типом прерывания. Тип прерывания зависит от значения бита v в КОП. Бит v зависит от того имеется или отсутствует операнд. Если v=0, второй байт команды отсутствует и тип прерывания принимается равным трем - это прерывание контрольной точки или контрольного останова. Если v=1, тип прерывания задается вторым байтом команды и может принимать значения от 0 до 255.

Выполнение команды INT инициирует следующую последовательность действий:

1) Декремент указателя стека на 2;

2) Включение в стек содержимого регистра флагов;

3) Сброс флагов IF и TF (запрещение восприятия прерываний и покомандной работы);

4) Декремент указателя стека на 2;

5) Включение в стек содержимого регистра CS;

6) Определение значения ADDRESS путем умножения кода типа прерывания на 4;

7) Загрузка в регистр CS слова памяти по адресу ADDRESS + 2;

8) Декремент указателя стека на 2;

9) Включение в стек содержимого регистра IP;

10) Загрузка в регистр IP слова памяти по адресу ADDRESS;

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

Однобайтная команда INT (тип прерывания равен 3) используется в процессе отладки программ.

Команда программного прерывания короче команды CALL межсегментного вызова, и, кроме того, она запоминает в стеке содержимое регистра флагов. При этом вызванная подпрограмма обязательно должна заканчиваться командой возврата из прерывания IRET.

Команда IRET - возврат из обработки прерывания - предназначена для выхода из подпрограммы обработки прерываний. Действия команды IRET противоположны действиям команды INT:

1) Слово из вершины стека передается в IP;

2) Производится инкремент SP на 2;

3) Слово из вершины стека извлекается в CS;

4) Производится инкремент SP на 2;

5) Слово из вершины стека передается в регистр флагов;

6) Производится инкремент SP на 2;

Команда INTO - прерывание переполнению - генерирует программное прерывание в том случае, если в результате операции установлен флаг переполнения OF=1. Команда INTO выполняется так же, как команда INT, но имеет фиксированный тип прерывания, равный 4.

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