Разделы
Публикации
Популярные
Новые
|
Главная » Сопряжение цифровых, аналоговых сигналов 1 ... 15 16 17 18 19 20 21 ... 59 совместно с байтом состояний (байтом, содержащим все флажки условий). В памяти (ЗУПВ) стек может удлиняться в направлении своего конца, причем содержимое указателя стека (УС) автоматически уменьшается на 2 после каждого занесения в стек и увеличивается на 2 после каждого извлечения. Употребление стека связано главным образом с обращениями к подпрограммам: при вызове подпрограммы процессор всегда заносит в стек адрес возврата, так что он не теряется и может быть возвращен (см. приведенное ниже описание команды CALL). Свойство стека последним вошел - первым вышел облегчает организацию обращений к подпрограммам из подпрограмм. Фактически подпрограммы могут обращаться даже к самим себе, если предшествующие параметры тоже занесены в стек. Можно использовать стек и для временного хранения чисел, параметров и других данных. Это позволяет программам быть рекурсивными (т. е. программы могут обращаться к самим себе, или они могут обращаться к другим программам, которые в свою очередь могут обращаться к первоначальной программе) и, кроме того, дает возможность использовать память более экономно, чем при выделении специальных ячеек для временного хранения данных. Однако при любом использовании стека в одном отношении следует быть особенно осторожным надо всегда точно помнить, что и в каком порядке было занесено в стек. Вы наверняка ошибетесь, если сделаете больше извлечений из стека, чем сделали перед тем занесений. Стек оказывается полезным во время ухода в подпрограмму, поскольку в нем можно сохранять состояние машины (содержимое накопителя, разрядов условий и регистров). Например, это можно сделать так: SUBR: PUSH PSW PUSH В PUSH D PUSH Н POP Н POP D POP В POP PSW RET Команда PUSH PSW заносит в стек содержимое накопителя и байта состояний. Приведенная программа сохраняет в стеке состояние машины и восстанавливает его перед окончанием работы подпрограммы. После включения машины в указатель стека необходимо заслать начальный адрес, для чего обычно используется команда LXI SP, загружающая в УС непосредственные данные. В случаях, когда производится ветвление с уходом в подпрограмму, бывает желательно сохранить содержимое указателя стека и по окончании работы под- LHLD OLDSTK SPHL ; восстановить первоначальное состояние УС Упражнение 11.2. Организовать стек при помощи программы, т. е. написать последовательности команд, эквивалентные командам PUSH и POP. Указание; в качестве указателя стека использовать двойной регистр. В случае команды PUSH уменьшайте (на сколько?), после чего загружайте в память с косвенной адресацией. Команды перехода и флажки условий. Обычную последовательность выполнения команд можно изменять при помощи переходов и обращений. Команда перехода осуществляет ветвление по указанному (непосредственно) адресу. При этом команда безусловного перехода (JMP) выполняет ветвление всегда, в то время как команды условного перехода (JC, JNC, JZ, JNZ и т. д.) выполняют его, только если установлен флажок соответствующего условия. Например, следующие команды осуществляют цикл длиной 100 шагов: MVI В. 100 LOOP; DCR В JNZ LOOP Поскольку не все операции устанавливают флажки, надо соблюдать некоторую осторожность. За приблизительное правило можно принять, что (а) арифметические операции действуют на все флажки, (б) логические операции сбрасывают флажок переноса и действуют на все другие флажки, (в) приращение и уменьшение на 1 не действуют на флажок переноса, но действуют на все другие флажки и (г) операции с двойными регистрами не действуют на флажки (за исключением команды DAD). Например, нельзя использовать флажок переноса для контроля переполнения при операции уменьшения на 1. Оператор CALL производит безусловный переход по непосредственно указанному адресу, так же как и оператор J MP, но в дополнение к этому CALL заносит в стек содержимое программного счетчика (т. е, адрес следующей команды). В конце подпрограммы оператор возврата (RET) извлекает этот адрес из стека и заносит его в ПС, выполняя тем Программы вернуть УС в первоначальное положение. Вот отрывок программы, который это делает: LXI Н,0 DAD SP ; загрузить содержимое УС в HL SHLD OLDSTK ; запомнить его LX1 SP,NEWSTK ; загрузить в УС новое значение самым возвращение к исходной последовательности команд, как показано в программе 11.3. Подпрограмма ADDAB просто прибавляет MOV В, М INX Н MOV А, М CALL ADDAB ; перейти к подпрограмме; содержимое PC занести в стек ; программа возвращается сюда после выполнения ADDAB ADDAB: ADD В RET Программа 11.3 ; прибавить В к накопителю ; извлечь значение PC содержимое В к накопителю; она не заслуживает названия подпро-Iграмма , но тем не менее иллюстрирует все существенные особенности обращения к подпрограмме. В данном случае параметры были пережданы через регистры А и В, но можно было бы использовать специально *;Отведенные ячейки памяти или передать указатель через регистры или стек. Как и команды перехода, команды обращения к подпрограмме ti возврата из подпрограммы существуют в виде восьми условных раз- новидностей. Прерывания и возобновления. При включении процессора вы-полненйе команд всегда начинается с нулевой ячейки. В дополнение К этому команда RST п передает управление в ячейку с номером п и одновременно заносит в стек адрес возврата. Например, ;RST 3 производит похожую на обращение к подпрограмме передачу управления в ячейку с номером 18Н (24io), в то время как RST О Имитирует возобновление работы при включении. Микропроцессор 085 имеет также два типа устройств прерывания: протокол одного 03 них аналогичен протоколу прерывания мини-ЭВМ, описанной в щл. 10 (а именно, цепочка сигналов подтверждения прерывания после го, как принят запрос на прерывание). Более удобна процедура прерывания при помощи трех специально предназначенных отводов gPRST 5.5 , RST 6.5 и RST 7.5 , Когда по одной из этих линий полу- leH запрос прерывания (первые две из них действуют по сигналу ЫСОКОГО уровня, а третья по фронту импульса), пронессор пере-ет управление (занося в стек, как и при обращении к подпрограмме, ее возврата) в ячейки 2С, 34 или ЗС соответственно. Как и в случае МС-16, имеются маска прерываний и запрещение прерываний, до-llynHbie при помощи команд SIM, El и DI, Упражнение И.З. Объясните, точему векторные прерывания RST 5.5 и т. д, еренумерованы таким способом, 178 Г лат 11 Наконец, команда NOP просто занимает место (и время), а по команде HLT процессор останавливает выполнение программы и ожидает прерывания. Вместо этой команды можно было бы организовать ожидание прерывания при помощи цикла из переходов. Ввод!вывод, организованный как память. Интересной альтернативой специальным командам ввода/вывода IN и OUT является такая организация ввода и вывода, при которой устройства ввода/вывода соединены с адресной шиной и ведут себя как ячейки памяти (расположенные обычно далеко в ее пространстве). Ее всегда можно осуществить для таких процессоров, как 8085, но для некоторых других процессоров, не имеющих специальных команд ввода/вывода, это един-стеенный способ организовать ввод и вывод. Примерами могут служить процессоры 6800, 6809 и мини-ЭВМ 68000 и PDP-U. Процессор 8085 не имеет относительной адресации. Система команд микропроцессора 8085 типична дня большинства простых микропроцессоров. Однако в его языке отсутствует обычная в других микропроцессорах относительная адресация, как, например: JZ offset Как правило, это была бы двухбайтовая команда, в которой o{fset (смещение) обозначало бы однобайтовое число со анаком, указывающее, к которой по счету команде отмосительно следцющй кометды & программе следует осуществить переход. Например, программа IN port JNC -5 NEXT . при помощи команды условного перехода продолжает проверять СЗР байта, поступающего из порта В/В, пока не будет введен байт с ненулевым СЗР, после чего будет выполнена следующая команда. Поскольку обычно бывает достаточно однобайтового смещения (обеспечивающего возможность переходов на расстояние до ±128 ячеек), применение относительной адресации позЕюляет экономить программную память; чтобы можно было перейти к любой ячейке памяти, как правило, бывают дополнительно разрешены условные переходы с двухбайтовыми смещениями. Кроме того, относительная адресация - это изящный прием, позволяющий перемещать в памяти программы без их дополнительной сборки. Вероятно, впоследствии вам придется написать подобную программу с переходом к помеченному (команда IN) оператору; тогда ассемблер организует этот переход при помощи условной адресации, если, конечно, ваш микропроцессор будет ее иметь И,4. Представление на машинном языке Как уже было отмечено вьш1е, язык ассемблер, с которым мы до сих пор имели дело, это еще не та объектная программа , которую в действительности выполняет микропроцессор, а удобное для составления программ мнемоническое представление. Образующая программу последовательность команд на ассемблере должна быть преобразована (транслирована) в последовательность байтов, с которой про- . дессор мог бы непосредственно оперировать. Это можно сделать либо ; вручную, заменяя КОП каждой команды соответствующим байтом и оодставляя правильные адреса и данные в команды, имаощие в длину более одного байта, либо при помощи стандартной программы ассемблер, которая преобразует записанный в памяти файл, содержащий алфавитно-цифровую входную программу (программу, составленную , на языке ассемблера), в последовательность байтов, образующую I объектную программу. I Короткие программы легко транслировать вручную, и вы будете [ вероятно, делать именно это во время работы с панелью управления - (см. разд. 11.14). Однако для более сложных программ такая работа I оказывается слишком утомительной и подверженной ошибкам, поэтому в высшей степени желагелшо использовать более совершенную систему развития , оборудованную ЗУ на дисках, системой управления, редактором текста и ассемблером. В любом случае для отладки программ важно понимать, как устроено соответствие между входной Программой на ассемблере я объектной программой на машинном языке. \ Коды операций. Каждая команда языка микропроцессора 8085 преобразуется в команду на машинном языке, имеющую в длину от одного до трех байтов. Приведем несколько примеров: Мнемокод * Длина, байты (шест надцатер ич ный) JMP пп СС п (старший) п (младший) 3 JZ пп СА п п 3 OUT р D3 р 2 Ш р DB р 2 ?€Р1 d FE d 2 mow С, А 4F . mow С, М 4Е ADD Е 83 ilET С9 STC 37 :ANI d Е6 2 ак и в табл. 11.1, здесь пп обозначает двухбайтовый адрес, р - номер 1орта (один байт) н d - один байт непосредственных данных. Те коман-которые самн подразумевают необходимые операнды, имеют в длину один байт, если же для выполнения команды нужна дополнительная информация, например непосредственные данные или адрес, то такая команда занимает в длину несколько байтов; в таких случаях один мнемокод языка ассемблера будет транслирован как несколько последовательных байтов объектной программы, и их выполнение потребует нескольких обращений к памяти только для того, чтобы процессор получил полную команду. Время выполнения и длина команд. В таблЛ 1.2 перечислены все команды микропроцессора 8085 и для каждой указаны ее длина (в байтах) и время выполнения (в машинных тактах). Один машинный такт по длительности равен тактовому периоду; таким образом, команда Ш port , например, выполняется за 3,25 мкс (тактовый период равен 325 нс), в то время как команда JNC adr занимает 2,28 мкс, если разряд переноса установлен в 1, и 3,25 мкс в противном случае. Длина команды, вообще говоря, зависит от количества информации, необходимой для ее выполнения. Например, ADD С занимает всего один байт, а ADI 2СН требует дополнительного байта для непосредственной константы. Мы вскоре узнаем, что для указания регистра, используемого в командах вроде ADD, не требуется дополнительных байтов, поскольку для этого специально предназначены три бита в самом байте КОПа. Заметим, что любая команда, содержащая адрес (CALL, JMP, LDA, STA), занимает в общей сложности три байта, если, конечно, этот адрес не содержится в двойном регистре, как в случае команды ADDM (однобайтовая команда). Пример трансляции. Чтобы ясно понять действие ассемблера и свойства команд машинного языка, мы попытаемся вручную транслировать на машинный язык кусок простой программы. Сначала мы ознакомимся с самой этой программой (программа 11.4), которая предназначена для вывода символом на алфавитно-цифровой экран и восстановления символов, напечатанных на клавишном устройстве, и составлена на языке ассемблера. Комбинацию клавишного устройства и алфавитно-цифрового устройства вывода обычно называют терминалом; главный терминал вычислительной системы часто называют системной консолью. Напомним еще раз, что программа ассемб-Siep оперирует с записью программы на входном языке, состоящей из строк символических операторов, подобных тем, с которыми мы до сих пор встречались; они первоначально составляются пользователем обычно при помощи специальной программы - редактора и временно сохраняются на диске или другом ЗУ с большой емкостью. Ассемблер преобразует программу на входном языке в программу на машинном языке, которая можетвыполняться непосредственно процессором. Это делается посредством последовательной загрузки в ЗУПВ или в перепрограммируемое ЗУ (при этом, конечно, теряется хранившаяся там раньше информация) для обеспечения постоянного доступа микропроцессора к программе. Ассемблер понимает мнемокодыстандартной системы команд, но не понимает используемых в программе имен или Таблица 11.2 Действие на флажки, количество занимаемых ячеек памяти и время выполнения команд микропроцессора 8085 Мнемокоды Байты Т-такты Исключения Операции с регистрами INR DCR MOV MVI \ Операции с накопителем , LDA, STA ILDAX, STAX [,IN, OUT ADD, ADI , ACI , SUI SBI , ANI . ORI , XRI , CPI . RAR RRC , STC , ерации с парами реги-ров XI AD NX, DCX ICCHG l-HLD, SHLD Эперации со стеком >USH p r> HL THL ходы, враты обращения, S, P, AC S, P, AC Z. C, S, Z, C,S, Z,C, S. Z, C, S, z, c, s, z, c, s, z, c, s. z, c, s, с с P, AC P, AC P, AC P, AC P,AC P, AC P, AC P, AC Z, C, S, P, AC С 1 1 I 3 2 2 I, 2 1, 2 1. 2 1. 2 1. 2 1, 2 1, 2 Ь 2 1 I 1 1. I 3 1 1 1 1 1 1 1 4 4 4 7 13 10 10 4, 7 4, 7 4, 7 4, 7 4, 7 4, 7 4, 7 4, 7 4 4 4 4 4 10 10 6 4 16 12 10 6 16 INR M DCR M MOVM MVI M ADD M ADC M SUB M SBB M ANA M ORA M XRA M CMP M Продолжение
Примечание: С-бит переноса, Z-бит нулевого признака, S -бит знака, Р-бит четиости и АС-бит переноса при десятичной коррекади (дополтщтельный бит переноса), Флажок С сбрасывается н устанавливается флаг АС. Фдажкн С и АС сбрасываются. Флажок Z устанавливается при равекстве, если А<операнда, устанавливается флажок С. Команда POP PSW восстанавливает из стека все флажки Десять машинных тактов, если условие выполнено и иерекод происхддит, в цротнвиом случае 7 машинных тактов. меток, пока они не определены. Метки, которые используются в командах переходов и обращений к подпрограммам, ассемблер определяет как адреса ячеек и ищет эти ячейки в программе. В первых четырех строках нашего примера определяются символы, которые будут использованы в программе на языке ассемблера; это делает программу более удобочитаемой и дает возможность легко менять обозначение битов и портов в аппаратуре без существенных изменений в программе. Например, маска состояния печатающего устройства равна 80Н, если мы предполагаем, что СЗР байта состояния консоли равен 1, когда печатающее устройство готово к работе. Оператор ORG указывает ассемблеру, в какой ячейке памяти должна начинаться программа; в данном случае ассемблер присвоит номер 100 Н символической ячейке START, т. е. первому выполняемому оператору программы. Поскольку команда Л MP INIT занимает три байта, следующей метке CHECK будет присвоен адрес 103 Н. Эти четыре ячейки указывают вектор переходов, а именно переходов извне в программу, что будет в дальнейшем объяснено подробно. Далее следует инициирующая программа, которая начинается в ячейке с символическим адресом INIT. Заметим, что снабжать ячейки символическими адресами не обязательно, если не предполагается использовать такие адреса для переходов, например в операторах conflg=00H conchr=01H keyst = 0m prist=80H org 100H jmp init jmp const jmp conin jmp conout I программа ввода/вывода с консоли } состояние порта ввода консолн J порт ввода/вывода консоли S маска состояния клавишного устройства J маска состояния печатающего устройства I начальный адрес ; указатезш перехода-- ; инициирующая программа S устанавливает бит переноса в случае готовности ; засылает в накопитель символ из порта ввода/вывода I символ передается через регистр С J инициирующая программа Программа 11.4 in conflg ani keyst rz stc ret call const jnc conin in conchr ani 7FH ret in conflg ani prist jz conout mov a, g out conchr ret ; ввести состояние консоли ; проверить бит состояния ввода, De 5 нет готовности; возврат без установки бита переноса 5 готовность: возврат с установкой бита переноса ; проверить состояние ; ожидать готовности ; ввести байт с клавишного устройства ; вычеркнуть бит четности, 07 ; возврат с байтом в накопителе ; ввести состояние консоли ; проверить бит состояния печатающего устройства, d7 ! ждать готовности ! загрузить выводимый байт в накопитель J выслать его в печать ЛМР ИЛИ CALL. Мы опустили подробности неинтересвой инициирую-щей программы и написали после нее три последовательности команд, f предназначенные для проверни состояния устройства ввода ввода од- НОГО байта с клавишного устройства и вывода одного бай.та т печать или экран. Здесь, как и выше, символические адреса присваиваются ячейкам только в случае необходимости. Теперь вам следовало бы еще раз просмотреть всю программу и убедиться в полном понимании ее работы. Дело в том, что такие программы должны будут почти всегда находиться в памяти вашей ЭВМ и к ним придется обращаться каждый раз, когда понадобится ввести или вывести данные через терминал. Например, выполняемая программа имеет возможность получить один байт с клавишного устройства при помощи команд, приведенных в програм- CALL CHECK ; проверить наличие символа в кла- вишном устройстве JNC NEXT ; если его вет - продолжать выпол нение CALL CONIN ; если символ есть - ввести его , NEXT: Программа U.5 ме 11.5. Такое применение общих программ для операций с устройствами вроде терминала удобно, поскольку при их использовании в любой другой программе нет нужды заботиться о подробностях процедуры ввода/вывода и флажках состояния. i Ручная трансляция. Давайте теперь попробуем транслировать отрывок программы управления терминалом. Для иллюстрации мы предположим, что инициирующая программа занимает 23 байта. После прибавления к ним 12 байт, содержащих список переходов, будет использовано уже 35 байт, начиная с ячейки, снабженной символическим адресом START, поэтому первый оператор подпрограммы CONST надо поместить в ячейку х номером 123 Н (проверьте наши вычисления). В эту ячейку памяти мы поместим байт DB, который представляет собой КОП команды IN (см. приведенный выше список КОПов). Эта команда требует еще одного байта для указания номера порта, в данном случае это байт 00. Байт Е6 КОПа следующей команды ANI попадает в следующую ячейку памяти, за ним следует второй байт этой команды (значение KEYST)j 01 и т. д. Используя табл. 11.2 и приведенный список КОПов, можно выписать несколько следующих байтов программы: Адрес Данные (шестнаддатеричный) (шестнадцатеричные) 0123 DB 0124 00 0125 Е6 0126 01 0127 С8 0128 37 0129 С9 012А CD и т. д. 1 ... 15 16 17 18 19 20 21 ... 59 |
© 2004-2024 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки. |