Раздел: Документация
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. Команды ввода-вывода
Цикл считывания данных из порта ввода Последовательность выполнения ЦПУ команды «Ш А, (и)» (мГ шинный код - 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
|