Программа выполняет над операндами логическую и сдвиговую операции, после чего заносит в стек аккумулятор и регистр признаков результата. Таким образом, после выполнения программы в ячейках памяти с адресами L=200 и L=201 будут находиться данные:
В ячейке L = 200 — содержимое регистра флагов F = 10 0х0 1112;
В ячейке L = 201 — содержимое регистра аккумулятора A = 00 000 0102;
Таблица 4.5.2
Иллюстрация работы программы по шагам
Мнемоника команды |
Значение аккумулятора |
Значение регистра флагов |
LXI SP |
хx xxx xxx |
хx0x0x1x |
MVI B |
хx xxx xxx |
хx0x0x1x |
MVI A |
00 000 001 |
хx0x0x1x |
XRA B |
10 000 001 |
100х0110 |
RAL |
00 000 010 |
100х0111 |
Таблица 4.6
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
227 |
SUB A |
Обнуление A |
001 |
041 |
LXI H |
Загрузка начального адреса указателя памяти |
002 |
011 |
B2 |
Младший байт адреса |
003 |
000 |
B3 |
Старший байт адреса |
004 |
167 |
MOV M, A |
Обнуление ячейки памяти, адресуемой регистровой парой HL |
005 |
043 |
INX H |
Формирование адреса следующей ячейки памяти |
006 |
303 |
JMP |
Безусловный переход по адресу |
007 |
004 |
B2 |
Младший байт адреса |
010 |
000 |
B3 |
Старший байт адреса |
При выполнении программы в автоматическом режиме она начинает обнулять ячейки памяти с 011, доходит до конца памяти и затем обнуляет ячейки, в которых записано начало программы. Очистив ячейку 004 (в которой находится команда обнуления), она фактически заменяет ее пустой командой, и обнуление прекращается.
В данном пункте интерес представляет не сама программа, состоящая из одной команды HLT, а безусловный переход, реализуемый с клавиатуры лабораторной установки, поэтому нет смысла давать какие-либо комментарии к программе.
Таблица 4.8.1
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
061 |
LXI SP |
Загрузка начального адреса указателя стека |
001 |
200 |
B2 |
Мл. байт адреса |
002 |
000 |
B3 |
Ст. байт адреса |
003 |
361 |
POP PSW |
Извлечение из стека Слова Состояния Программы |
004 |
* |
* |
Код команды условного перехода |
005 |
000 |
B2 |
Мл. байт адреса перехода |
006 |
000 |
B3 |
Ст. байт адреса перехода |
007 |
166 |
HLT |
Останов |
200 |
** |
Состояние регистра признаков |
|
201 |
000 |
Содержимое аккумулятора |
Результат работы программы зависит от моделируемого регистра признаков.
Таблица 4.8.2
* Команда (L=004) |
** Регистр признаков (L=200) |
Переход |
JNZ (302) |
002/102 |
+/- |
JZ (312) |
002/102 |
-/+ |
JNC (322) |
002/003 |
+/- |
JC (332) |
002/003 |
-/+ |
JPO (342) |
002/006 |
+/- |
JPC (352) |
002/000 |
-/+ |
JP (362) |
002/202 |
+/- |
JM (372) |
002/202 |
-/+ |
Таблица 4.9
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
061 |
LXI SP |
Загрузка начального адреса указателя стека |
001 |
100 |
B2 |
Мл. байт адреса |
002 |
000 |
B3 |
Ст. байт адреса |
003 |
315 |
CALL |
Вызов подпрограммы |
004 |
200 |
B2 |
Мл. байт адреса |
005 |
000 |
B3 |
Ст. байт адреса |
006 |
166 |
HLT |
Останов |
200 |
000 |
NOP |
Пустая операция |
201 |
311 |
RET |
Возврат из подпрограммы |
Подпрограмма содержит одну пустую операцию. Для использования команды CALL необходимо инициализировать стек, иначе адрес возврата может быть записан в произвольную область памяти.
4.10. Вызов подпрограммы обработки прерывания
Таблица 4.10.1
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
061 |
LXI SP |
Загрузка начального адреса указателя стека |
001 |
067 |
B2 |
Мл. байт адреса |
002 |
000 |
B3 |
Ст. байт адреса |
003 |
317 |
RST 1 |
Вызов подпрограммы по адресу L=010 |
004 |
166 |
HLT |
Останов |
010 |
311 |
RET |
Возврат из подпрограммы |
Таблица 4.10.2
Работа программы:
ША |
ШД |
Комментарий |
000 |
061 |
LXI |
001 |
067 |
B2 |
002 |
000 |
B3 |
003 |
317 |
RST 1 |
066 |
000 |
SP-1 |
065 |
004 |
SP-2 |
010 |
311 |
RET |
065 |
004 |
SP-2 |
066 |
000 |
SP-1 |
004 |
166 |
HLT |
Отличие команд CALL и RST N — в способе адресации: в первом случае это прямая адресация (адрес следует после кода операции), во втором — разновидность неявной адресации: адрес перехода вычисляется из кода операции.
Команда RSTn занимает меньше места в памяти, по сравнению с CALL, поэтому её используют при прерываниях. Однако ее недостатком является то, что вызвать подпрограмму можно только в пределах адресов 000 000 – 000 070 с шагом в 010.
4.11. Вложенный вызов подпрограмм
Таблица 4.11
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
061 |
LXI SP |
Загрузка начального адреса указателя стека |
001 |
067 |
B2 |
Мл. байт адреса |
002 |
000 |
B3 |
Ст. байт адреса |
003 |
317 |
RST 1 |
Вызов подпрограммы по адресу L=010 |
004 |
166 |
HLT |
Останов |
010 |
311 |
RST 2 |
Вызов подпрограммы по адресу L=020 |
011 |
311 |
RET |
Возврат из подпрограммы |
020 |
337 |
RST 3 |
Вызов подпрограммы по адресу L=030 |
021 |
311 |
RET |
Возврат из подпрограммы |
030 |
347 |
RST 4 |
Вызов подпрограммы по адресу L=040 |
031 |
311 |
RET |
Возврат из подпрограммы |
040 |
357 |
RST 5 |
Вызов подпрограммы по адресу L=050 |
041 |
311 |
RET |
Возврат из подпрограммы |
050 |
311 |
RET |
Возврат из подпрограммы |
Программа последовательно вызывает 5 вложенных подпрограмм, при этом в стек записываются адреса вызывающих команд подобно тому, как это делалось в 2 предыдущих программах. Далее эти адреса по очереди извлекаются из стека.
Если удалить из памяти один или несколько операторов RET, поведение процессора может быть произвольным, потому что между подпрограммами находятся неопределенные участки памяти (012 — 019, 022 — 029, 032 — 039, 042 — 049, 051 — ).
Считаем сумму двух последних чисел, пока значение “счетчика” i (начальное условие: i = 12 ) не станет равным нулю.
В программе задействованы следующие регистры и регистровые пары:
· А — последнее вычисленное число;
· С — предпоследнее вычисленное число;
· D — счетчик;
Словесное описание алгоритма:
1. Инициализация регистров:
A =0;
C=0;
B=0;
D=12;
2. Суммируем значения регистров А и С, результат записываем в А;
3. Присваиваем регистру С значение регистра В;
4. Присваиваем регистру М значение регистра А;
5. Уменьшаем значение счетчика на единицу;
6. Проверяем значение счетчика(неравен нулю - переходим в начало цикла, равен нулю конец программы);
7. Останов.
Таблица4.1
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
000 |
041 |
LXI H |
Загрузка начального адреса указателя стека |
001 |
200 |
B2 |
Мл. байт адреса |
002 |
000 |
B3 |
Ст. байт адреса |
003 |
076 |
MVI A |
Непосредственная загрузка 0 в A |
004 |
001 |
B2 |
|
005 |
016 |
MVI A |
Непосредственная загрузка 0 в C |
006 |
000 |
B2 |
|
007 |
006 |
MVI A |
Непосредственная загрузка 0 в B |
010 |
000 |
B2 |
|
011 |
026 |
MVI A |
Непосредственная загрузка 0 в D |
012 |
022 |
B2 |
|
013 |
107 |
MOV B, A |
Присваиваем рег. B значение рег. A |
014 |
201 |
ADD A |
Суммируем значения регистров А и С, результат записываем в А |
015 |
110 |
MOV C, B |
Присваиваем регистру С значение регистра В; |
016 |
167 |
MOV M, A |
Присваиваем регистру М значение регистра А; |
017 |
025 |
RCRD |
Уменьшаем значение счетчика на единицу |
020 |
302 |
JZ addr |
Условный переход по флагу z |
021 |
013 |
B2 |
Если z=1(нулевой результат), то переходим |
022 |
000 |
B3 |
в 013, иначе осущ. переход к след. команде |
023 |
167 |
MOV M, A |
Запись результата в стек |
024 |
166 |
HLT |
Останов |
В рамках этого раздела был выполнен вывод бегущей строки на четырехразрядный семисегментный индикатор. Отображаемый текст: «Прогноз — снег».
Таблица5.1
Символ |
Код |
Символ |
Код |
П |
00110111 |
— |
01000000 |
Р |
01110011 |
С |
00111001 |
О |
00111111 |
Н |
01110110 |
Г |
00110001 |
Е |
01111001 |
Н |
01110110 |
Г |
00110001 |
О |
00111111 |
||
З |
01001111 |
Таблица5.2
Адрес (L) |
Содержание |
206 |
П |
207 |
Р |
210 |
О |
211 |
Г |
212 |
Н |
213 |
О |
214 |
З |
215 |
- |
216 |
С |
217 |
Н |
220 |
Е |
221 |
Г |
В каждый момент времени на дисплее отображается только 4 символа из 4 соответствующих ячеек памяти. Изначально регистровая пара HL указывает на адрес L = 202. Затем происходит вывод четырех символов, по ходу вывода L увеличивается на 3. Далее выполняется пустой цикл с большим количеством итераций. После этого проверяется значение L. Если оно равно 225, в L вновь загружается начальный адрес, если нет, из L вычитается 2 и происходит возврат к началу вывода на левый индикатор. Поскольку скорость движения строки не обозначена в задании, соответствующий параметр цикла подбирался «на глаз».
Таблица5.3
Адреса (L) |
Команды |
Мнемоника команд |
Комментарии |
|||||
000 |
041 |
LXI H |
Загрузка начального адреса памяти |
|||||
001 |
202 |
B2 |
Мл. байт адреса |
|||||
002 |
000 |
B3 |
Ст. байт адреса |
|||||
003 |
176 |
MOV A, M |
Читаем из памяти символ для левого разряда индикатора |
|||||
004 |
323 |
OUT |
Выводим символ в левый разряд |
|||||
005 |
376 |
B2 |
Адрес левого разряда индикатора |
|||||
006 |
043 |
INX H |
Переходим к следующей ячейке памяти |
|||||
007 |
176 |
MOV A, M |
Аналогично для 2-го слева разряда индикатора |
|||||
010 |
323 |
OUT |
||||||
011 |
375 |
B2 |
||||||
012 |
043 |
INX H |
||||||
013 |
176 |
MOV A, M |
Для 3-го индикатора |
|||||
014 |
323 |
OUT |
||||||
015 |
374 |
B2 |
||||||
016 |
043 |
INX H |
||||||
017 |
176 |
MOV A, M |
Для 4-го индикатора |
|||||
020 |
323 |
OUT |
||||||
021 |
373 |
B2 |
||||||
022 |
021 |
LXI D |
Инициализация параметра цикла |
|||||
023 |
000 |
B2 |
Мл. байт |
|||||
024 |
000 |
B3 |
Ст. байт |
|||||
025 |
023 |
INX D |
Увеличиваем параметр цикла на 1 |
|||||
026 |
172 |
MOV A, D |
Перемещаем старший байт параметра цикла в аккумулятор для проверки |
|||||
027 |
376 |
CPI |
Проверка с фиксированным значением |
|||||
030 |
200 |
B2 |
(Значение B2 достаточно условное) |
|||||
031 |
302 |
JNZ |
Проверка условия продолжения цикла |
|||||
032 |
025 |
B2 |
Мл. байт адреса тела цикла |
|||||
033 |
000 |
B3 |
Ст. байт адреса тела цикла |
|||||
034 |
175 |
MOV A, L |
Адресный регистр в аккумулятор |
|||||
035 |
376 |
CPI |
Проверяем значение адреса |
|||||
036 |
225 |
B2 |
Адрес, считающийся конечным |
|||||
037 |
312 |
JZ |
В случае достижения конечного адреса, инициируем указатель заново |
|||||
040 |
000 |
B2 |
Мл. байт адреса |
|||||
041 |
000 |
B3 |
Ст. байт адреса |
|||||
042 |
326 |
SUI |
Уменьшаем значение адреса |
|||||
043 |
002 |
B2 |
на 2 |
|||||
044 |
157 |
MOV L, A |
Записываем обновленный адрес |
|||||
045 |
303 |
JMP |
Переход к выводу левого символа |
|||||
046 |
003 |
B2 |
Мл. байт перехода |
|||||
047 |
000 |
B3 |
Ст. байт перехода |
|||||
В ходе данной работы был подробно исследован процессор К580: его система команд, способы адресации, организация стековых операций, работа с периферийными устройствами (на примере многоразрядного семисегментного индикатора). Процессор имеет хорошо продуманную и организованную систему команд. Все команды можно разделить на несколько больших групп, большие группы в свою очередь делятся на малые группы, то есть команды легко классифицируются. Достаточно много однобайтных команд — все регистры общего назначения
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.