Флаг переноса
Флаг переноса (CF) служит для поддержания процессором многоразряд-
ной арифметики. Обычно при выполнении
арифметических операций вроде
сложения
или вычитания 8088
может работать с
не более чем
16-битовыми числами. Однако в некоторых случаях
приходится
манипулировать с числами превышающими
2**16. Например, для сложения
двух
32-битовых чисел программе
придется сложить сначала младшие
части
чисел, а затем - старшие. На Фиг 3.11 показано
сложение
32-битовых чисел 22223333H и 44445555H.
В этом примере складываются сначала младшие 16-битовые згначе-
ния с
получением результата 8888H. Затем
складываются старшие 16-
второе сложение первое сложение
---------------------------------------
2222 3333
4444 5555
---- ----
6666 8888 Фиг. 3.11
--------------------------------------- 32-битовое сложение
битовые
значения с результатом
6666H. 32-битовый результат равен
66668888H. Для получения 32-битового результата
требуется два
16-битовых сложения. Для 48-битового числа
потребуется уже три
16-битовых сложения и т.д. Для выполнения
сложения программа должна
расчленять каждое большое число на
16-бтовые куски.
Однако, приведенный пример достаточно прост. Результат первого
16-битового сложения не влиял на второе. В
общем же случае сложения
возможен
перенос из одной
позиции в другую.
Когда процессор
выполняет слоожение двух 16-битовых чисел, он автоматически выпол-
няет переносы. Когда же программа складывает два 32-битовых числа,
как в нашем примере, то ей приходится запоминать перенос в первом
сложении
и использовать его
при сложении вторых
16-битовых
значений.
На Фиг. 3.12 показано сложение
чисел 22224444H и
3333EEEEH. В этом примере перенос от
первого сложения отражается на
втором сложении.
втоорое сложение первое сложение
--------------------------------------------
2222 4444
3333 EEEE
1 (перенос от первого)
---- -----
5556 13332
--------------------------------------------
Фиг. 3.12 32-битовое сложение с переносом
Первое 16-битовое сложение 4444H и EEEEH
дает результат 13332H.
Поскольку результат имеет длину 17
бит, он не может быть помещен в
16-битовый регистр.
Флаг переноса регистра состояний примет этот
дополнительный бит арифметической
информации. При втором 16-битовом
сложении складываются не только числа 2222H и 3333H, но и значение
флага переноса. Существует две формы команды сложения: команда ADD
складывает два 16-битовых
числа, давая 17-битовый результат, а
команда сложения с переносом ADC складывает два 16-битовых числа и
значение
флага переноса, давая
также 17-битовый результат.
В
примере
на рис.3.12 для первой операции сложения использовалась
команда ADD, а для второй операции
сложения команда ADC.
Оба приведенных примера используют флаг
переноса для выполнения
арифметики повышенной
точности. В первом примере после сложения
3333H
и 5555H получился
нулевой перенос; когда
команда ADC
прибавляет значение
переноса к числам 2222H и
4444H, получается
правильный результат
6666H. Во втором примере флаг переноса был
установлен,так как был перенос из младшей
части суммы в старшую.
В случае арифметики еще большей точности программа может снова
и снова
использовать в процессе сложения флаг переноса. Каждое
16-битовое сложение
устанавливает флаг переноса в соответствии с
его результатом, а программа может сложить
следующие по старшинству
части чисел с полученным значением флага переноса. В каждом случае
флаг
переноса содержит семнадцатый
бит предыдущего результата, и
программа должна использовать это значение при сложении следующих,
более старших, частей чисел.
Флаг переноса служит и для другой важной цели. Когда программа
выполняет вычитание, существует
возможность заема из одной позиции
в
другую. Флаг переноса показывает при вычитании
необходимость
заема из одной части числа в другую.
Вычитать целые числа, в несколько слов
длиной программа может
таким же путем, как и складывать. Сначала вычитаются младшие части
чисел, с получением 16-битового
результата. Команда вычитания (SUB)
устанавливает флаг переноса, отражая
заем. Следующее 16-битовое
вычитание программа выполняет с заемом. Команда вычитания с заемом
(SBB)
наряду с обычным
вычитанием вычитает из результата флаг
переноса. Как и при сложении программа
может осуществлять вычитание
целых чисел произвольной длины, используя флаг переноса в качестве
значения заема.
Микропроцессор 8088 трактует флаг переноса как истинный заем,
то есть если в результате вычитания
появляется заем, микропроцессор
устанавливает флаг переноса равным 1. Он показывает, что программа
должна вычесть 1 из результата вычитания
старших частей чисел. Если
заема
нет, процессор сбрасывает
флаг переноса на ноль. Это
означает, что программе не нужно вычитать
1 из старшей части числа.
Микропроцессор устанавливает флаг переноса как индикатор заема
при расширенном вычитании. Наряду с расширением точности программа
может сипользовать флаг переноса для
определения соотношения двух
чисел.
Если флаг переноса
установлен, вычитаемое значение больше
уменьшаемого; если флаг переноса не
установлен, вычитаемое значение
меньше
или равно уменьшаемому. Это
означает, что флаг переноса
становится первичным индикатором при определении соотношения двух
чисел: после того, как программа вычитает два числа, флаг переноса
указывает, какое
из них
больше. Таким способом программа может
проверять
целые числа без знака,
включая такие приложения, как
сортировка строк символов. В случае чисел
со знаком для определения
соотношения чисел программе нужна
дополнительная информация. В
следующей
главе в разделе
"Условные
переходы" обсуждаются все
способы тестирования чисел.
Содержание
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий