Assembler для начинающих


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



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


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




Содержание раздела