|
Флаг переноса (CF) служитдля поддержания процессором многоразряд-
ной арифметики. Обычно при выполнении
арифметических операций вроде
сложенияиливычитания8088можетработатьснеболеечем
16-битовымичислами.Однаковнекоторыхслучаяхприходится
манипулировать с числами превышающими
2**16. Например, для сложения
двух32-битовых чиселпрограмме
придетсясложить сначала младшие
частичисел, азатем -старшие. НаФиг 3.11показано
сложение
32-битовых чисел 22223333H и 44445555H.
В этом примере складываютсясначала младшие 16-битовые згначе-
ния сполучением результата 8888H. Затемскладываются старшие 16-
второе сложениепервое сложение
---------------------------------------
22223333
44445555
--------
66668888Фиг. 3.11
--------------------------------------- 32-битовое сложение
битовыезначения срезультатом
6666H.32-битовый результат равен
66668888H.Дляполучения32-битовогорезультататребуетсядва
16-битовыхсложения.Для48-битовогочислапотребуется уже три
16-битовых сложения и т.д. Для выполнения
сложения программа должна
расчленять каждое большое число на
16-бтовые куски.
Однако, приведенный примердостаточно прост. Результат первого
16-битового сложения не влиял на второе. В
общем же случае сложения
возможенпереносизоднойпозициивдругую.Когдапроцессор
выполняет слоожение двух 16-битовыхчисел, он автоматически выпол-
няет переносы. Когда жепрограмма складывает два 32-битовых числа,
как в нашемпримере, то ей приходится запоминатьперенос в первом
сложенииииспользоватьегоприсложениивторых16-битовых
значений.НаФиг.3.12показаносложениечисел22224444Hи
3333EEEEH. В этом примере перенос от
первого сложения отражается на
втором сложении.
втоорое сложениепервое сложение
--------------------------------------------
22224444
3333EEEE
1 (перенос от первого)
---------
555613332
--------------------------------------------
Фиг. 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 из старшей части числа.
Микропроцессор устанавливает флагпереноса как индикатор заема
при расширенном вычитании. Нарядус расширением точности программа
может сипользоватьфлаг переноса дляопределения соотношения двух
чисел.Если флагпереноса
установлен,вычитаемое значение больше
уменьшаемого; если флаг переноса не
установлен, вычитаемое значение
меньшеили равноуменьшаемому.Этоозначает, чтофлаг переноса
становится первичныминдикатором при определениисоотношения двух
чисел: после того, как программавычитает два числа, флаг переноса
указывает,какое
изнихбольше.Таким способомпрограмма может
проверятьцелые числабеззнака,включая такиеприложения, как
сортировка строк символов. В случае чисел
со знаком для определения
соотношениячиселпрограмменужнадополнительнаяинформация. В
следующейглавевразделе"Условныепереходы"обсуждаются все
способы тестирования чисел.
|