Флаг переноса

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

      Микропроцессор устанавливает флаг  переноса как индикатор заема

    при расширенном вычитании. Наряду  с расширением точности программа

    может сипользовать  флаг переноса для  определения соотношения двух

    чисел.  Если флаг  переноса установлен,  вычитаемое значение больше

    уменьшаемого; если флаг переноса не установлен, вычитаемое значение

    меньше  или равно  уменьшаемому.  Это  означает, что  флаг переноса

    становится первичным  индикатором при определении  соотношения двух

    чисел: после того, как программа  вычитает два числа, флаг переноса

    указывает,    какое из  них  больше.  Таким способом    программа может

    проверять  целые числа  без  знака,  включая такие      приложения, как

    сортировка строк символов. В случае чисел со знаком для определения

    соотношения  чисел  программе  нужна  дополнительная  информация. В

    следующей  главе  в  разделе  "Условные  переходы"  обсуждаются все

    способы тестирования чисел.