- •Программы и программное обеспечение
- •5) Программирование на ассемблере.
- •10) Элементарные конструкции языка ассемблера:
- •11) Элементарные конструкции языка ассемблера:
- •16) Описание данных в ассемблер.
- •17) Команды пересылки данных общего назначения в ассемблере.
- •18) Команды загрузки адресных значений.
- •19) Команды ввода-вывода
- •21) Сложение двоичных чисел со знаком
- •22) Умножение двоичных чисел без знака
- •23) Деление двоичных чисел без знака
- •27) Логические команды языка ассемблер. Синтаксис. Примеры.
- •33) Кросс-система
- •34) Средства и виды отладки в ассемблер и кросс-системах
- •35) Отладка с помощью программы – интерпретатор
- •4. Модель времени
- •5. Модель системы прерываний
- •6. Модель системы ввода/вывода
21) Сложение двоичных чисел со знаком
Теперь настала пора раскрыть небольшой секрет. Дело в том, что на самом деле процессор не подозревает о различии между числами со знаком и числами без знака. Вместо этого у него есть средства фиксации возникновения характерных ситуаций, складывающихся в процессе вычислений. Некоторые из них мы рассмотрели ранее при обсуждении команд сложения чисел без знака — это учет флага переноса CF. Установка этого флага в 1 говорит о том, что произошел выход за пределы разрядности операндов. Далее с помощью команды ADC можно учесть возможность такого выхода (переноса из младшего разряда) во время работы программы. Другое средство фиксации характерных ситуаций в процессе арифметических вычислений — регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения OF в регистре EFLAGS (бит И).
Положительные числа представляются в двоичном коде, а отрицательные — в дополнительном. Рассмотрим различные варианты сложения чисел. Примеры призваны показать поведение двух старших битов операндов и правильность результата операции сложения.
Первый вариант сложения чисел:
30566 = 0111011101100110
+
00687 = 0000001010101111
=
31253 = 0111101000010101.
Следим за переносами из 14-го и 15-го разрядов и за правильностью результата: переносов нет, результат правильный.
ВЫЧИТАНИЕ ДВОИЧНЫХ ЧИСЕЛ СО ЗНАКОМ
Вычитание двоичных чисел со знаком выполнять несколько сложнее. Последний пример показал то, что процессору незачем иметь два устройства — сложения и вычитания. Достаточно наличия только одного — устройства сложения. Но для вычитания способом сложения чисел со знаком оба операнда (и уменьшаемое, и вычитаемое) необходимо представлять в дополнительном коде. Результат тоже нужно рассматривать как значение в дополнительном коде. Но здесь возникают сложности. Прежде всего, они связаны с тем, что старший бит операнда рассматривается как знаковый. Рассмотрим пример вычитания 45 - (-127).
Первый вариант вычитания чисел со знаком:
45 =00101101
-
-127 = 10000001
=
-44 =10101100.
Судя по знаковому разряду, результат получился отрицательный, что, в свою очередь, говорит о том, что число нужно рассматривать как дополнение, равное -44. Правильный результат должен быть равен 172. Здесь мы, как и в случае знакового сложения, встретились с переполнением мантиссы, когда значащий разряд числа изменил знаковый разряд операнда. Отследить такую ситуацию можно по содержимому флага переполнения OF. Его установка в 1 говорит о том, что результат вышел за диапазон представления знаковых чисел (то есть изменился старший бит) для операнда данного размера и программист должен предусмотреть действия по корректировке результата.
Следующее вычитание чисел со знаком выполним способом сложения:
-45 - 45 - -45 + (-45)= -90.
-415 = 11010011
+
-45 =11010011
=
-90 =10100110.
Здесь все нормально, флаг переполнения OF сброшен в 0, а 1 в знаковом разряде говорит о том, что значение результата — число в дополнительном коде.
