Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

8 Команды перехода между программой и подпрограммой

В этой главе рассмотрим команды переходов, позволяющие осуществлять переход из тела программы к подпрограмме и возврат назад. Сразу поставим точки над i: подпрограммой будем называть такую программу, которая заканчивается безадресным переходом типа RET (RET — RETURN — возврат). Эти команды используются, главным образом, в двух видах.

Что делает микропроцессор, обнаружив КОП безадресного перехода

RET NEAR (КОП=СЗ,

ассемблер:

RETN) или RET FAR (КОП=СВ,

ассемблер: RETF)?

СЗ (ассемблер: RET или RETN),

 

 

а) если КОП =

то

МП

8086 производит скрытую операцию

чтения стека POP IP:

IP

:=

<Stack>.

б) если КОП = СВ ( ассемблер: RETF — возврат издалека, из другого сегмента), то МП 8086 производит две скрытых операции чтения стека: сначала POP IP, потом POP CS:

IP := <Stack>;

CS := <Stack>.

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

Поскольку смысл любой подпрограммы в том, чтобы выполнять какую-то часто повторяемую процедуру и возвращаться туда, откуда произошел «скачок» на подпрограмму, и принимая во внимание, как происходит безадресный возврат, нетрудно догадаться, что где-то должны позаботиться о том, чтобы прежде, чем сделать «скачок», в стеке остался на сохранение адрес той команды, которая была следующей, но еще не успела выполниться. И судя по командам возврата, должно быть два типа таких команд-скачков, из которых одна перед «скачком» отправляет в стек только содержимое IP, а вторая сначала отправляет в стек содержимое CS, а потом —содержимое IP.

Рассмотрим эти два типа команд, которые имеют мнемонику

CALL1(CALL —вызов).

8.1Внутрисегментные переходы

8.1.1Внутрисегментный, с относительной адресацией; команда 3-х

байтовая:

а) ассемблер: CALL Addr;

б) КОП = Е8.

Все процедуры формирования смещения такие же, как в п.2 главы 7 для команды JMP.

54

Пример 1 — Пусть команда CALL 010F находится по адресу 0100. Вычисляем disp, учитывая, что команда трехбайтовая: disp = 010F — (0100 + 3) = 000C. В целом получаем:

Address

Command

Assembler

0100

E8

CALL 010F

0101

OC

 

0102

00

 

0103

КОП следующей

 

команды

 

Как выполняется команда CALL 010F ?

1). Stack:= <IP> = 0103 (спрятать в стек адрес следующей команды, то есть адрес возврата);

2). IP:= 010F (назначить IP новый адрес — адрес подпрограммы). 8.1.2 Внутрисегментный, с косвенной адресацией

а) Ассемблер: CALL NEAR dst. Комментарий: перейти по адресу, который находится в dst (2 байта);

б) КОП:

Пример 2 — Пусть АХ=010F и пусть имеет место следующий фрагмент программы:

Address

Command

Assembler

0100

FF

CALL AX

0101

E0

 

0102

КОП следующей

 

команды

 

Результат выполнения этого фрагмента:

1)Stack := <IP> = 0106;

2)IP := <AX> = 010F.

8.2Межсегментные переходы

8.2.1Межсегментный, с прямой адресацией; команда 5-и байтовая:

55

а) ассемблер: CALL CS:IP; б) КОП = 9A.

Пример 3 —Пусть имеет место следующий фрагмент программы:

Address

Command

Assembler

175 : 0100

9A

JMP

F000:E987

 

 

 

1750

: 0101

87

 

1750

: 0102

E9

 

1750

: 0103

00

 

1750

: 0104

F0

 

1750

: 0105

КОП следующей

 

команды

 

Разберем подробнее результаты этой команды. Пусть текущая вершина стека была: SP = FFFE. Выполнение команды CALL F000:E987 можно разделить на 2 цикла.

