8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 16 17 18 19 20 21 22 ... 39

г

Команда CALL

Команда RET

Главная программа

Подпрограмма АдресКоманда

MOTOR

Группа команд, запускающая

двигатель в нужное время

RET

«MOTOR» - это символический адрес (метка) первой команды подпрограммы

Рис. 6.7. Главная программа и подпрограмма

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

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

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

130 ==-= ========-==-==-=-

Давайте посмотрим, как происходит обработка соответствующих команд в ЦПУ. В памяти микрокомпьютера есть специальная область, в которой хранится адрес возврата из подпрограммы (адрес команды, следующей за командой CALL). Эта область памяти называется областью стека. Обратимся к Рис. 6.8. Программа микрокомпьютера обычно загружается в память с адреса 0000Н и выполняется в порядке возрастания адресов команд. Напротив, загрузка в стек происходит с конца области стека, причем в порядке уменьшения адресов.

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

Попробуем более подробно разобраться в том, как выполняются команды CALL и RET, как работают счетчик команд (PC) и указатель стека (SP), а также что представляет из себя область стека.

Память

0000Н

Адрес команды, следующей за той, которая выполняется в данный момент

ЦПУ

Счетчик команд

PC

Указатель стека

SP

Указывает адрес, по которому хранится адрес возврата из подпрограммы

Значение указателя стека

lj> ххххх< 2FFF

~~--

s ж

в-

о

о., с

Область памяти (ПЗУ, ОЗУ), в которой хранится программа

Здесь хранится адрес возврата из подпрограммы, выполняемой в данный момент

Область памяти, хранящая адрес возврата в исходную программу (только ОЗУ)

*с- 6.8. Указатель стека и область стека

131


т

Выполнение команды CALL:

1.ЦПУ считывает команду «CALL lm» в машинных кодах (CD m I). В этот момент в счетчике команд (РС) находится адрес команды, следующей за командой CALL.

2.По адресу SP- 1 загружается первый байт (8 старших разрядов) из счетчика команд, по адресу SP-2 - второй байт из счетчика команд. Таким образом, указатель стека принимает значение (SP-2). Эта операция называется «загрузкой в стек» (PUSH).

3.Значение счетчика команд устанавливается равным lm, то есть адресу первой команды подпрограммы.

Выполнение команды RET:

1.ЦПУ считывает команду RET в машинных кодах (С9). В этот момент счетчик команд показывает адрес команды, следующей за командой RET.

2.Содержимое памяти по адресу, находящемуся в указателе стека SP загружается во второй (8 младших разрядов) байт счетчика команд, а содержимое ячейки с адресом SP+1 - в первый байт счетчика команд. Указатель стека принимает значение SP+2. Эта операция называется «извлечением из стека» (POP).

Команда вызова подпрограммы (CALL) может применяться не только для вызова из главной программы. Она часто используется в подпрограмме для вызова других подпрограмм.

Так в примере, приведенном на Рис. 6.9, из главной программы вызывается Подпрограмма 1, в свою очередь Подпрограмма 1 вызывает Подпрограмму 2. На рисунке показано состояние указателя стека SP и соответствующие области стека при выполнении каждой из программ.

В приведенном примере 0102Н и 0512Н - это адреса команд, следующих за каждым из операторов CALL, то есть адреса возврата из соответствующих подпрограмм в главную программу. Указатель стека следит за тем, чтобы после выполнения какой-либо подпрограммы всегда можно было безошибочно вернуться в нужное место исходной программы.

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

Главная

программа Подпрограмма 1 Подпрограмма 2

Память

Команда CALL 0102Н

X

Команда RET

Значение указателя стека в данный момент времени

Адрес

Команда RET > 2FFBH r@C>2FFC 2FFD ф EZ>2FFE 2FFF

® О зооо

Область стека

12Н

05Н

02Н

01Н

Адрес возврата в подпрограмму 1

Адрес возврата в равную программу

Рис. 6.9. Пример выполнения программы, вызывающей подпрограммы

числами, под область стека отводятся 16-разрядные регистры или пары регистров В-С, D-E, H-Lh т.д. Побайтовое занесение адресов указателя в 16-разрядный регистр, выполняющий функцию стека, осуществляется посредством команд PUSH и POP.

