Флаги состояния. Управляющие флаги.
Процессоры i8086 и i8088 имели 14-цать программно-доступных 16-тиразрядных регистров. (Последние модели CPU включают в свой состав регистры с разрядностью до 128 (256) бит, и общее количество регистров достаточно велико.)
Четыре регистра из 14-ти являются регистрами общего назначения. В основном они используются для выполнения операций над данными. Т.е. их содержимое можно складывать, вычитать, сравнивать, умножать друг на друга и т.д. К ним относятся:
AX – (X – сокращение от extended, т.е. расширенный).Наиболее часто используют как аккумулятор – место, где накапливают результаты вычислений. Многие команды занимают меньше места в ОП и выполняются быстрее, если один из операндов находится в регистре AX. Операции ввода/вывода осуществляют только через этот регистр.
AH | AL | AX |
15 High 8 | 7 Low 0 |
BX – чаще всего хранит сегментную часть адреса, т.е. базовый (base), т.к. сегментная часть адреса указывает на начало некоторой области памяти и служит отправной точкой для дальнейшей адресации внутри этой области. Этот регистр можно использовать и для хранения данных другого рода.
BH | BL | BX |
15 High 8 | 7 Low 0 |
CX – обычно используется как регистр счетчика (counter). В нем хранят число, показывающее, сколько раз должна быть повторена некоторая операция. Когда число повторений достигает заранее определенного значения, в программе происходит передача управления в другую точку. Счетчиком может быть любой РОН, но только с регистром CX необходимые сравнения и переход осуществляются за одну инструкцию.
CH | CL | CX |
15 High 8 | 7 Low 0 |
DX – регистр данных (data). Иногда он используется для хранения адреса порта. Иногда используется в паре с регистром AX для хранения 32-разрядного числа, получающегося, например, при умножении 2-х 16-тиразрядных чисел. (AX и DX выступают в качестве неявных операндов в операциях умножения и деления).
|
DH | DL | DX |
15 High 8 | 7 Low 0 |
Итак, AX, BX, CX, DX включают в группу регистров данных. Если инструкция оперирует только с одним байтом данных, то этот байт может находиться в любой половине регистра данных, при этом содержимое второй половины после выполнения инструкции не изменяется. Когда требуется обратиться к одной из 8-миразрядных частей регистра, то младшие (правые) именуют AL, BL, CL, DL, а старшие (левые) AH, BH, CH, DH.
Регистр флагов (flags register).
Этот регистр эквивалентен регистру слова состояния процессора других вычислительных систем. Этот регистр содержит информацию о текущем состоянии процессора. Рассматривают его не как единое целое, а как набор 16-ти отдельных битов, каждый из которых указывает на определенный факт. Он включает 6 флагов состояний и 3 флага управления состоянием CPU.
После выполнения очередной команды процессором все биты – флаги заново устанавливаются. По этим флагам можно судить о результате выполнения операции.
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Флаги состояния:
CF (Carry Flag) – Флаг переноса. Устанавливается в 1 при возникновении переноса в результате выполнения арифметических операций. Перенос – ситуация, когда в результате выполнения верной операции получается число, не помещающееся в регистр или ячейку памяти. (При сложении – перенос из старшего разряда, при вычитании – заем в старший разряд устанавливают флаг CF).
|
PF (Parity Flag) – Флаг паритета. Устанавливается в 1, если в младшем байте результата выполнения операции содержится четное число двоичных единиц, иначе флаг сбрасывается в 0. Используется для поиска ошибок при передаче данных.
AF (Auxiliary Flag) – Флаг вспомогательного переноса. Используется в операциях над двоично-десятичными числами (BCD – формат). Устанавливается в 1, если при выполнении операции возникает перенос между младшими тетрадами (из разряда 3 в разряд 4) обрабатываемых операндов. Эта ситуация требует коррекции результата. Перед выполнением операций коррекции результата осуществляется анализ флага AF.
ZF (Zero Flag) – Флаг нуля. Устанавливается в 1, если результат операции равен 0, иначе флаг сбрасывается в 0.
SF (Sign Flag) – Флаг знака. Принимает значение старшего (знакового) разряда результата операции. SF=1, если число отрицательное, и SF=0, если число положительное. Следовательно, флаг учитывают при работе со знаковыми операндами.
OF (Overflow Flag) – Флаг переполнения. Устанавливается в 1, если происходит переполнение разрядной сетки при обработке операндов со знаком. Такая ситуация возникает в случае выхода результата за пределы допустимого диапазона значений для чисел со знаком. Положительные числа находятся в диапазоне 0000h – 7FFFh, отрицательные – в диапазоне 8000h – FFFFh (числа с установленным старшим битом). Т.О., если при сложении двух положительных чисел результат превышает число 7FFFh, или при вычитании из отрицательного числа результат получается меньше 8000h, флаг OF устанавливается в 1. Операцию вычитания из отрицательного числа можно рассматривать, как операцию сложения двух отрицательных чисел. Следовательно, можно сказать, что флаг OF определяется при сложении двух операндов, имеющих одинаковые знаки.
|
Управляющие флаги:
DF (Direction Flag) - Управляющий флаг направления. Устанавливается пользователем и задает порядок обработки строк символов при выполнении соответствующих команд. При DF=0 строка обрабатывается в прямом направлении от младших адресов к старшим (вызывает автоматический инкремент индексных регистров SI, DI). При DF=1 – наоборот – декремент индексных регистров и обработка строк ведется в обратном направлении от старших адресов к младшим.
TF (Trace Flag) – Управляющий флаг трассировки (ловушки). При TF=1 процессор переключается в режим пошагового выполнения команд с реализацией после каждой команды соответствующего прерывания. Используется в отладчиках.
IF (Interrupt Flag) – Управляющий флаг прерываний. При IF=1 процессору разрешено обслуживание запроса на прерывания от внешних устройств. При IF=0 прерывание хода выполнения программы запрещено.
Указатель команд (инструкций)
(IP – Instruction Pointer)
Хранит относительный адрес, по которому в RAM находится инструкция, следующая за исполняемой. Фактически этот регистр «следит» за ходом выполнения программы. Наращивание адреса выполняет CPU, в зависимости от длины текущей команды. Значение, хранящееся в IP, может изменяться в зависимости от структуры программы. Команды условных и безусловных переходов, циклов, вызова подпрограмм и т.д. изменяют содержимое IP, осуществляя переходы к требуемой точке команды. Разрядность регистра IP - 16 бит.
Регистры указатели
К ним относятся индексные регистры:
SI – Source ( Источник )
DI – Destination ( Приемник )
Используются в основном при перемещении цепочек данных (многобайтных последовательностей произвольной длины), но могут использоваться и произвольным образом. Основное их назначение – хранить индексы (смещения) относительно некоторой базы, (т.е., начала массива) при выборке операндов из памяти.
Регистр SI – регистр индекса источника (source index register). Он содержит относительный адрес начала цепочки, которую следует переместить.
Регистр DI – регистр индекса приемника (destination index register). Содержит относительный адрес, по которому нужно переместить цепочку. Число перемещаемых байт обычно хранится в регистре CX (счетчике). Кроме операций по перемещению цепочек данных, индексные регистры используют и для адресации внутри массивов числовых данных. Адрес базы при этом может находиться в базовых регистрах BX или BP (base pointer). Т.о., в этих регистрах хранится сегментная часть адреса.
Указатель стека
(SP – Stack Pointer)
Используется только как указатель вершины стека. В любом случае регистры BP и SP используются для указания на начало области памяти отведенной под стек, т.к. BP выступает как указатель базы при работе с данными в стековой структуре.
Сегментные регистры
Эти регистры используются только! при работе с адресами. Это важнейшие элементы в архитектуре CPU, т.к. обеспечивают 20-ти разрядную адресацию адресного пространства с помощью 16-ти разрядных операндов.