1-й цикл: в стек засылается последовательно содержимое <CS> и <IP>.

2-й цикл: CS и IP присваиваются значения соответственно F000 и E987. Все иллюстрирующие пример 3 результаты представлены на рисунок 8.

8.2.2 Межсегментный, с косвенной адресацией:

а) ассемблер: CALL FAR dst.

Как и для соответствующей команды JMP FAR dst (см. пункт

5 главы 7), dst — это 4 ячейки памяти с адресом младшей ячейки Addr, так как адрес перехода 4-байтовый.

б) КОП:

56

Порядок выполнения команды.

1) Загрузка прерванного адреса CS:IP в стек как в п.8.2.1:

Stack : = <CS>; Stack : = <IP>.

Адрес новой вершины стека:

SP = <SP>-4.

2) Переход на новый адрес в новом сегменте происходит как в п.5 главы 7 для команды JMP:

IP:=[dst=<MAddr>]; CS:=[dst=<MAddr+2>].

Подводя итог, можно отметить, что однотипные команды JMP и CALL полностью совпадают по своим действиям в части перехода, но в отличие от команды JMP команда CALL перед переходом отправляет в стек адрес возврата

впрограмму, то есть адрес команды, следующей за командой CALL.

9.Команды условного перехода для организации циклов

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

Пример 1 — Пусть имеет место фрагмент программы:

MOV CX, 0100 ; Загрузить в CX число 25610.

M1: DEC CX

; Уменьшить содержимое CX на единицу, и

JNZ M1

; если CX ≠ 00, то снова перейти на команду DEC CX

 

(метка М1).

Здесь вместо адреса перехода, так как программа не транслирована (еще нет ни машинных кодов, ни адресов), ставим метку М1. Очевидно, что число циклов здесь 256. И пока цикл не выработается, программа дальше не пойдет.

Поскольку циклы — это часто используемый прием (организация

таймера, задержек, перебора

данных и тому подобное), то в МП

8086 реализована специальная

группа команд-циклов под общим

названием LOOP Address (loop — делать петлю). Эти команды организует цикл по умолчанию только в CX. И прекращается цикл тогда, когда CX «обнулится» (за исключением одной команды).

57

Приведенный выше пример с помощью одной из этих команд можно продублировать так:

Пример 2 — Программа цикла с использованием LOOP: MOV CX, 0100; Загрузить в CX число 25610.

M1: LOOP M1 ; Уменьшить содержимое CX на единицу, и если CX = 0, то перейти на метку М1.

Характеристика команды типа LOOP:

1)адрес короткий; самый длинный переход: ± 12710 адресов;

2)адрес в ассемблере — прямой; адрес в машинном коде — смещение со знаком в дополнительном коде (относительная адресация);

3)команда типа LOOP на флажки не воздействует (в отличие от

команды DEC в примере 1) ;

4) команда двухбайтовая: КОП – 1 байт и смещение – 1 байт. Существует четыре разновидности этой команды. Ниже приведен

обобщенный код операции:

В таблице 9 приведены данные для синтеза команды с указанием условий переходов (в скобках - альтернативное обозначение ассемблера).

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

Таблица 9 — Циклические команды

Тип

Ассемблер

Условия перехода

Счетчик:<CX>-

команды

1

11

JCXZ M1

Перейти на адрес М1, если CX=0

Нет

 

 

 

 

 

10

LOOP M1

Перейти на адрес М1, если CX≠0

Есть

 

 

 

 

 

01

LOOPZ M1

Перейти на адрес М1, если CX≠0 и Z=1

Есть

(LOOPE M1)

(конъюнкция)

 

 

00

LOOP NZ M1

Перейти на адрес М1, если CX≠0 и Z=0

Есть

(LOOP NE) M1

(конъюнкция)

 

 

Пример 3 — Пусть в ОЗУ находится массив данных длиной в 25610 байт, начиная с адреса 0500. Составить программу просмотра

58