Q

Пример

Р

«PUSH HL»

PUSH: загрузка данных в стек

«РОР ВС»

POP: считывание ) данных из стека )

Содержимое регистра Н загружается по адресу SP-1, содержимое регистра L - по адресу SP-2, указатель стека принимает значение SP-2

Содержимое ячейки памяти с адресом SP загружается в регистр С, содержимое ячейки с адресом SP+1 - в регистр В, указатель стека принимает значение SP+2


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

Перейдем к рассмотрению команд. КОМАНДЫ ВВОДА обеспечивающих обмен данными меж-И ВЫВОДА (IN OUT) w микрокомпьютером и внешними уст ройствами. Из предыдущих глав мы

знаем, что обмен данными между микрокомпьютером и внешним!: устройствами осуществляется только через порты ввода-вывода.

По команде ввода ЦПУ обращается к порту ввода, чтобы считать данные, доставленные с внешнего устройства, и помещает их в регистры. По команде вывода данные из ЦПУ пересылаются в порт вывода. Структура команд ввода-вывода представлена в Табл. 6.11.

IN, OUT - это сокращенная запись английских слов Input (ввод) и Output (вывод). Адрес порта микрокомпьютера указывается в области, соответствующей десятичным числам 0...255, поэтому п представляет собой 1-байтовое двоичное число. Так, ЮН соответствует десятичному числу 16, а ОАОН - числу 160. Сами же команды ввода и вывода - 2-байтовые команды. Рассмотрим порядок их выполнения

Таблица 6.11. Команды ввода-вывода

Команда языка ассемблера

Машинный код команды

Описание операции

Требуемое число

импульсов тактовой частоты

IN А, (и)

DB п

Содержимое порта ввода, имеющего адрес л, загружается в регистр А

11

OUT (п), А

D3«

Содержимое регистра А пересылается в порт вывода по адресу п

11

Цикл считывания данных из порта ввода

Последовательность выполнения ЦПУ команды «Ш А, (и)» (мГ шинный код - DB п) представлена на Рис. 6.10.

Выполнение «IN А, (я)» (машинный код - DB я)

Требуемое число

импульсов тактовой частоты

Машинный цикл

Первый байт команды «DB» считывается в ЦПУ

Цикл чтения из памяти

Второй байт «т считывается в ЦПУ

Цикл чтения

из портов ввода-вывода

Выполнение команды

Рис. 6.10. Последовательность выполнения команды «IN А, (л)»

В течение первого машинного цикла (Рис. 5.5), занимающего время, равное 4 периодам тактовой частоты, считывается 1-й байт машинного кода «DB». По этому коду ЦПУ «узнает» команду ввода, посредством которой в регистр А записываются данные из порта ввода. Чтобы определить адрес порта, из которого нужно транслировать данные, ЦПУ осуществляет второй цикл считывания из памяти, для чего требуется еще 3 импульса тактовой частоты. Расшифровав таким образом 2-байтовую команду ввода, ЦПУ переходит к циклу записи Данных из порта ввода в регистр А (4 импульса тактовой частоты).

В процессе передачи сигналов ЦПУ, управляющих вводом данных из порта ввода, используются шина адреса (8 младших разрядов указывают адрес порта), шина данных, сигнал запроса ввода-вывода (IORQ) и считывания данных (RD). На Рис. 6.11. показано, как происходит синхронизация этих сигналов в цикле чтения из порта ввода.

В течение первого такта работы ЦПУ в младших разрядах (Ао...А7) шины адреса устанавливается адрес порта п. После окончания 1-го такта посылаются сигналы IORQ и RD. По этим сигналам происходит выбор адреса порта и осуществляется подготовка порта Ввода, расположенного по адресу и, к передаче данных (данные, Ранящиеся в порте ввода, выводятся на шину данных). В последам такте (Т4) ЦПУ открывает шину данных, подключается к ней и принимает данные из порта ввода, установленные на шине данных, в регистр А.



0 ... 16 17 18 19 20 21 22 ... 39