- •Введение
- •1 Основы микропроцессорной техники
- •1.1 Классификация команд и архитектура ЭВМ
- •1.2 Секционный микропроцессор.
- •1.3 Однокристальный микропроцессор.
- •1.4 Микропроцессорный модуль.
- •3.1 Тип кода операции с dst и rsc
- •3.2 Тип кода операции с dst. Группа коман MOV
- •4 Организация стековой памяти
- •5 Команды сдвигов и приращений.
- •5.1 Команды приращений
- •5.2 Команды сдвига
- •6 Арифметико-логические команды
- •6.1 Команды сложения
- •6.2 Команда сложения с учетом переноса
- •6.3 Операция вычитания
- •6.4 Команда вычитания с учетом заема
- •6.5 Команда логической функции ИЛИ
- •6.6 Команда логической функции И
- •6.7 Команда «Исключающая ИЛИ»
- •Внутриразрядная сумма = 0
- •6.8 Команда сравнения — компарации
- •7 Команды ветвления и переходов
- •7.1 Команды ветвления
- •7.2 Команды перехода
- •8.1 Внутрисегментные переходы
- •8.2 Межсегментные переходы
- •10 Цепочные команды
- •11 Другие одиночные команды
- •13.1 Процедура прерываний и команды прерываний
- •Адрес
- •13.2 Режимы работы ПКП
- •13.3 Программирование ПКП
- •14 Параллельный интерфейс
- •15 Последовательный интерфейс
- •15.1 Антология последовательного интерфейса
- •15.3 Описание регистров 8250 и программирование
- •Регистр управления линией
- •Регистр управления модемом
- •15.4 Порядок инициализации 8250
- •16 Программируемый таймер
- •16.7 Временные диаграммы таймера
- •16.8 Программирование таймера
- •Чтение счетчика канала 2
- •16.9 Чтение содержимого счетчиков
- •16.10 Таймер на системной плате IBM PC
- •17 Клавиатурный интерфейс
- •18. Заключение
- •Приложение А
- •Действие
- •Сегментный регистр
- •Действие команды
- •Действие команды
- •Действие команды
- •SAHF — сохранение <AH> в F
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
- •Команда – действие команды
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