ПРОГРАММНОЕОБЕСПЕЧЕНИЕ ВСТРОЕННЫХ СИСТЕМ УПРАВЛЕНИЯ НА БАЗЕ ОДНОКРИСТАЛЬНЫХ МИКРОПРОЦЕССОРОВ(МП)
1. Программная модель МП с регистр-аккумуляторнойархитектурой
Выполнение определенной функции с помощьюмикропроцессорного устройства (МПУ) требует изучения особенностей архитектурнойорганизации применяемого МП. Составной частью архитектуры является система команд,т.е. полный набор инструкций, предписывающих МП выполнять на каждом шагепрограммы элементарные операции. Зная программно-доступные ресурсы МП ипринципы перемещения данных, можно с помощью набора команд запрограммироватьлюбую сложную операцию.
Программная модель МПС, построенной на базеоднокристального 8-разрядного МП состоит из программно доступных регистров,восьмиразрядных ячеек ОЗУ и восьмиразрядных портов ввода/вывода. Разрядырегистров нумеруются справа налево целыми числами начиная с нуля. Программно-доступнымирегистрами такого МП являются регистры специальных функций (РСФ) и регистрыобщего назначения (РОН). К регистрам специальных функций относятся: аккумулятор(А), регистр признаков (F), регистр указателя стека (SP), регистр счетчика команд(PC).
Регистр А предназначен для временного хранения одного изоперандов, участвующих в арифметических или логических операциях, и полученногорезультата после ее выполнения. Кроме того, А используется для программноуправляемого обмена с внешними устройствами через порты ввода/вывода.
Регистр признаков (F) – это восьмиразрядный регистр,содержащий признаки результата выполнения команд (рис.1.1).
/>
Для большинства команд признаки устанавливаются следующимобразом:
признак S – единица, если седьмой разряд результата равенединице, в противном случае – нуль;
признак нуля Z – единица, если во всех разрядахрезультата нули, в противном случае – нуль;
признак дополнительного переноса AC – единица припереносе из третьего разряда или при займе в третий разряд результата, впротивном случае – нуль;
признак четности P – единица, если результат в двоичномкоде содержит четное количество единиц, в противном случае – нуль;
признак переноса CY – единица при переносе из седьмогоразряда или при займе в седьмой разряд результата, в противном случае – нуль.
Регистр указатель стека (SP) – это шестнадцатиразрядныйрегистр, который содержит адрес вершины стека. Стек – это динамическаяпоследовательная структура данных в ОЗУ, организованная таким образом, чтоочередная запись данных всегда осуществляется в вершину (начало) стека.Максимальный размер стека равен адресуемой емкости памяти. В вершину стекамогут записываться только шестнадцатибитные данные.
При записи данных в стек содержимое регистра указателяуменьшается на 2, а при считывании – увеличивается на 2.
Регистр счетчика команд (PC) – это шестнадцатиразрядныйрегистр, указывающий адрес следующей команды, которая должна быть выполненамикропроцессором.
Регистры общего назначения, как правило, обозначаютсябуквами B, C, D, E, H, L, А. Регистры В и С, D и E, H и L в некоторых командахрассматриваются как шестнадцатиразрядные регистры, называемые регистровымипарами. Регистры B, D, и H образуют старшие восемь разрядов регистровых пар, арегистры C, E, и L – младшие.
Программно-доступные восьмиразрядные ячейки ОЗУиспользуются в качестве памяти МПС. Разряды ячейки ОЗУ нумеруются справа налевоцелыми числами, начиная с нуля. Максимальная емкость памяти, реализуемойзапоминающим устройством, равна 65 536 байт.
Программно-доступные восьмиразрядные порты используютсядля ввода и вывода. Максимальное число регистров для ввода данных составляет256, для вывода данных – столько же.
Программная модель 16-разрядного МП отличаетсяувеличением как количества программно-доступных регистров, так и ихразрядностью [16]. По своему назначению они разделяются на три группы.
Регистры общего назначения AX, BX, CX, DX используютсядля хранения промежуточных результатов и могут без ограничения участвовать ввыполнении арифметических и логических операций. При выполнении операций надцепочками байтов и слов этим регистрам предписываются специальные функции.
Указательные и индексные регистры (SP, BP, SI, DI)предназначены для хранения 16-разрядных адресов (внутрисегментных смещений) иобеспечивают при этом косвенную адресацию и динамическое вычислениеэффективного адреса памяти.
Сегментные регистры (CS, DS, SS, ES) хранят начальныеадреса четырех сегментов памяти, используемых в текущей программе: команд,стека, и двух сегментов данных.
Имеется программно доступный регистр признаков (флаговый)(рис.1.2), младший байт которого FL полностью соответствует регистру флаговрассмотренного выше МП и называются арифметическими флагами, а старший байт FHсодержит четыре дополнительных флага (TF, IF, DF, OF), три первых из которыхотносятся к флагам управления МП.
/>
TF – флаг трассировки (прослеживания). При TF=1 МПпереходит в покомандный (пошаговый) режим работы, применяемый при отладкепрограмм, когда автоматически генерируется сигнал внутреннего прерывания послевыполнения каждой команды. При этом выполняется переход на соответствующуюподпрограмму, которая обычно обеспечивает индикацию содержимого внутреннихрегистров МП.
IF – флаг разрешения прерываний, управляемый с помощьюкоманды CLI и STI: при IF=1 МП воспринимает и реагирует на запрос прерывания повходу INTR; при IF=0 прерывания по этому входу запрещаются (маскируются) и МПигнорирует поступающие запросы прерываний.
DF – флаг направления, управляемый командами CLD и STD,определяет порядок обработки цепочек в соответствующих командах (при DF=0 отменьших адресов к большим и наоборот при DF=1).
OF – флаг переполнения, сигнализирующий о потере старшегобита результата сложения или вычитания в связи с переполнением разрядной сеткипри работе со знаковыми числами.
При выполнении команд операнды могут храниться впрограммно-доступных регистрах микропроцессора или в памяти МПС. Для указанияоперанда в регистре используется: регистровая адресация и регистровая неявнаяадресация.
ПРИМЕР:
MOVA,B
ADCB
CMA
Для указания операнда в памяти используются адресации:непосредственная, прямая, косвенно-регистровая и стековая.
ПРИМЕР:
LDA 8324H; прямая
IN FA; прямая
ADC M; косвенно-регистровая
PUSH PSW; стековая
Таким образом, для большинства МП наиболее общимиявляются пять способов адресации операндов. В 16-разрядном МП и вышедопускаются дополнительные способы адресации, такие как базовая, индексная,базовая индексная, относительная, страничная и др. Выбор того или иногоопределяется минимальным объемом памяти для хранения программ и наименьшеевремя их исполнения.
Для каждого МП имеется свой список команд. Пофункциональному назначению, как правило, они делятся на группы: командыпересылки данных, арифметические команды, команды логических операций, командыпередачи управления, команды управления микропроцессором.
Группа команд пересылки данных:
команды пересылки данных общего назначения (MOV, MVI,LDA, STA, LHLD, SHLD, LXI, LDAX, SPHL, STAX, XCHG, XTHL);
команды обращения к стеку (PUSH и POP);
команды ввода (IN) и вывода (OUT).
Группа арифметических команд:
команды сложения (ADD, ADI, ADC, ACI, INR, INX, DAD);
команды вычитания (SUB, SUI, SBB, SBI, DCR, DCX);
команды умножения (MUL);
команды деления (DIV);
команда десятичной коррекции содержимого аккумулятора(DAA).
Группа команд логических операций:
логические команды (ANA, ANI, ORA, ORI, XRA, XRI);
команды сравнения (CMP, CPI);
команды сдвига (RLC, RRC, RAL, RAR);
команды инверсии содержимого аккумулятора (CMA).
Группа команд передачи управления:
команды безусловного перехода (JMP);
команды условного перехода (JNC, JC, JNZ, JZ, JPO, JPE,JP, JM);
команды безусловного вызова подпрограмм (CALL, RST);
команды условного вызова подпрограмм (CNZ, CZ, CNC, CC,CPO, CPE);
команда безусловного возврата из подпрограммы (RET);
команда условного возврата из подпрограмм (RNZ, RZ, RNC,RC, RC, RPO, RPE, RP, RM).
Группа команд управления микропроцессором:
команды управления признаком переноса (CMC, STC, CLC);
команды флагами (EI, DI, CLI, STI);
команда «нет операции» (NOP);
команда останова микропроцессора (HLT).
Число базовых команд МП составляет несколько десятков, ас учетом их модификаций достигает нескольких сотен.
Время выполнения команды, оцениваемое числом тактов МП.Зная частоту генератора тактовых импульсов (FГТИ), можно определитьдлительность одного такта; T (мкс) =1/FГТИ (МГц), а значит и время выполнениякоманды, что имеет существенное значение при программной генерации временныхинтервалов.
Для подавляющего числа команд время выполнения команды(число тактов) есть величина постоянная, однако существуют команды, для которыхэто время может меняться. Такими командами являются команды условного вызова ивозврата из подпрограмм. Время выполнения команды зависит от того, выполняетсяусловие или нет. Как правило, если условие выполняется, время выполнениякоманды существенно увеличивается.
2. Язык проектирования МПС, встроенной в ЭА
Для системы, содержащей МП, требуется проектирование какаппаратных, так и программных средств. Проектирование аппаратной части можетбыть выполнено с использованием стандартной методологии проектированияаппаратуры.
Проектирование программного обеспечения лучше всего можетбыть выполнено с использованием языка проектирования, подобного естественномуязыку. Программное обеспечение строится путем преобразования конструкций языкапроектирования в язык программирования микрокомпьютера (МКП). Оно тестируется иодновременно с аппаратурой объединяется в единое целое.
Схемы языка проектирования можно рассмотреть с помощьюпростого примера. Пусть имеем систему из микрокомпьютера с двумя выходами(рис.1.3), которая должна реализовывать функцию преобразования, представленнуюна рис.1.1.
/>
Рисунок 1.3 – Структурная схема микрокомпьютерной системы
Из наличия у системы входов и выходов можно сделатьзаключение о том, что микрокомпьютер должен иметь возможность проверятьзначение каждого входа, а также устанавливать каждый из выходов в определенныезначения.
На языке проектирования в операциях проверки и установкииспользуются простые конструкции.
Проверить Вх.1 и запомнить его значение.
Установить значение Вых.1, равное 6.
/>
Рисунок 1.4 – Функция преобразования
Необходимо также иметь возможность проверять условия,которым удовлетворяют хранимые значения каждого из входов для установкивыходных значений. С этой целью используется условная конструкция, которая вобщем виде может быть представлена как: ЕСЛИ (условия проверки – истина). ТО(выполнить что-либо). ИНАЧЕ (выполнить что-либо другое). Таким образом, дляданного примера описание на языке проектирования вначале будет иметь вид:
1. Проверить Вх1 и хранить его значения.
2. Проверить Вх2 и хранить его значения.
3. Если 4 ≤ Вх1 ≤ 8, установить Вых1 = 6.
1. Иначе Вых1 установить = 0.
5. Если 2 ≤ Вх2 ≤ 6, установить Вых2 = 1.
6. Иначе Вых2 установить = 0.
Когда система функционирует, микрокомпьютер выполняетзапрограммированные операции шаг за шагом. После того, как входы проверены, нетуверенности, что затем при повторной проверке один из них не окажетсяизмененным. Поэтому необходима такая операция, которая позволяла бы выполнятьдругие операции языка проектирования бесконечное число раз.
Для этой цели используется конструкция:
«ВЫПОЛНЯТЬ НЕПРЕРЫВНО»… «КОНЕЦ»
В этой конструкции набор операций, расположенный междуВЫПОЛНЯТЬ НЕПРЕРЫВНО и КОНЕЦ, должен повториться без конца.
В этом случае, однажды начавшись, операция проверкизначений входов будет повторяться столько времени, сколько система остается вдействии.
Из вышеприведенного примера можно сделать следующиевыводы:
микрокомпьютер является последовательным устройством и вкаждый момент времени выполняет только одну операцию;
во многих случаях, чтобы изменить функциональноеповедение микрокомпьютерной системы, необходимо изменить лишь некоторыеоперации в описании программы на языке проектирования;
МКП манипулирует только цифровыми данными. Если в системеимеются аналоговые сигналы, для преобразования входных сигналов в цифровуюформу необходим АЦП, а для преобразования выходных сигналов в аналоговую форму– ЦАП.
3 Составление схем алгоритмов
Реализация любой функции с помощью микрокомпьютера всегдатребует проектирования необходимой последовательности действий, получившейназвание алгоритма. Наиболее удобная и наглядная форма представления алгоритмарешения задачи – графическая, в виде схемы. Она состоит из упорядоченнойсовокупности условных геометрических фигур, несущих информацию об определенномхарактере операций, накладываемом условии, принятых обозначениях. Основныеформы, которые согласно действующим стандартам представлены в приложении А.
Рассмотрим в качестве примера задачу формирования двухнаборов целых чисел, лежащих в диапазоне от -5 до +5. Путем сортировкиорганизуется два набора, один из которых включает в себя положительные числа, адругой – отрицательные.
Схема алгоритма решения этой задачи показана на рис. 1.5.
/>
Рисунок 1.5 – Схема алгоритма с ветвлением
4 Подпрограммы
Подпрограмма – это часть программы, используемая обычнонесколько раз в процессе выполнения программы. Однако текст подпрограммызаписывается программистом только один раз. Когда же программисту необходимовоспользоваться подпрограммой, достаточно указать в программе соответствующуюкоманду вызова (обращения к подпрограмме), адресующуюся к области памяти, вкоторой расположена подпрограмма. С этой целью в языке программирования длябольшинства МП существует команда CALL (вызвать). В этой команде после кодаоперации (CALL) указывается имя подпрограммы, которое присвоено физическомуадресу в области памяти, где расположена данная подпрограмма.
Кроме того, по команде выполняются действия, необходимыедля возвращения к основной программе после выполнения подпрограммы:
а) в счетчике команд фиксируется адрес команды в основнойпрограмме, которая следует за командой вызова;
б) содержимое счетчика команд (адрес возврата)загружается в стек, содержимое указателя стека модифицируется;
в) в счетчик команд загружается адрес, задаваемыйкомандой вызова. После этого может начаться исполнение подпрограммы.
Последней выполняемой командой подпрограммы являетсякоманда RET (return – возврат). По этой команде выполняется возврат к основнойпрограмме, прерванной командой вызова. Команда возврата содержит только кодоперации. По этой команде происходит следующее: а) счетчик команд получает изстека адрес команды в основной программе, следующей за командой вызова; б)содержимое указателя стека соответственно модифицируется.
Основное достоинство подпрограмм заключается в том, чтоблагодаря возможности их многократного использования, сокращается текстпрограммы в целом. Вместо того, чтобы по мере необходимости повторять записьодного и того же фрагмента программы, достаточно оформить запись фрагмента какподпрограмму и обращаться к ней столько раз, сколько требуется в соответствии салгоритмом решения задачи.
Из одной программы можно производить обращение кнескольким подпрограммам.
Одна подпрограмма может обращаться к другой. Такоепостроение подпрограмм называется ВЛОЖЕНИЕМ.
Глубина допустимого уровня вложения подпрограмм зависитот типа вычислительной машины и используемого языка программирования.Большинство современных МП и языков программирования допускает многоуровневоевложение. Как следует из вышеизложенного, использование подпрограмм – неслишком обременительная работа для программиста.
5 Программирование в машинных кодах
Реализация требуемого алгоритма вычисления достигаетсяпутем подготовки, отладки и записи в ПЗУ соответствующей программы. МП способенвоспринимать лишь программы, состоящие из последовательности команд,представленных двоичными кодами. Программирование непосредственно в машинныхкодах требует постоянного оперирования многоразрядными двоичными числами,представляющими как коды команд, так и коды операндов.
В качестве примера линейной программы в машинных двоичныхкодах рассмотрим программу сложения двух чисел, одно из которых 01100100находится в регистре общего назначения (РОН) В, а второе – 00010111 расположенов ячейке памяти с адресом 0000 0000 1000 1111. Напомним, что рассматриваемый МПимеет шестнадцатиразрядную шину адреса. Фрагмент программы приведен в табл.1.1.
Таблица 1.1 – Программа сложения в машинных кодахАдрес памяти Мнемокод 0000 0000 0000 0100 01111000 0000 0000 0000 0101 00100001 0000 0000 0000 0110 10001111 0000 0000 0000 0111 00000000 0000 0000 0000 1000 10000110 0000 0000 0000 1001 01110110 … . … . 0000 0000 0000 0100 00010111
Таблица 1.2 – Программа сложения в шестнадцатеричных кодахМнемокод Адрес Н — код Vt MOV A,B 0004 78 5 LXI H 0005 21 16 0006 8F 0007 00 ADD M 0008 86 7 HLT 0009 76 7 … . … . … . … . 008F 17
Первая команда – пересылка содержимого регистра В ваккумулятор – является однобайтовой, имеет код операции. Код операциирасположен в ПЗУ по адресу 0000 0000 0000 0100, который для данной программыявляется начальным.
Следующая команда – трехбайтовая, имеет код операции00100001, представляющий первый байт команды. Второй и третий байты,расположенные в очередных ячейках ПЗУ, содержат соответственно младшую истаршую части адреса 1000 1111 0000 0000, передаваемые по этой команде врегистровую пару H и L.
Микропроцессор при выполнении программы последовательнообращается к ячейкам памяти и выполняет поочередно все команды. Напомним, чтокоды операций и операнды хранятся в памяти в одинаковом виде и их различениеосуществляется микропрограммами выполнения команд, заложенными в МП. Последняякоманда имеет код 01110110 и является командой останова (HLT).
В результате выполнения программы в аккумуляторе окажетсязаписанным число 01111011.
Даже рассмотрение такой простейшей программы показывает,насколько неудобным и недостаточно наглядным является представление чисел вмашинных двоичных кодах. Поэтому принято запись машинных кодов производить вшестнадцатеричной системе.
В табл. 1.2 приведен фрагмент той же самой программы,записанной в шестнадцатеричных кодах. Рядом с кодом операции показаны егомнемоническое изображение и наименования операндов, принятые в системе командданного МП. Например, шестнадцатеричный код команды 78, имеющей мнемоническоеобозначение MOV A,B, соответствует операции пересылки содержимого регистра В ваккумулятор А. В табл. 1.2 также указано число тактов Vt, необходимое длявыполнения каждой команды. Для выполнения всей программы требуется 35 машинныхтактов.
Практически удобнее программировать непосредственно вмнемокодах, а затем представлять шестнадцатеричные коды адресов и операндов,получающиеся после распределения памяти.
6 Программирование в мнемокодах
Наиболее удобным методом написания программ являетсяиспользование мнемонических кодов, состоящих из аббревиатуры полного названияинструкции. В этом случае мнемокод отражает содержательный смысл выполняемойоперации.
Пример 1.1. Организация счетчиков циклов. Схема алгоритмасчета показана на рис. 1.6, а фрагмент программы приведен в табл. 1.3.
/>
Рисунок 1.6 – Схема алгоритма счета циклов
Счетчиком служит один из РОН – регистр В. По команде MVIB, N в него заносится число N, определяющее количество повторяемых циклов. Вданной программе N=16. Для определенности принято, что участок программы,который необходимо повторить 16 раз, начинается командой логической операции«ИСКЛЮЧАЮЩЕЕ ИЛИ» XRA A, расположенной по адресу 1002, и заканчивается командойпересылки из аккумулятора в регистр D: MOV D, A, расположенный по адресу 10А1.После каждого выполнения этого участка программы содержимое счетчика (регистраВ) уменьшается на единицу посредством команды DCR B (адрес 10А2). До тех пор,пока содержимое регистра В отлично от нуля, признак Z имеет нулевое значение ипрограмма переходит к выполнению команды, адрес 1002 который содержится во второми третьем байтах команды JNZ (переход по отсутствию нуля). Указанный адресотмечен в программе меткой М1, т.е. метка М1 является мнемоническимобозначением адреса 1002.
Таблица 1.3 – Программа счета цикловМетка Мнемокод Операнд Адрес Н — код Комментарий Vt … . … . … . … . … . . . MVI B, 16 1000 06 Установка счётчика 7 1001 10 N=16 в (B) M1: XRA A 1002 AF Обнуление признака переноса 4 … . … . … . … . … . . . MOV D, A 10A1 57 Пересылка содержимого А в регистр D (D:=A) 5 DCR B 10A2 05 Уменьшение содержимого счётчика на 1 5 JNZ M1 10A3 C2 Переход по условию (N) ¹ 0 к ячейке памяти с адресом 1002 10 10A4 02 10A5 10 … . … . … . … . … . . .
Если в результате очередного вычитания единицы содержимоерегистра В окажется равным нулю (Z=1), то программа перейдет к выполнениюкоманды, расположенной за JNZ. Происходит выход из циклического участкапрограммы. Поскольку регистр В имеет восемь двоичных разрядов, рассмотреннаяструктура программы позволяет организовать счетчик от 1 до 255 циклов. Принеобходимости получения большого числа циклов для организации счетчика следуетиспользовать регистровые пары (например, В и С). Загрузка такой парыосуществляется с помощью команды LXI B, а вместо команды DCR В необходимоиспользовать команду DCX B (декремент регистровой пары).
Пример 1.2. Определение модуля числа. При исследованиисигналов часто приходится оценивать погрешность измерения по модулю. Рассмотримпрограмму определения модуля числа, содержащую условный переход. В связи с тем,что отрицательные числа представляются в дополнительных кодах, при определениимодуля нельзя ограничиться только отбрасыванием знака числа, информация окотором заключена в старшем бите. Если число положительное, то его надоумножить на -1. Знак можно определить, используя операцию маскирования илизасылку старшего бита в триггер переноса с последующим его анализом. В данномслучае эти операции нежелательны, так как сопровождаются изменением содержимогоаккумулятора. Целесообразно применить команду логического сложения содержимогоаккумулятора с самим собой. При этом содержимое аккумулятора не меняется, афлаги устанавливаются в соответствующие состояния. Условный переход выполняетсяпо содержимому триггера знака S.
На рис. 1.7 изображена схема алгоритма определения модулячисла, находящегося в регистре Е. Программа работает следующим образом. Числоиз регистра Е пересылается в аккумулятор. В результате выполнения операциилогического сложения аккумулятора с самим собой в триггер знака записываетсястарший бит числа. С помощью команды условного перехода осуществляется ветвлениепрограммы. Если S=0 (положительное число) не выполняется, то производитсяизменение знака числа и модуль числа из аккумулятора пересылается в регистр Е.Знак числа изменяется применением операции дополнения, заключающейся винвертировании всех разрядов числа (команда CMA) c последующим прибавлениемединицы к младшему разряду (команда INR A). Если условие S=0 выполняется (числоположительное), то по условному переходу JM M2 три последние команды обходятся,содержимое регистра Е не меняется, а выполнение программы продолжается с адреса01F8, соответствующего метке М2. Программа в машинных кодах с комментариямиприведена в табл. 1.1.
/>
Рисунок 1.7 – Схема алгоритма определения модуля числа
Пример 1.3. Определение максимального из двухположительных чисел. При обработке сигналов часто встречается необходимостьопределения максимального из нескольких положительных чисел. Такие задачивозникают, например, при обнаружении полезных сигналов или при нахождениимаксимального значения сигнала при заданном интервале времени. Нахождениемаксимального из нескольких чисел сводится к последовательному определениюмаксимального из двух чисел.
В системе команд МП имеется команда сравнения СМР,которая не изменяет содержимого аккумулятора, однако устанавливает триггерпризнака CY (перенос) в единичное состояние, если содержимое аккумулятораменьше содержимого регистра.
/>
Рисунок 1.8 – Схема алгоритма нахождения большего из двухположительных чисел
Таблица 1.4 – Программа определения модуля числаМетка Мнемокод Операнд Адрес Н-код Комментарий Vт MOV A, E 01F0 7B Пересылка в аккумулятор 5 ORA A 01F1 B7 Определение знака числа 4 JP M2 01F2 F2 Условный переход по положительному значению 10 01F3 F8 01F4 10 CMA A 01F5 2F Изменение знака числа 4 INR A 01F6 3C 5 MOV E, A 01F7 5F Пересылка в регистр Е 5 M2: 10F8
Для определенности будем считать, что одно из чиселнаходится в аккумуляторе, а другое – в регистре В. Требуется большее числопоместить в регистр В, а меньшее – в аккумулятор. Схема алгоритма показана нарис. 1.8, а программа в машинных кодах приведена в табл. 1.5.
/>
Рисунок 1.9 – Схема алгоритма формирования временной задержки
Таблица 1.5 – Программанахождения большего из двух положительных чиселМетка Мнемокод Операнд Адрес Н-код Комментарий Vt CMP B 00A1 B8 Сравнение чисел 7 JC M1 00А2 DA Переход на М1, если (А) Пример 1.1. Организация временной задержки длительностью100мкс.
Программу, обеспечивающую такую задержку, оформим в видеподпрограммы, которую назовем DEL. Это символическое имя будем использовать ввиде метки, указывающей начальный адрес подпрограммы. Схема алгоритмаформирования временной задержки изображена на рис. 1.9, а программа помещена втабл. 1.6. Начальный адрес подпрограммы записан во втором и третьем байтахкоманды, с помощью которой происходит обращение к подпрограмме DEL. Привыполнении подпрограммы в регистр В должно быть записано число циклов Х,которое вначале неизвестно. Содержимое регистра В уменьшается на единицу до техпор, пока не станет равным нулю. При этом признак Z устанавливается в единичноесостояние (Z=1) и происходит выход из цикла.
Подпрограмма неработоспособна до тех пор, пока не будетзадано значение X.
Зная, какие команды используются в данной подпрограмме ивремя их выполнения, можно вычислить, сколько раз должен повторитьсяциклический участок подпрограммы для обеспечения требуемой временной задержки.
Команды MVI B, X, CALL DEL и RET используется один раз.Если частота задающего генератора МП составляет 2МГц, каждый такт длится0.5мкс. В этом случае время выполнения перечисленных команд составит 17мкс.
Для получения задержки времени, равной 100мкс,циклический участок программы должен выполняться столько раз, чтобы этотпроцесс завершился за 100-17=83мкс. Время выполнения команд DCR B и JNZ M1составляет 2. 5+5=7. 5 мкс. Задержку 83мкс нельзя получить многократнымповторением команд цикла, поскольку 83 не делится на 7.5 без остатка.
Если повторить циклический участок программы X = 10 раз,то получим временную задержку 75 мкс. Оставшиеся 835=8 мкс можноскомпенсировать введением подряд четырех команд NOP (К=4). Значение X=0A,соответствующее требуемому числу циклов, заносится во второй байт команды MVIB, X.
Таблица 1.6 – Программа формирования временной задержкидлительностью 100мксМетка Мнемокод, операнд Адрес Н-код Комментарий Vт CALL DEL 01C0 CD Вызов подпрограммы формирования временной задержки 17 01С1 09 01С2 0A … . … . … . … . … . … . DEL: MVI B, X 0A09 06 Запись в регистр В числа X=0A 7 0A0A 0A M1: DCR B 0A0B 05 Уменьшение содержимого регистра В на 1 5 JNZ M1 0A0C С2 Повторить цикл, если результат не равен нулю 105 0A0D 0B 0A0E 0A NOP 0A0F 00 Пустые операции 4 NOP 0A10 00 4 NOP 0A11 00 4 NOP 0A12 00 4 RET 0A13 C9 Возврат к основной программе 10
7 Программирование на языке ассемблера
При написании программ на языке ассемблера такжеиспользуется мнемоническое представление команд, отражающее содержательныйсмысл выполняемой операции. Однако в этом случае необходимо помнить, чтоисходный текст программы на языке ассемблера должен иметь определенный формат.
Командная строка при этом разделяется на четыре поля:поле «МЕТКА» поле «КОД ОПЕРАЦИИ» поле «ОПЕРАНДЫ» Поле «КОММЕНТАРИИ»
Поля могут отделяться друг от друга произвольным числомпробелов, но не менее одного.
Метка. В поле метки размещается символическое имя ячейкипамяти, в которой хранится отмеченная команда или операнд. Метка представляетсобой буквенно-цифровую комбинацию, начинающуюся с буквы. Используются толькобуквы латинского алфавита. Некоторые ассемблеры допускают использование в меткахсимвола подчеркивания (_). Длина метки не должна превышать шесть символов.Метка завершается двоеточием (:).
Псевдокоманды ассемблера не преобразуются в двоичныекоды, а потому не могут иметь меток. Исключение составляют псевдокомандырезервирования памяти и определения данных (DS, DB, DW). У псевдокоманд,осуществляющих определение символических имен, в поле метки записываетсяопределяемое символическое имя, после которого двоеточие не ставится.
В качестве символических имен и меток не могут быть использованымнемокоды команд, псевдокоманд и операторов ассемблера, а также мнемоническиеобозначения регистров и других внутренних блоков МП или МК.
Код операция. В этом поле записывается мнемоническоеобозначение команды МП или МК или псевдокоманды ассемблера, которое являетсясокращением (аббревиатурой) полного английского наименования выполняемогодействия. Например: МОV – movе – переместить, JМР – jump – перейти, DВ – definebуtе – определить байт.
Для всех МП и МК используется строго определенный и ограниченныйнабор мнемонических кодов. Любой другой набор символов, размещенный в полеоперации, воспринимается ассемблером как ошибочный.
Операнды. В этом поле определяются операнды (илиоперанд), участвующие в операции. Команды ассемблера могут быть без-, одно- илидвухоперандными. Операнды разделяются запятой (,).
Операнд может быть задан непосредственно или в виде егоадреса (прямого или косвенного). Непосредственный операнд представляетсячислом. В некоторых МП он задается в команде.
ПРИМЕР:
MVIA,15H
LXIH,23BEH
ACI25
В МК семейства MCS 51 записывается с обязательнымуказанием префикса непосредственного операнда (#) (MOV A,#25 или ссимволическим именем: ADDC A,#OPER2). Адрес операнда может быть заданмнемоническим обозначением регистра (INC Rn; MOV A,D), символическим именем(MOV A,MEMORY). Указателем на косвенную адресацию может служить для одних МПбуква М (MOV M,A; ADD M), для других префикс @ (MOV @Ri,2FH). Операндом можетявляться прямой адрес ячейки памяти (JMP 8324H; CALL 115BH; JNC 1F5AH), порта ввода/вывода(IN F9H, OUT BAH) или их символические имена (JMP LABEL; MOV A,P3).
Используемые в качестве операндов символические имена иметки должны быть определены, а числа представлены с указанием системысчисления, для чего используется суффикс (буква, стоящая после числа): В – длядвоичной, Q – для восьмеричной, D – для десятичной и Н – для шестнадцатеричной.Число без суффикса по умолчанию считается десятичным.
Обработка выражений в процессе трансляции. Некоторыеассемблеры допускают использование выражений в поле операндов, значения которыхвычисляются в процессе трансляции.
Выражение представляет собой совокупность символическихимен и чисел, связанных операторами ассемблера. Операторы ассемблераобеспечивают выполнение арифметических ("+" – сложение, "-"– вычитание,* – умножение, / – целое деление) и логических (ОR – ИЛИ, АND – И,ХОR – исключающее ИЛИ) операций в формате 2-байтных слов.
Комментарий. Поле комментария может быть использованопрограммистом для текстового или символьного пояснения логической организацииприкладной программы. Поле комментария полностью игнорируется ассемблером, апотому в нем допустимо использовать любые символы. По правилам языка ассемблераполе комментария начинается после точки с запятой (;).
Псевдокоманды ассемблера. Ассемблирующая программатранслирует исходную программу в объектные коды. Хотя транслирующая программаберет на себя многие из рутинных задач программиста, таких как присвоениедействительных адресов, преобразование чисел, присвоение действительных значенийсимвольным переменным и т.п., программист все же должен указать ей некоторыепараметры: начальный адрес прикладной программы, конец ассемблируемойпрограммы, форматы данных и т.п. Всю эту информацию программист вставляет висходный текст своей прикладной программы в виде псевдокоманд (директив)ассемблера, которые только управляют процессом трансляции и не преобразуются вкоды объектной программы.
Псевдокоманда ORG 10Н задает ассемблеру адрес ячейкипамяти (10Н), в которой должна быть расположена следующая за ней командаприкладной программы.
Псевдокомандой EQU можно любому символическому имени,используемому в программе, поставить в соответствие определенный операнд.Например, запись
PETEQU13
приводит к тому, что в процессе ассемблирования всюду,где встретится символическое имя PET, оно будет заменено числом 13.
Символические имена операндов, переопределяемых впроцессе исполнения программы, определяются псевдокомандой SET:
ALFASET3
… .
… .
ALFASETALFA+1
Ассемблер MCS-51 позволяет определить символическое имякак адрес внутренних (псевдокоманда DATA), внешних (XDATA) данных или адресбита (псевдокоманда BIT). Например, директива
ERROR_FLAGBIT25H.3
определяет символическое имя ERROR_FLAG как третий битячейки ОЗУ с адресом 25Н.
Псевдокоманда DB обеспечивает занесение в ПП константы,представляющей собой байт.
Псевдокомандой END программист дает ассемблеру указаниеоб окончании трансляции.
В результате трансляции должна быть получена карта памятипрограмм, где каждой ячейке памяти поставлен в соответствие хранящийся в нейкод.
В соответствии с форматом команд для представления ихобъектных кодов отводятся одна, две или три ячейки памяти программ.
Пример программы на языке ассемблера:
ORG801FH; Присвоение начального адреса для
; подпрограммы DELET (задержка)
COUNTEQUXXXXH; Присвоение символического имени
; значению XXXXH (количество циклов
; в подпрограмме для формирования
; задержки)
PUSHPSW;11 тактов. Сохранение в стеке
; программно доступные регистры
; (A, F, H, L)
PUSHH;11 тактов
LXIH,COUNT;10 т. Установка счетчика циклов в
; регистровой паре (H)(L)
CICL:DCXH;5т.Уменьшение счетчика циклов на 1
MOVA,L;4т. и проверка
ORAH;4т. на “нуль”
JNZCIC1;10т. If XXXX¹0 GOTO CICL
POPH;10т. Восстановление программно-
POPPSW;10т. доступных регистров перед
; выходом из подпрограммы
RET;10т. Выход
8 Ввод, редактирование, трансляция и отладка прикладныхпрограмм
Написанием текста программы заканчивается первый этапразработки прикладного программного обеспечения – «от постановки задачи кисходной программе» и начинается следующий – «от исходной программы кобъектному модулю».
Для простых программ объектный код может быть полученвручную (ручная трансляция). Однако для более сложных программ требуютсяспециальные средства автоматизации подготовки программ. Обычно такие средстваиспользуют большие емкости памяти и широкий набор периферийных устройств, всилу чего они не могут быть резидентными, а используются только на микроЭВМ.
В минимальный состав программного обеспечениякросс-средств входят:
системная программа для ввода исходного текста прикладнойпрограммы, его редактирования и записи на внешней носитель информации – такназываемый редактор текстов;
программа-транслятор, обеспечивающая преобразованиеисходного текста прикладной программы в объектный модуль (ASM).
Более мощные кросс-средства предполагают наличиередактора внешних связей (LINK), позволяющего включать в программу модули,разработанные независимо друг от друга, и программу, обеспечивающую настройкуперемещаемых программных модулей на абсолютные адреса (LOCATE).
Для ввода исходного текста прикладной программынеобходимо вызвать редактор текстов, указав ему тип носителя, на котором будетсоздан исходный файл.
Для трансляции исходного текста программы необходимовызвать транслятор, указав ему файл с исходным текстом, место размещенияобъектного кода, а также условия формирования и вывода листинга. Послеокончания трансляции при отсутствии синтаксических ошибок выдается сообщение
ASSEMBLY COMPLETE NO ERRORS
_
или сообщение
ASSEMBLY COMPLETE NNN ERRORS
_
с указанием числа ошибок (NNN) и номера последнейошибочной строки (LLL) при наличии синтаксических ошибок.
Все обнаруженные ошибки исправляются в исходном текстеприкладной программы (это относится и к ошибкам, обнаруженным на этапе отладки).Для этого необходимо вновь вызвать редактор текста и осуществить редактированиеисходного текста программы, а затем выполнить повторную трансляцию.
Если исходный текст прикладной программы не имел внешнихссылок и содержал директиву ORG, то после успешного завершения трансляции этапразработки программного обеспечения «от исходной программы к объектномумодулю» можно считать законченным.
Литература
1. Тавернье К. PIC-микроконтроллеры. Практика применения: Пер. с фр. -М:ДМКПресс, 2008. — 272 с.: ил. (Серия «Справочник»).
2. Борзенко А.Е. IBM PC: устройство, ремонт, модернизация. – 2-е изд.перераб. и доп. – М.: ТОО фирма «Компьютер Пресс», 2006. – 344с.: ил.
3. Цифровые интегральные микросхемы: Справ./М. И. Богданович, И.Н. Грель,В.А. Прохоренко, В.В. Шалимо.–Мн.: Беларусь, 2001. – 493 с.: ил.
4. ДСТУ 3008-95. Документация. Отчеты в сфере науки и техники. Структура иправила оформления.
5. Охрана труда в вычислительных центрах. Ю.Г. Собаров и др. – М.:Машиностроение, 2000. – 192с.