Дополнительный флаг переноса

Возможно, вам никогда не придется пользоваться флагом дополнительного переноса (AUX), по крайней мере непосредственно. Изучив команды условных переходов микропроцессора 8088, вы увидите, что прямое тестирование этого флага невозможно. Микропроцессор имеет флаг дополнительного переноса AUX для очень конкретной цели: он позволяет микропроцессору выполнять десятичные вычисления в двоичной кодировке (Binary-coded-decimal arithmetic — BCD — арифметика).

BCD — арифметика отличается от той, которую мы обсудили в гл. 2. Она основана на десятичной системе счисления. При осуществлении десятичной арифметики в двоичной кодировке любая дасятичная цифра представляется четырьмя битами (полубайтом). Каждый полубайт может представлять значения от 0 до 9; значения от 0AH до 0FH не используются.Это означает, что один байт может представлять десятичные числа от 0 до 99.

На первый взгляд такой способ хранения числовой информации кажется расточительным, двоичная кодировка десятичных чисел не использует 6 из 16 возможных состояний каждого полубайта. Однако во многих случаях применения микропроцессора этот способ дает непосредственное представление вводимых оператором чисел.

Большинство людей более подготовлено к работе с десятичными, а не с двоичными или шестнадцатеричными числами. Как только потребности ввода-вывода могут перевесить аспекты хранения и вычислений в приложениях, так удобнее становится выстраивать информацию в виде, легко преобразуемом к формату ввода-вывода. Двоичная кодировка десятичных чисел дает такую возможность. BCD — арифметика также решает возникающую в некоторых двоичных системах проблему представления чисел. При использовании чисел с плавающей точкой иногда возникает проблема округления, потому что двоичная система счисления не полностью соответствует десятичной системе. В некоторых случаях последняя цифра в результате простого вычисления может оказаться неверной. Иногда это называют проблемой потери пенни, так как эти случаи наиболее заметны в финансовых приложениях. BCD — представление чисел дает альтернативу для таких вычислений.

Набор командмикропроцессора 8088 не имеет специальных команд сложения и вычитания для BCD-арифметики. Здесь используется обычное сложение и вычитание, применяемые как и при обычном двоичном представлении. Результат сложения двух BCD-чисел на обычном математическом процессоре может оказаться неправельным BCD-числом.

Для устранения этого микропроцессор 8088 имеет несколько команд, которые преобразуют результат к правильной двоичной кодировке десятичного числа. Для корректного проведения этого преобразования процессор должен знать, был ли перенос из младшего полубайта в старший во время сложения. Пример на Фиг. 3.13 показывает, почему

38
+ 29
61

Фиг. 3.13 Десятичное сложение

Десятичная сумма 38 + 29 равна 67. Но двоичная сумма 38H + 29H равна 61H. Если числа 38 и 29 представляют BCD-значения, то после операции сложения программа должна выполнить коррекцию. Команда десятичной коррекции для сложения (DAA) преобразует число в форму BCD. В нашем случае число представлено в десятичной форме, т.е. оба полубайта находятся в диапазоне от 0 до 9, однако результат неверен. В данном случае сложение устанавливает флаг дополнительного переноса, который показаывает, что произошел перенос из младшей цифры (8 + 9). Этот флаг сообщает команде DAA, чтобы она прибавила к результату 6, давая правильный результат 67.

Микропроцессор также использует флаг дополнительного переноса при коррекции десятичной арифметики вслед за вычитанием с помощью команды десятичной коррекции для вычитания DAS. Существуют также две другие команды, которые используют флаг AUX для определения правильности действий. Эти команды, символьная коррекция для вычитания AAS и символьная коррекция для сложения AAA, выполняют ту же BCD-коррекцию, что и команды DAA и DAS. Команды AAA и AAS используются в программах для работы с таким представлением чисел, при котором каждая десятичная цифра занимает один байт. Это представление, еще более расточающее память, чем BCD, допускает очень удобную перекодировку из кода ASCII в числовое представление и обратно. Числа от 0 до 9 представляются в коде ASCII значениями от 30H до 39H, и преобразование в этот код и обратно просто означает сложение или вычитание 30H. В следующей главе рассматривается использование команд десятичной и символьной коррекции.

