Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
24
Добавлен:
25.08.2019
Размер:
526.34 Кб
Скачать

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

Флаг переноса (CF) служит для поддержания процессором многоразрядной арифметики. Обычно при выполнении арифметических операций вроде сложения или вычитания 8088 может работать с не более чем 16-битовыми числами. Однако в некоторых случаях приходится манипулировать с числами превышающими 2**16. Например, для сложения двух 32-битовых чисел программе придется сложить сначала младшие части чисел, а затем - старшие. На Фиг 3.11 показано сложение 32-битовых чисел 22223333H и 44445555H. В этом примере складываются с начала младшие 16-битовые значения с получением результата 8888H. Затем складываются старшие 16-битовые значения с результатом 6666H. 32-битовый результат равен 66668888H.

   

второе сложение

первое сложение

2222

3333

4444

5555

6666

8888

Фиг. 3.11 32-битовое сложение

Для получения 32-битового результата требуется два 16-битовых сложения. Для 48-битового числа потребуется уже три 16-битовых сложения и т.д. Для выполнения сложения программа должна расчленять каждое большое число на 16-битовые куски. Однако, приведенный пример достаточно прост. Результат первого 16-битового сложения не влиял на второе. В общем же случае сложения возможен перенос из одной позиции в другую. Когда процессор выполняет слоожение двух 16-битовых чисел, он автоматически выполняет переносы. Когда же программа складывает два 32-битовых числа, как в нашемпримере, то ей приходится запоминать перенос в первом сложении и использовать его при сложении вторых 16-битовых значений. На Фиг. 3.12 показано сложение чисел 22224444H и 3333EEEEH. В этом примере перенос от первого сложения отражается на втором сложении.

   

второе сложение

первое сложение

2222

4444

3333

EEEE

5556

1.3332

1 (перенос от первого сложения)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]