
и 000 072 Q. Чтобы понять, что произошло при переходе от записи на ассемблере к реальному
расположению константы в памяти, запишем сначала эту константу в двоичном коде: 010000Q равняется
0001000000000000В. Если теперь разбить это 16-разрядное двоичное число на два байта, то получится
00010000В и 00000000В, или в восьмеричной системе 020Q и OOOQ. Эти числа и записаны в ячейки с
адресами 000 072 Q и 000071Q соответственно. Этот перевод константы от той формы, в которой она
записана на ассемблере, к реальному расположению в памяти будет встречаться еще во многих командах
монитора.
Следующая команда LXI Н, 006 000 Q загружает пару регистров H-L константой 006 000Q. Эта
константа является адресом первой ячейки ОЗУ. Загрузка SP и H-L начальными значениями выполняется
только один раз при входе в монитор (после сигнала RESET). В дальнейшем эта пара регистров будет
использоваться для хранения адреса ячейки памяти, с которой в данный момент работает программист.
Итак, SP установлен таким образом, что поле стека будет находиться в старших адресах ОЗУ, а в H-L
находится адрес первой ячейки ОЗУ. Следующие семь команд, занимающие ячейки с 000076Q по
000110Q, служат для того, чтобы высветить на индикаторах адрес ячейки памяти, с которой в настоящее
время работает программист, и ее содержимое. Команда М2: MOV С, М (адрес 000 076 Q) переписывает
данные из ячейки, адрес которой хранится в H-L (при первом проходе данного места программы это адрес
первой ячейки ОЗУ), в регистр С. Далее команда MOV A, H переписывает данные из регистра Н в
аккумулятор, чтобы с помощью следующей команды OUT 001Q вывести ее на индикаторы с адресом
001Q. Данные переписываются в аккумулятор перед их выводом этой командой (в двух последующих
аналогичных случаях применяется команда OUT OOOQ и OUT 002Q), потому что команда OUT может
переслать в устройство вывода только содержимое аккумулятора. После выполнения команды OUT 001 Q
на соответствующих индикаторах высветится содержимое регистра Н. Каждый светодиод, которому
соответствует единица в каком-либо разряде регистра Н, загорится, а каждый светодиод, которому
соответствует нуль в каком-либо разря-пе Н погаснет. Аналогично на светодиодах порта OOOQ высве-
тится содержимое регистра L (команды MOV A, L и OUT OOOQ) и порта 002 Q - регистра С (команды
МЗ: MOV А, С и OU 1 00?Q) После этого выполняется команда М4: CALL SKL, которая вызывает
подпрограмму SKL, обслуживающую клавиатуру. Прежде чем переходить к описанию этой
подпрограммы, опишем еще одну подпрограмму DL, которая вызывается из подпро-граммы SKL.
Подпрограмма DL служит для задержки выполнения программы на 10 мс. Такие задержки часто
необходимы при работе с внешними устройствами, быстродействие которых значительно меньше, чем у
микро-ЭВМ. Поэтому эта подпрограмма, находящаяся и используемая в мониторе, написана таким обра-
зом что сохраняет значение всех регистров и ячеек памяти во время своей работы. Она может быть
вызвана из других программ пользователя. Подпрограмма DL начинается с ячейки 000 277 Q Команды
PUSH PSW и PUSH D переписывают в стек содержимое аккумулятора, регистра состояний и пары ре-
гистров D-E для того, чтобы освободить эти регистры и использовать далее для своей работы, а перед
выходом из подпрограммы восстановить их старое содержание. Затем пара регистров D-E загружается с
помощью команды LXI D, 001 016Q константой 001016Q. Следующие пять команд образуют цикл.
Команда N:DCX D уменьшает содержимое пары регистров D-E, вычитая из хранящегося в них двоичного
числа единицу. Затем старший байт пары D-E командой MOV A, D переписывается в аккумулятор Далее
команда ORA E выполняет поразрядно логическую операцию ИЛИ над содержимым аккумулятора и
регистра Е и результат этой операции записывается в аккумулятор, при этом если содержимое А и Е (или
D и Е) не равно нулю, сбрасывается флаг признака нуля результата Z. Это приводит к тому что следующая
команда JNZ N (адрес 000 307 Q) осуществляет переход к метке N (адрес 000304Q) и фрагмент программы
от метки N до команды JNZ N (или, что то же самое, от адреса 000304Q до 000311Q) будет повторяться до
тех пор пока в обоих регистрах D и Е не образуются нули. Следовательно этот фрагмент программы
выполняется 001016Q раз. Обозначим буквой N с соответствующим индексом число машинных тактов
определенной команды. Тогда число тактов при однократном выполнении этого фрагмента N
0
=
N
DCXD
+ +
N
MOVA,D
+N
ORAE
+N
JNZN
= 5 + 5 + 4+10= 19.
Так как длительность одного такта при использовании кварцевого резонатора на частоту 9 МГц равняется 1
мкс (см. гл. 6), время выполнения этого фрагмента 19 мкс, а чтобы выполнить его 001 016Q раз, нужно 9994
мкс. Следовательно, выполнение этой программы задерживает выполнение программы, вызвавшей ее,
примерно на 10 мс. После того как выполнено 001 016 Q циклов и содержимое D и Е равно нулю, флаг Z не
устанавливается командой ОКА Е и командой JNZ N не передает управление к метке N. Тогда выполняются
команды POP D и POP PSW, которые восстанавливают содержимое пары регистров D-E, аккумулятора и слова
состояний. Затем команда RET передает управление команде, следующей за той командой CALL DL, которая
вызвала эту подпрограмму.
Рассмотрим теперь подпрограмму SKL. Эта подпрограмма обеспечивает работу клавиатуры микро-ЭВМ.
Она располагается в области ПЗУ с адресами 000 177Q - 000 276Q. При ее вызове командой CALL SKL
управление передается команде, располагаемой по адресу 000177Q. Команда SKL: MVI А, 000Q загружает в
аккумулятор OOOQ, а следующая команда OUT 003Q записывает содержимое младших четырех битов
аккумулятора, т. е. 0000В, в четыре триггера микросхем К155ТМ7 (см. микросхему D22 на рис. 7.7).