Флаг переполнения

Флаг переполнения OF — единственный флаг в старшем байте регистра флагов, который устанавливается обычными арифметическими операциями. Остальные флаги старшего байта находятся под прямым управлением программиста. Флаг переполнения — еще один арифметический флаг, как флаг нуляи переноса. Флаг переполнения необходим для арифметики в дополнительном коде в такой же степени, как флаг переноса для арифметики повышенной точности.

В арифметике чисел, представленныхв дополнительном коде, старший бит используется для хранения знака числа. Сумматор микропроцессора работает как со знакопеременными числами, так и беззнаковыми. Обычно сложение чисел со знаком дает верный результат. Однако некоторые из чисел, представленных в дополнительном коде, при сложении дают неверный результат. Пример на Фиг. 3.14 — сложение двух 8-битовых чисел, представленных в коде двоичного дополнения, — иллюстрирует этот случай. Если 72H и 53H — числа без знака, то результат их сложения верен. Если же это числа, представленныев дополнительном коде со знаком, то результат сложения 0C5H неверен, в коде двоичного дополнения он равен -59.

Шестнадцатеричное Десятичный эквивалент
72H
+ 53H + 83
0C5H

Фиг. 3.14 8-битовое сложение с переполнением

сложение положительных чисел никогда не дает в результате отрицательное. Результат сложения оказался непредставиммым в диапазоне значений 8-битовых чисел в двоичном коде (от 127 до -128). Этот эффект принято называть переполнением,так как сумма вышла за пределы диапазона чисел, представимых в дополнительном коде.

Важно заметить, что переполнение и перенос — два различных флага и имеют разное значение. На Фиг. 3.14 нет переноса, так как сложение без знака дает правильный результат, а есть переполнение: что сложение со знаком дает неверный результат. Возможен и случай одновременно переноса и переполнения, как показано на Фиг. 3.15.

Шестнадцатеричное Десятичный эквивалент
Hex Со знаком Без знака
8Eh -114
0ADh -83
1.3Bh -197

Фиг. 3.15 8-битовое сложение с переносом и перепонением

Здесь показан пример сложения двух отрицательных чисел. Результат -197 выходит за пределы диапазона представимости в дополнительном коде. Это показано тем, что 8-битовый результат 3BH — положительное число. Кроме того в этом примере устанавливается флаг переноса, означающий, что сложение без знака дало число, большее максимального представимого. В случае 8-битовых чисел максимальное число равно 255.

Вообще говоря, операция сложения в процессоре выполняется одинаково над числами и со знаком, и без знака, а также с десятичнымичислами. Флаги переноса, дополнительного переноса и переполнения содержат информацию о выполненной операции, позволяя программе определить верный результат в используемой системе счисления. Флаг переполнения показывает, что результат арифметическойоперации выходит за пределы диапазона чисел, представленныхв дополнительном виде. Переполнение отличается от переноса, который показывает, что произошел перенос из старшего бита результата.

Флаг захвата

Флаг захвата (специального прерывания) TF помогает при отладке программ. Этот флаг устанавливается не в результате работы микропроцессора, а — программой, с помощью специальной команды. Этот флаг называется также флагом трассировки или шага.

Когда этот флаг установлен, после выполнения каждой команды возникает прерывание. Эффект при этом такой же, как если бы после каждой команды некоторое внешнее устройство запрашивало прерывание. Прерывание по трассировке передает управление в ячейку, определенную вектором прерывания 4. Во время процедуры прерывания микропроцессор сбрасывает флаг специального прерывания. Это позволяет программе обработки прерывания по трассировке избежать прерывания после каждой команды. Когда обработчик прерывания по трассировке возвращает управление программе пользователя, он восстанавливает начальное состояние регистра флагов, в котором флаг трассировки установлен. Микропроцессор выполняет следующую команду пользователя, и снова возникает специальное прерывание. Обработчик прерываний по трассировке получает управление после каждой команды до тех пор, пока программа пользователя не сбросит флаг захвата.

