Флаг переноса (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 из старшей части числа.

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