ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ВСТРОЕННЫХ СИСТЕМ УПРАВЛЕНИЯ НА БАЗЕ ОДНОКРИСТАЛЬНЫХ МИКРОПРОЦЕССОРОВ (МП)
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 – Схема алгоритма счета циклов
Счетчиком служит один из РОН – регистр В. По команде MVI B, 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, если (А) <(В) | 10 | |
00А3 | А8 | |||||
00А4 | 00 | |||||
MOV | C, A | 00A5 | 4F | Обмен содержимого между аккумулятором и регистром B через регистр С | 5 | |
MOV | A, B | 00A6 | 7B | 5 | ||
MOV | B, C | 00A7 | 41 | 5 | ||
M1: | 00A8 |
Пример 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, соответствующее требуемому числу циклов, заносится во второй байт команды MVI B, 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В – define bу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<LLL>
_
с указанием числа ошибок (NNN) и номера последней ошибочной строки (LLL) при наличии синтаксических ошибок.
Все обнаруженные ошибки исправляются в исходном тексте прикладной программы (это относится и к ошибкам, обнаруженным на этапе отладки). Для этого необходимо вновь вызвать редактор текста и осуществить редактирование исходного текста программы, а затем выполнить повторную трансляцию.
Если исходный текст прикладной программы не имел внешних ссылок и содержал директиву ORG, то после успешного завершения трансляции этап разработки программного обеспечения "от исходной программы к объектному модулю" можно считать законченным.
Литература
1. Тавернье К. PIC-микроконтроллеры. Практика применения: Пер. с фр. -М: ДМКПресс, 2008. - 272 с.: ил. (Серия «Справочник»).
2. Борзенко А.Е. IBM PC: устройство, ремонт, модернизация. – 2-е изд. перераб. и доп. – М.: ТОО фирма «Компьютер Пресс», 2006. – 344с.: ил.
3. Цифровые интегральные микросхемы: Справ./М. И. Богданович, И.Н. Грель, В.А. Прохоренко, В.В. Шалимо.–Мн.: Беларусь, 2001. – 493 с.: ил.
4. ДСТУ 3008-95. Документация. Отчеты в сфере науки и техники. Структура и правила оформления.
5. Охрана труда в вычислительных центрах. Ю.Г. Собаров и др. – М.: Машиностроение, 2000. – 192с.