Отладчик DOS использует флаг трассировки. Одной из функций отладчика является пошаговое выполнение, при котором перед каждым возвращением управления к отладчику выполняется одна команда программы пользователя. Это прерывание инициируется флагом захвата. Полное описание процедуры прерывания дано в разделе Векторы прерываний.

3.14.12. Флаг направления

Последним флагом в регистре флагов является флаг направления DF. Набор команд микропроцессора 8088 содержит несколько команд обработки строк, которые работают с большими блоками данных. Эти команды обработывают блоки данных побайтно или по одному слову памяти за раз. Индексные регистры указывают на блоки данных. После обработки байта или слова процессор изменяет индексный регистр так, чтобы он указывал на следующий элемент блока.

Строковые операции используют флаг направления для определения направления продвижения по блоку данных. Если флаг направления сброшен в 0, команды обработки строк увеличивают значение индексного регистра, а если флаг направления установлен в 1, то они уменьшают это значение. Флаг направления позволяет одному набору строковых команд обслуживать оба направления в зависимости от установки флага. В некоторых случаях желательно пересылать строку с увеличением адресов, а в других лучше всего использовать уменьшение адреса.

В качестве примера предположим, что в программе используется команда пересылки строк для пересылки блока данных на новое место. Если программа пересылает блок, с большего адреса памяти на меньший, она сбрасывает флаг направления, чтобы увеличивать значения индексных регистров после каждой пересылки; если же пересылка производится на больший адрес памяти, флаг направления устанавливается в 1, показывая уменьшение индексных регистров. В случае большинства пересылок не имеет значения, как именно установлен этот флаг. Но если конечное положение блока перекрывает его начальное положение, а флаг направления уствновлен неверно, то информация в блоке будет во время пересылки испорчена.

Рисунок 3.16 иллюстрирует пример пересылки блоков. Исходный блок данных имеет длину 200H байт и расположен от 300H до 4FFH. Нужно переслать его на новое место, расположив от 400H до 5FFH; исходное и результирующее поля перекрываются.

A B 300 +————+

В примере на Фиг.3.16(а) указатели источника и результата установлены на начала соответствующих блоков: указатель источника на 300H, а указатель результата на 400H. Флаг направления в примере сброшен, так, чтобы указатели увеличивались после каждой пересылки. Как показано на рисунке, после пересылки с помощью строковой операции 100H байт, указатель источника переместится на блок результата, а эта область блока уже заполнена данными после пересылки. Пересылка последних 100H байт будет неправильной, так как потеряны исходные данные блока.

В части (b) примера указатели и источника, и результата установлены на концы блоков. Флаг направления установлен так, что содержимое указателей уменьшается после пересылки. При таком способе данные пересылаются верно.

Программы ввода-вывода для IBM PC дают характерный пример использования флага направления для перемещения изображения на экране дисплея. Программа ввода-вывода использует команды пересылки строк микропроцессора 8088 для пересылки данных внутри буфера дисплея. Когда программа передвигает изображение на экране вверх, команды пересылают данные в меньшие адреса памяти. Когда программа опускает символы на экране вниз, команды пересылают данные в большие адреса памяти. В каждом случае программа устанавливает или сбрасывает флаг направления в соответствии с направлением пересылаемых данных

Векторы прерываний

Еще одна важная составная часть микропроцессора 8088 — механизм прерываний. Эта компонента системы встроена в микропроцессор, и обеспечивает эффективные методы обработки прерываний.

Когда микропроцессор 8088 получает сигнал о необходимости прерывания, он определяет, какое из усройств требует обслуживания посредством аппаратной процедуры, известной как цикл подтверждения прерывания. В IBM PC для обслуживания внешних прерываний используется контроллер прерываний 8259 фирмы Intel. Контроллер прерываний программируется так, чтобы выдавать однобайтовое число в ответ на цикл подтверждения прерывания микропроцессора 8088. Это число, находящееся в диапазоне от 0 до 255, — номер прерывания внешнего усройства, вызвавшего прерывание. В персональной ЭВМ контроллер прерываний обслуживает восемь внешних прерываний, которым соответствуют номера от 8 до 15.

