Флаг переноса (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 из старшей части числа.
Микропроцессор устанавливает флаг переноса как индикатор заема
при расширенном вычитании. Наряду с расширением точности программа
может сипользовать флаг переноса для определения соотношения двух
чисел. Если флаг переноса установлен, вычитаемое значение больше
уменьшаемого; если флаг переноса не установлен, вычитаемое значение
меньше или равно уменьшаемому. Это означает, что флаг переноса
становится первичным индикатором при определении соотношения двух
чисел: после того, как программа вычитает два числа, флаг переноса
указывает, какое из них больше. Таким способом программа может
проверять целые числа без знака, включая такие приложения, как
сортировка строк символов. В случае чисел со знаком для определения
соотношения чисел программе нужна дополнительная информация. В
следующей главе в разделе "Условные переходы" обсуждаются все
способы тестирования чисел.