
- •Приемы программирования микропроцессора на языке ассемблер
- •Введение
- •1. Краткие сведения из теории
- •2. Программирование последовательных
- •2.1. Программирование участков алгоритма, не содержащих
- •2.2. Задание для самостоятельной работы
- •3.Программирование разветвлений
- •3.1. Краткие сведения из теории
- •3.2. Разветвляющиеся программы
- •3.3. Задание для самостоятельной работы
- •4. Программирование циклических вычислительных процессов
- •4.1. Программирование участков алгоритма, содержащих циклы
- •4.2. Задание для самостоятельной работы
- •5. Реализация заданных временных интервалов программным способом
- •5.1. Краткие сведения из теории
- •5.2. Программы временных задержек
- •5.3. Задания для самостоятельной работы
- •Рекомендуемая литература
- •Оглавление
3.Программирование разветвлений
3.1. Краткие сведения из теории
Разветвления в программе могут осуществляться по состоянию триггеров (флажков) регистра признаков F. Регистр состоит из 5 триггеров:
Тс – триггер переноса, устанавливается в состояние "1", когда в результате выполнения операции произошел перенос из старшего разряда D7. В противном случае триггер устанавливается в состояние "0";
Тас – триггер дополнительного переноса, устанавливается в состояние "1", когда произошел перенос из четвертого разряда D3;
Тz – триггер нуля, устанавливается в состояние "1", если результат операции равен нулю;
Тs – триггер знака, устанавливается в состояние "1", если в результате операции в старшем разряде D7 будет "1";
Тр – триггер паритета, устанавливается в состояние "1", если в результате операции количество единиц четное.
Отметим основные особенности формирования триггеров признаков:
команды пересылки и переходов не изменяют состояния триггеров признаков;
команды увеличения или уменьшения содержимого одиночного регистра используют все признаки, за исключением признака переноса Тс;
команды увеличения или уменьшения содержимого пар регистров не изменяют состояния триггеров признаков;
команды арифметических операций используют все признаки;
при выполнении логических операций триггеры переноса Тс и Тас сбрасываются в состояние "0";
команды сложения содержимого пар регистров используют только признак переноса Тс.
Для организации разветвлений существует 8 команд условного перехода:
JZ ADR – после выполнения этой команды управление будет передано команде, находящейся по адресу АDR, если Тz = 1, в противном случае будет выполнена команда, следующая за JZ ADR:
JNZ ADR - то же, если Тz = 0;
JC ADR – то же, если Тс = 1;
JNC ADR – то же, если Тс = 0;
JM ADR – то же, если Тs = 1;
JP ADR – то же, если Тs = 0;
JPE ADR – то же, если Тp = 1;
JPO ADR – то же, если Тp = 0.
3.2. Разветвляющиеся программы
Пример 3.1. Число хранится в ОЗУ по адресу 0900Н. Определить число единиц в младшем полубайте этого числа. Результат поместить в ОЗУ по адресу 0901Н.
На рис. 3.1 приведена блок-схема алгоритма решения данной задачи. Рассмотрим операции, выполняемые в каждом из блоков.
Блок 1 обнуляет регистр В (для счета количества единиц будем использовать регистр В); эта операция выполняется командой загрузки MVI B, 00Н.
Блок 2 производит запись в регистровую пару HL адреса (0900Н) числа, хранящегося в ОЗУ; выполняющая эту операцию команда имеет мнемонику LXI H, 0900Н.
Блок 3 производит прием в аккумулятор содержимого ячейки ОЗУ (М), адресом, которой служит содержимое пары регистров HL; выполняющая эту операцию команда имеет мнемонику МОV А, М.
0 B |
|
|
||
|
|
|
||
0900H HL |
(B) +1 B |
|||
|
|
|
||
(M) A |
|
|||
|
|
|
||
ЦСП(A) A |
(B) +1 B |
|||
|
|
|
||
(TC) |
|
|||
|
|
|
||
ЦСП(A) A |
(B) +1 B |
|||
|
|
|
||
(TC) |
|
|||
|
|
|
||
ЦСП(A) A |
ЦСП(A) A |
|||
|
|
|
|
|
(TC) |
(TC) |
|||
|
|
|
|
|
|
(HL) +1 HL |
|||
|
|
|
||
|
(B) M |
|||
|
|
Рис. 3.1. Блок-схема алгоритма нахождения количества единиц в младшем полубайте числа
Блок 4 осуществляет циклический сдвиг вправо содержимого аккумулятора. При этом младший разряд D0 числа записывается в триггер переноса Тс, а на его место сдвигается разряд D1; мнемоника команды RRC.
Блок 5 реализует разветвление по содержимому триггера Тс: в зависимости от значения содержимого этого триггера выполняется либо блок 6, либо блок 7; мнемоника команды JNC MET1.
Блок 6 осуществляет увеличение содержимого регистра В, в котором подсчитывается количество единиц младшего полубайта числа; мнемоника команды INR B.
Блок 7 идентичен блоку 4. Теперь в триггер переноса Тс запишется разряд D1, а на его место в аккумуляторе сдвигается разряд D2; мнемоника команды RRC.
Блок 8 реализует разветвление по содержимому триггера Тс: в зависимости от значения содержимого этого триггера выполняется либо блок 9, либо блок 10; мнемоника команды JNC МЕТ2.
Далее блоки с 9 по 15 выполняют те же самые операции, что и предыдущие, только анализируются соответственно разряды D2 и D3 заданного числа.
Блок 16 формирует в паре регистров HL адрес ОЗУ (0901Н), куда необходимо переслать результат; мнемоника команды INX H.
Блок 17 пересылает в память (по адресу 0901Н) полученный результат в регистре В, соответствующий количеству единиц в младшем полубайте заданного числа; мнемоника команды MOV M, В.
В табл. 3.1 приведена программа рассматриваемой задачи на языке Ассемблер и в машинных кодах. Размещение команд производилось с ячейки ОЗУ, имеющей адрес 0800Н.
Таблица 3.1
Программа нахождения количества единиц в младшем полубайте числа
Адрес Н-код |
Метка |
Мнемоника |
Операнд |
Машинный код |
Комментарий |
0800 |
|
MVI |
В, 00Н |
06 00 |
Блок 1 |
0802 |
|
LXI |
Н, 0900Н |
21 00 09 |
Блок 2 |
0805 |
|
MOV |
А, М |
7Е |
Блок 3 |
0806 |
|
RRC |
|
0F |
Блок 4 |
0807 |
|
JNC |
МЕТ 1 |
D2 0В 08 |
Блок 5 |
080А |
|
INR |
B |
04 |
Блок 6 |
080В |
МЕТ 1 |
RRC |
|
0F |
Блок 7 |
080С |
|
JNC |
МЕТ 2 |
D2 10 08 |
Блок 8 |
080F |
|
INR |
В |
04 |
Блок 9 |
0810 |
МЕТ 2 |
RRC |
|
0F |
Блок 10 |
0811 |
|
JNC |
МЕТ 3 |
D2 15 08 |
Блок 11 |
0814 |
|
INR |
В |
04 |
Блок 12 |
0815 |
МЕТ 3 |
RRC |
|
0F |
Блок 13 |
0816 |
|
JNC |
МЕТ 4 |
D2 1А 08 |
Блок 14 |
0819 |
|
INR |
В |
04 |
Блок 15 |
081А |
МЕТ 4 |
INX |
H |
23 |
Блок 16 |
081В |
|
MOV |
М,В |
70 |
Блок 17 |
081С |
|
RST |
7 |
FF |
Переход к программе Монитор |