Как только микропроцессор 8088 получает номер прерывания, он должен передать управление соответствующей программе обработки прерывания. Первые 1024 байт памяти микропроцессора 8088 зарезервированы для векторов прерываний. Каждому из 256 возможных прерываний отводится четырехбайтовая область. Прерывание 0 имеет четыре байта по адресам от 0 до 3, прерывание 1 — от 4 до 7, и т.д. Каждая четырехбайтовая ячейка содержит указатель на соответствующий обработчик конкретного прерывания. Первые два байта содержат смещение адреса программы обработки прерывания, а последние два байта — сегмент. Для задания значения этого поля может использоваться оператор определения двойного слова DD.

Так же, как и вызов подпрограммы, прерывание должно сохранить в стеке адрес возврата. Поскольку обработчик прерывания может находиться в любом месте адресного пространства микропроцессора, он должен обслужить прерывание, как вызов типа FAR, т.е. перед тем, как микропроцесоор передаст управление обработчику прерывания, он сохранит сегмент и смещение текущей команды в программе. Кроме того возврат из программы обработки прерывания должен вернуть машину в точности в то состояние, в котором она была в момент возникновения прерывания. Чтобы помочь в этом, микропроцессор 8088 также сохраняет регистр флагов в стеке. Это означает, что эти действия уже не придется выполнять каждой программе обработки прерываний. Сохранение регистра флагов означает также сохранение и текущего состояния флага разрешения прерываний. Принятие внешнего прерывания сбрасывает флаг разрешения прерывания, так что программа обработки прерывания уже не может быть прервана другим прерыванием. Команда возврата из прерывания, которая восстанавливает регистр флагов, автоматически деблокирует систему прерываний восстановлением флага прерываний в состояние предшествующее возникновению прерывания.

Когда возникает прерывание, микропроцессор помещает в стек региср флагов, за которым следуют регистры CS и IP. 8088 использует номер прерывания, чтобы считать указатель на программу обработки прерывания, и передать ей управление. Теперь уже эта программа отвечает за сохранение регистров, которые она использует, и восстановление их перед возвратом управления в прерванную процедуру. Для возврата из прерывания используется специальная команда IRET. Она извлекает верхние три слова из стека и помещает их в регистры IP, CS и регистр флагов. В следующих главах мы приведем несколько примеров, использующих механизм прерываний.

Программист может использовать механизм прерывания непосредственно, без запроса внешних прерываний. Существуют команды, которые заставляют микропроцессор работать так, как будто при их выполнения возникло внешнее прерывание. Такие действия называются программными прерываниями, так как они порождаются программами, но имитируют действия обычных прерываний. Процессор помещает все три управляющих регистра в стек и выбирает вектор прерывания по указанному программой однобайтовому значению. Микропроцессор использует записанный в начале памяти вектор прерывания в качестве указателя подпрограммы обработки прерывания.

Программные прерывания придают большую гибкость системе 8088. В случае обычных вызовов подпрограммы программист до ее выполнения обязан знать, где она находится. Но если программа вызывает подпрограмму, используя программное прерывание, то подпрограмма может находиться в любом месте адресного пространства, и вызывающей программе нет нужды знать ее местонахождение. Единственным параметром, котрый требуется от программиста, вызывающего подпрограмму, является номер вектора прерываний. Управляющие программы и операционная система фирмы IBM очень выгодно используют этот механизм. Программные прерывания дают доступ к сервисным программам системы. Программам пользователя не нужно знать точные адреса, которые могут изменяться в разных версиях системного программного обеспечения. Кроме того, сервисные подпрограммы могут быть подменены в любой момент времени простой заменой четырехбайтового вектора, указывающего на новую программу, без всякой модификации программ, использующих эти подпрограммы. В гл. 10 мы приведем несколько примеров, которые покажут, использование такого подхода.

Флаг С: флаг переноса, заема.


Похожие статьи.

Понравилась статья? Поделиться с друзьями: