Регистры общего назначения
Микропроцессор Z80 содержит две идентичные группы (банка) из восьми 8-разрядных регистров в каждой. Эти регистры для краткости именуются регистрами общего назначения, что, однако, не совсем верно.
Каждый банк состоит из следующих регистров:
– аккумулятора A;
– регистра флагов F;
– регистров общего назначения B, C, D, E, H и L.
Регистры второго банка принято обозначать с помощью знака апострофа: A', B' и т.д. Функционально регистры обеих групп совершенно идентичны.
Подавляющее число инструкций микропроцессора оперирует с содержимым регистров первого (основного) банка. Имеются две инструкции (EXAF,AF' и EXX), которые позволяют обменять местами содержимое банков. Суммарное время выполнения этих двух команд составляет 8 тактов; время, необходимое для сохранения тех же самых регистров в стеке с помощью команд PUSH (как это традиционно делается в обработчиках прерывания для процессора 8080), составляет 44 такта; для восстановления содержимого регистров из стека командами POP требуется 40 тактов.
Аккумулятор A используется во всех основных арифметико-логических операций и содержит один из операндов, а также результат операции.
Регистры общего назначения используются вместе с аккумулятором в байтовых арифметико-логических операциях, храня второй операнд. Кроме того, имеются инструкции инкремента и декремента содержимого этих регистров. Регистр B, помимо всего прочего, используется в качестве счётчика в инструкции организации циклов DJNZ.
Регистры общего назначения могут логически объединяться в три пары BC, DE и HL, применяющиеся для хранения и обработки 16-разрядных адресов и операндов (старший байт находится соответственно в регистре B, D и H, а младший – в C, E и L). Особенно часто это свойство используется для регистровой пары HL, поскольку система команд включает полный набор арифметико-логических операций между содержимым аккумулятора и ячейкой памяти, адрес которой находится в этой регистровой паре (в системе команд микропроцессора 8080 для обозначения такого операнда использовался “псевдорегистр” M).
Правда, арифметико-логические операции возможны и над операндами, адреса которых хранятся в индексных регистрах, но коды этих команд занимают 3 байта памяти вместо одного, а для их выполнения требуется 19 тактов вместо семи.
Адрес в регистровой паре BC может применяться в командах пересылки 8-разрядных операндов, а также в операциях ввода-вывода. Кроме того, содержимое регистровой пары BC используется в качестве счётчика в инструкциях обработки блоков данных. Адрес в регистровой паре DE используется в командах пересылки 8-разрядных операндов и обработки блоков данных.
Регистр флагов F состоит из нескольких отдельных разрядов, имеющих самостоятельное значение. Он имеет следующий формат:
----T---T---T---T---T---T---T---¬
¦ S ¦ Z ¦ ¦ H ¦ ¦P/V¦ N ¦ C ¦
L---+---+---+---+---+---+---+----
7 0
Назначение разрядов регистра флагов следующее.
S (разряд 7) – флаг знака. Принимает значение 1, если старший (знаковый) разряд результата операции равен единице.
Z (разряд 6) – флаг нуля. Устанавливается, когда при выполнении операции был получен нулевой результат.
Разряд 5 не используется.
H (разряд 4) – флаг вспомогательного переноса. Устанавливается, когда операция сложения или вычитания вызывает соответственно перенос из 3-го разряда в 4-й или заём из 4-го разряда в 3-й. Используется при выполнении операций десятичной коррекции инструкцией DAA.
Разряд 3 не используется.
P/V (разряд 2) – этот флаг в зависимости от операции является либо признаком переполнения (V), либо признаком чётного результата (P). В первом случае он устанавливается, если при выполнении операции произошло переполнение, и сбрасывается при отсутствии такового. Во втором случае он устанавливается, если в результате присутствует чётное число единичных разрядов, и сбрасывается, если единиц нечётное число.
N (разряд 1) – флаг операции вычитания. Устанавливается, если предыдущая операция была операцией вычитания, и сбрасывается в противном случае. Используется инструкцией DAA при выполнении десятичной коррекции результата.
C (разряд 0) устанавливается, если при выполнении операции сложения произошёл перенос из старшего разряда или если при выполнении операции вычитания произошёл заём в старший разряд. В инструкциях сдвига во флажок переноса заносится значение выдвигаемого разряда.
При выполнении некоторых инструкций те или иные флаги регистра F устанавливаются или сбрасываются по особым правилам. Сведения об имеющихся особенностях приводятся в описании системы команд.