На рис. 1.2 показаны три группы регистров данных, и адресов, 16-битовый указатель команд IP (Instruction Pointer) и 16-битовый регистр флагов.
РЕГИСТРЫ ДАННЫХ
В зависимости от того, чем Вы оперируете: 16-битовыми словами или 8-битовыми байтами, регистры данных можно рассматривать как четыре 16-битовых или восемь 8-битовых регистров. В первом случае регистры имеют имена АХ, ВХ, СХ, DX. Эти регистры образованы из 8-битовых регистров AL, АН, BL, ВН, CL, СН, DL и DH. Здесь L и Н означают младшие (low-order) и старшие (high-order) байты 16-битовых регистров. Например, регистры AL и АН образуют соответственно младший и старший байты регистра АХ.
Всеми этими регистрами можно пользоваться при программировании, но следует учитывать, что ряд команд использует их неявным образом, в частности
регистр АХ, аккумулятор (accumulator), используется при умножении и делении слов, в операциях ввода-вывода и в некоторых операциях над строками; регистр AL используется при выполнении аналогичных операций над байтами, а также при преобразовании-десятичных чисел и выполнении над ними арифметических операций;
регистр АН используется при умножении и делении байтов;
регистр ВХ, Базовый регистр (base register), часто используется при адресации данных в памяти;
регистр СХ, счетчик (count register), используется как счетчик числа повторений цикла и в качестве номера позиции элемента данных при операциях над строками. Регистр CL используется как счетчик при операциях сдвига и циклического сдвига на несколько битов;
регистр DX, регистр данных (data register), используется при умножении и делении слов. Кроме того, в операциях ввода-вывода он используется как номер порта.
Программисты, имеющие опыт работы с микропроцессорами 8080 и 8085, должны заметить, что АН - единственный регистр микропроцессора 8088, не имеющий аналога в этих микропроцессорах. Остальные регистры использовались в них под другими именами; так, в микропроцессоре 8080 регистру AL соответствует регистр А, а регистрам ВХ, СХ и DX соответствуют регистры HL, ВС и DE.
Только регистры данных могут использоваться и как 16-битовые, и как 8-битовые. Все регистры остальных групп - 16-битовые.
РЕГИСТРЫ СЕГМЕНТОВ
Ранее уже говорилось, что в ЭВМ, сконструированных на базе микропроцессоров 8086 и 8088, программы и данные хранятся в отдельных областях памяти. Эти области (или сегменты) могут иметь объем до 64 Кбайт. Микропроцессор 8088 может иметь дело одновременно с четырьмя сегментами. Начальные адреса этих сегментов содержатся в его четырех регистрах сегментов. Эти регистры выполняют следующие функции:
регистр сегмента команд CS (code segment) указывает на сегмент, содержащий текущую исполняемую программу. Для вычисления адреса следующей исполняемой команды микропроцессор 8088 добавляет к содержимому регистра CS (умноженному на 16) содержимое указателя команд IP;
регистр сегмента стека SS (stack segment) указывает на текущий сегмент стека. Стек представляет собой область памяти, используемую для временного хранения данных и адресов. Микропроцессор 8088 использует стек для хранения адреса возврата из текущей подпрограммы, но стек можно использовать также для восстановления содержимого регистров, изменяемых при работе программы. Позже мы рассмотрим стеки более подробно;
регистр сегмента данных DS (data segment) указывает на текущий сегмент данных, обычно содержащий используемые в программе переменные; регистр дополнительного сегмента ES (extra segment) указывает на текущий дополнительный сегмент, который используется при выполнении операций над строками.
РЕГИСТРЫ УКАЗАТЕЛЕЙ И ИНДЕКСОВ
Вспомните, что для вычисления адреса команды в сегменте команд микропроцессор 8088 извлекает номер блока памяти из регистра CS, а смещение- из регистра IP. Подобным образом за счет выбора номера блока из соответствующего регистра сегмента, а смещения - из другого регистра осуществляется доступ к данным других сегментов. Для доступа к сегменту данных микропроцессор 8088 извлекает номер блока из регистра DS, а смещение - из регистра ВХ или индексного регистра (SI или DI). Для доступа к сегменту стека микропроцессор 8088 извлекает номер блока из регистра SS, а смещение - из регистра указателя (SP или BP). Выбирая номер блока из регистра ES, микропроцессор может также получить доступ к дополнительному сегменту (подробнее об этом см. в гл. 2).
УКАЗАТЕЛЬ КОМАНД
Большинство микропроцессоров выполняют программу следующим образом: извлекают из памяти очередную команду, исполняют ее, затем извлекают следующую команду и т. д. Этот подход (при котором цепочка действий выполняется последовательно), естественно, приводит к простоям, так как микропроцессор должен перед исполнением команды подождать ее извлечения из памяти. В микропроцессоре 8088 большая часть этих простоев исключается за счет того, что эти две задачи - извлечение команды и ее исполнение - выполняются отдельными специализированными компонентами микросхемы.
Одна из них, интерфейс шины (Bus Interface Unit), извлекает команды из памяти и осуществляет передачу данных между исполнительными компонентами и "внешним миром". Другая компонента, операционный блок (Execution Unit), только исполняет команды. Так как эти компоненты независимы, то интерфейс шины может извлекать новую команду из памяти в то самое время, когда операционный блок исполняет ранее извлеченную команду.
Как только интерфейс шины извлекает команду, он передает ее на конвейер микропроцессора (электронный эквивалент автомата для продажи сигарет). Таким образом, когда операционный блок заканчивает исполнение команды программы, то обычно может "взять" следующую команду прямо с конвейера.
Так как интерфейс шины не знает порядка исполнения команд программы, то он всегда извлекает команды с последовательно возрастающими адресами. Поэтому операционному блоку приходится ждать извлечения команды из памяти только в тех случаях, когда в программе управление передается не следующей команде, а какой-то другой. Тогда операционный блок ожидает, пока интерфейс шины не освободит конвейер и не извлечет требуемую команду. Тогда и только тогда микропроцессор 8088 ждет подобно многим другим микропроцессорам извлечения каждой команды. На рис. 1.3 показано параллельное извлечение и исполнение команд в микропроцессоре 8088.
Так как микропроцессор 8088 работает столь необычным образом, то специалисты фирмы Intel подчеркнули отличие своего регистра "следующего исполняемого адреса" от регистров "следующего извлекаемого адреса" других производителей микропроцессоров, назвав его указателем команд (IP - instruction pointer) вместо обычного счетчика команд (PC - program counter). Так как регистр IP имеет столь специфическое назначение, то Вы не можете выполнять арифметические операции над его содержимым. Однако микропроцессор 8088 имеет команды, одни из которых изменяют содержимое регистра IP, а другие помещают его в стек и извлекают обратно.
ФЛАГИ
В программе нередко требуется принять решение на основании результата только что исполненной микропроцессором 8088 команды. Например Вам может понадобиться выполнить одни действия, если результат сложения оказался нулем (например, напечатать. "Баланс равен нулю!" в программе для бухгалтерских расчетов), и совсем другие действия в противном случае.
В 16-битовом регистре флагов фиксируется информация о текущем состоянии дел, которая может помочь Вашей программе принять решение. Шесть битов регистра служат для хранения состояний, а три других могут быть использованы для программного управления режимом работы микропроцессора 8088.
На рис. 1.4 показано, как эти девять- флагов размещены в регистре флагов. Флаги имеют следующие значения:
[.Бит 0, флаг переноса CF(carry flag), равен 1, если произошел перенос единицы при сложении или заем единицы при вычитании. В противном случае он равен нулю. Кроме того, CF содержит значение бита, который при сдвиге или циклическом сдвиге регистра или ячейки памяти вышел за их границы, и отражает результат операции сравнения. Наконец, CF служит индикатором результата умножения; детали см. в описании бита 11 (OF).
2.Бит 2,флаг четности PF(parity flag), равен 1, если в результате операции получено число с четным числом единиц в его битах. В противном случае он равен нулю. ФлагРГ в основном используется в операциях обмена данными.
3. Бит 4, вспомогательный флаг переноса AF (auxiliary carry flag), аналогичен флагу CF, только контролирует перенос или заем для третьего бита данных. Полезен при выполнении операций над упакованными десятичными числами.
4. Бит 6, флаг нуля ZF(zero flag),равен 1, если в результате операции получен нудь; ненулевой результат c6pacbiBaerZF в нуль.
5. Бит 7, флаг знака SF (sign flag), имеет значение только при операциях над числами со знаком. Флаг SF равен 1, если в результате арифметической или логической операции, сдвига или циклического сдвига получено отрицательное число. В противном случае он равен нулю. Иными словами, SF дублирует старший (знаковый) бит результата независимо от того, имеет результат длину 8 или 16 битов.
6. Бит 8, флаг трассировки TF (trap flag), разрешает микропроцессору 8088 исполнять програму "по шагам" и используется при отладке программ.
7. Бит 9, флаг прерывания IF (interrupt enable flag), разрешает микропроцессору 8088 реагировать на прерывания от внешних устройств. Сбрасывание IF в нуль заставляет микропроцессор 8088 игнорировать прерывания до тех пор, пока F не станет равным 1.
8. Бит 10, флаг направления DF (direction flag), заставляет микропроцессор 8088 уменьшать на единицу (DF = 1) или увеличивать на'единицу(ВР = 0) регистр(ы) индекса после выполнения команды для работы со строками. Если DF = 0, то микропроцессор 8088 будет обрабатывать строку "слева направо" (от младших адресов к старшим). Если DF = 1, то обработка пойдет в обратном направлении (от старших адресов к младшим или справа налево).
9. Бит И, флаг переполнения OF (overflow flag), в первую очередь служит индикатором ошибки при выполнении операций над числами со знаком. Флаг OF равен 1, если результат сложения двух чисел с одинаковым знаком или результат вычитания двух чисел с противоположными знаками выйдет за пределы допустимого диапазона значений операндов. В противном случае он равен 0. Кроме того, OF = 1, если старший, (знаковый) бит операнда изменился в результате операции арифметического сдвига. В противном случае он равен 0.
В сочетании с флагом CF флаг OF указывает длину результата умножения. Если старшая половина произведения отлична от нуля, то OF hCF равны 1; в противном случае оба эти флага равны 0.
Наконец,OF = 0, если частное от деления двух чисел переполняет результирующий регистр.
На рис. 1.4 заштрихованы позиции неиспользуемых битов (1, .3, 5 и 12 - 15). Когда бы Вы ни прочитали значение регистра флагов, эти биты будут нулевыми.
Не делайте ошибок, рассчитывая, что в кождый момент времени флаги должны быть в определенном состоянии. У микропроцессора 8088 имеются команды для установки или сброса флагов. Если состояние флагов может быть неоднозначным, используйте эти команды.
У микропроцессора 8088 есть команды условной передачи управления, которые проверяют состояния флагов переноса CF, четности PF, нуля ZF, знака SF и переполнения OF. В зависимости от результата проверки выполнение программы продолжается либо со следующей команды, либо с некоторой другой ячейки памяти.