|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.4. Арифметические операции ⇐ ПредыдущаяСтр 5 из 5 Арифметические операции сложения, вычитания, умножения и деления основаны на общих правилах, применяемых в позиционных системах счисления.
2.4.1. Арифметическое сложение 2.4.1.1. Арифметическое сложение двоичных чисел
Арифметическое сложение двоичных чисел выполняется по следующим правилам: 0 + 0 = 02; 0 + 1 = 12; 1 + 0 = 12; 1 + 1 = 102; 1 + 1 + 1 = 112. Сложение двух чисел в двоичной системе выполняется столбиком, справа налево, начиная с младшего (правого) разряда, как в десятичной системе. В каждом разряде в соответствии с правилами, указанными таблицей двоичного сложения, производится сложение двух бит слагаемых или этих двух бит и единицы, если имеется перенос из соседнего (правого) младшего разряда. В результате получается цифра соответствующего разряда суммы и, возможно, также единица переноса в соседний старший (левый) разряд.
Пример: Сложить два числа 2810 + 5810 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.1.
Табл.2.20.1. Арифметическое сложение двух чисел 2810 + 5810
Примечание. С – это бит переноса из старшего седьмого разряда. Ответ: 2810 + 5810 = 0001 11002 - 0011 10102 = 0101 01102 = 8610.
Пример: Сложить два числа 25510 + 110 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.2.
Табл.2.20.2. Арифметическое сложение двух чисел 25510 + 110
Примечание. Значение бита переноса С в результате не учитывается.
Ответ: при сложении десятичных чисел 25510 + 110 получается 25610, которое не входит в диапазон восьмиразрядной сетки 0 … 25510. Поэтому результат в двоичной системе 000000002 получается неверный из-за переполнения восьмиразрядной сетки. Для получения правильного результата необходимы вычисления с двойной точностью, то есть в шестнадцатиразрядной сетке.
Пример: Сложить два числа 25510 + 110 в шестнадцатиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в шестнадцатиразрядной сетке приведен в табл. 2.20.3.
Табл.2.20.3. Арифметическое сложение двух чисел 25510 + 110
Ответ: при сложении десятичных чисел 25510 + 110 получается 25610, которое входит в диапазон шестнадцатиразрядной сетки 0 … 6553510. Поэтому результат в двоичной системе получается верный 0000 0001 0000 00002 = 25610.
Пример: Сложить два числа -110 + 110 в восьмиразрядной сетке. Порядок выполнения арифметического сложения двоичных чисел в восьмиразрядной сетке приведен в табл. 2.20.4.
Табл.2.20.4. Арифметическое сложение двух чисел -110 + 110
Примечание. СF – разряд переноса (заема). Значение бита переноса СF в результате не учитывается.
Ответ: при сложении десятичных чисел -110 + 110 получается 010, которое входит в диапазон восьмиразрядной сетки -12810 … 0 … +12710. Результат 0000 00002 верный.
2.4.1.2. Арифметическое сложение шестнадцатеричных чисел
Арифметические сложение шестнадцатеричных чисел выполняется по правилам, применяемым в позиционных системах счисления.
Пример:Выполнить сложение шестнадцатеричных чисел 000Eh + 0001h. Результат представить в шестнадцатиразрядной сетке.
Ответ: 000Fh + 0001h = 0010h.
Пример: Выполнить сложение шестнадцатеричных чисел 000Fh + 0001h. Результат представить в шестнадцатиразрядной сетке.
Ответ: 000Fh + 0001h = 0010h.
Пример: Выполнить сложение шестнадцатеричных чисел 000Fh + 000Fh. Результат представить в шестнадцатиразрядной сетке.
Ответ: 000Fh + 000Fh = 000Еh.
Пример: Выполнить сложение шестнадцатеричных чисел 7FFFh+0001h в формате без знака. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.
Ответ: 7FFFh + 0001h = 8000h – верный, так как результат формате без знака входит в диапазон 0 … 6553510 или 0000h … FFFFh.
Пример: Выполнить сложение шестнадцатеричных чисел 7FFFh+0001h в формате со знаком. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.
Ответ: 7FFFh + 0001h = 8000h – не верный, так как результат формате со знаком не входит в диапазон -32768 … +3276710 или 8000h … 7FFFh и произошло переполнение шестнадцатиразрядной сетки в дополнительном коде.
Пример: Выполнить сложение шестнадцатеричных чисел FFFFh+0001h в формате без знака. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.
Ответ: 0000h – не верный, так как результат формате без знакf не входит в диапазон -0 … 6553510 (0000h … FFFFh) и произошло переполнение шестнадцатиразрядной сетки.
Пример: Выполнить сложение шестнадцатеричных чисел FFFFh+0001h в формате со знаком. Результат представить в шестнадцатиразрядной сетке. Выполнить верификацию результата.
Ответ: 0000h – верный, так как результат формате со знаком входит в -32768 … +3276710 или 8000h … 7FFFh.
2.4.2. Арифметическое вычитание
Арифметическая операция вычитания выполняется по правилам вычитания (с использованием заёма из старшего значащего разряда): 0 - 0 = 02; 0 - 1 = 12; 1 - 0 = 12; 1 - 1 = 02. При вычитании 0 - 1 = 12 производится заем в текущий бит.
Пример: Произвести вычитание в восьмиразрядной сетке 9710 - 7810 Порядок выполнения арифметического вычитания двоичных чисел в восьмиразрядной сетке приведен в табл.3.2.
Табл.2.21. Арифметическое вычитание двух чисел 0110 00012 – 0100 11102
Примечание. 1. Символом «↑» отмечен ближайший значащий разряд (равный единице), из которого будет выполнен первоначальный заём. 2. Символами «→» отмечены разряды, из которых выполняются последующие заёмы. 3. Символами «↓» отмечены разряды, в которые выполняются заёмы. 4. С учетом того, что вес каждого, более старшего разряда в два раза больше соседнего, то в каждый, более младший разряд, приходят две единицы (1+1=2). Ответ: 9710 - 7810 = 0110 00012 - 0100 11102 = 0001 00112 = 1910.
Пример: Произвести вычитание в восьмиразрядной сетке 010 - 110 Порядок выполнения арифметического вычитания двоичных чисел в восьмиразрядной сетке приведен в табл.3.2. Табл.2.21. Арифметическое вычитание двух чисел 0000 00002 – 0000 00012
Примечание. СF – разряд заема (переноса). Значение бита переноса СF в результате не учитывается. Ответ: 010 - 110 = 0000 00002 – 0000 00012 = 111111112 = -110.
2.4.3. Арифметическое умножение Арифметическое умножение одноразрядных двоичных чисел выполняется по следующим правилам: 0 ´ 0 = 0; 0 ´ 1 = 0; 1 ´ 0 = 0; 1 ´ 1 = 1. Умножение многоразрядных двоичных чисел происходит в соответствии с вышеприведенным правилам умножения по обычной схеме, применяемой в десятичной системе счисления. Выполняется последовательное умножение множимого на разряды множителя и поразрядным сдвигом промежуточного произведения влево. Количество сдвигов равно номеру разряда множителя. При сдвиге в промежуточные произведения справа дописываются нули. Произведение рассчитывается как сумма промежуточных произведений. Пример: Выполнить умножение 2310 ´ 1110 = 101102 ´ 10112 в двоичной системе счисления. Результат представить в восьмиразрядной и шестнадцатиразрядной сетках. Порядок выполнения арифметического умножения двоичных чисел приведен в табл2.
Табл.2.22. Арифметическое умножение двух двоичных чисел
2310 ´ 1110 = 101112 ´ 10112 = 1111 11012 = 25310 Ответ. В восьмиразрядной сетке результат равен 1111 11012. В шестнадцатиразрядной сетке результат равен 0000 0000 1111 11012.
2.4.4. Арифметическое деление Деление двоичных чисел выполняется по правилу арифметического вычитания. Пример: Выполнить деление целых чисел 11110 : 310 = 11011112 : 112 в двоичной системе счисления. Результат представить: - в целочисленном формате в восьмиразрядной и шестнадцатиразрядной сетках; - в формате с плавающей точкой (32 бита). Порядок выполнения арифметического деления двоичных чисел приведен в таблице 2.23.1.
Табл.2.23.1 Арифметическое деление двух двоичных чисел 11110 : 310
11110 : 310 = 3710; 11011112 : 112 = 10 01012 = 3710 Ответ: 0010 01012 = 0000 0000 0010 01012. Ответ: 1. Целочисленный результат: 1.1. В восьмиразрядной сетке 0010 01012. 1.2. В шестнадцатиразрядной сетке 0000 0000 0010 01012. 2. Дробный результат: 2.1. С фиксированной точкой 10 0101,12. 2.2. Нормализованное 1, 0010 112 ∙ 25. 2.3. С плавающей точкой 0 10000100 0010 1100 0000 0000 0000 000.
Пример: Выполнить деление целых чисел 11110 : 210 = 11011112 : 102 в двоичной системе счисления. Результат представить: - в целочисленном формате в восьмиразрядной и шестнадцатиразрядной сетках; - в формате с плавающей точкой (32 бита). Порядок выполнения арифметического деления двоичных чисел приведен в таблице 2.23.2.
Табл.2.23.2 Арифметическое деление двух двоичных чисел 11110 : 210
11110 : 210 = 55,510; 11011112 : 102 = 11 01112 (остаток равен 1); 11 01112 = 5510 Ответ: 1. Целочисленный результат: 1.1. В восьмиразрядной сетке 0011 01112. 1.2. В шестнадцатиразрядной сетке 0000 0000 0011 01112. 2. Дробный результат: 2.1. С фиксированной точкой 11 0111,12. 2.2. Нормализованное 1,1011 112 ∙ 25. 2.3. С плавающей точкой 0 10000100 1011 1100 0000 0000 0000 000.
2.5. Проверка результатов выполнения арифметических операций
Флаги состояния отражают признаки результат выполнения арифметических инструкций, таких как сложение ADD, вычитание SUB, умножение MUL, деление DIV. Флаги состояния: - CF — устанавливается при переносе из старшего значащего бита результата при сложении (или заёме в старший значащий бит результата при вычитании). Флаг CF показывает наличие переполнения в беззнаковой целочисленной арифметике. - PF — устанавливается, если младший значащий байт результата содержит чётное число единичных (ненулевых) битов. Флаг ориентирован на проверку целостности данных при хранении и передаче. - AF — устанавливается при переносе из третьего бита 3 результата при сложении (или при заёме в третий бит результата при вычитании). Этот флаг ориентирован на использование в двоично-десятичной арифметике (BCD - binary coded decimal) . - ZF — устанавливается, если результат равен нулю. Флаг ориентирован на проверку результата на ноль при организации циклов. - SF — равен значению старшего значащего бита результата. Флаг SF используется для определения знака результата в знаковой арифметике. - OF — устанавливается, если есть наличие переполнения в дополнительном коде (при переносе в старший значащий бит результата). Флаг OF показывает наличие переполнения в знаковой целочисленной арифметике.
Пример 1 #make_BIN# ;СЛОЖЕНИЕ 8000h + 7FFFh ;+++++++++++++++++++++++ MOV AX, 08000h MOV BX, 07FFFh ADD AX, BX HLT
Анализ результата
Пример 2 #make_BIN# ;СЛОЖЕНИЕ FFFFh + 0001h ;+++++++++++++++++++++++ MOV AX, 0FFFFh MOV BX, 00001h ADD AX, BX
Анализ результата
Пример 3 #make_BIN# ;СЛОЖЕНИЕ 07FFFh + 00001h ;+++++++++++++++++++++++ MOV AX, 07FFFh MOV BX, 00001h ADD AX, BX
Анализ результата
Пример 4 #make_BIN# ;СЛОЖЕНИЕ 8000h + 8000h ;+++++++++++++++++++++++ MOV AX, 08000h MOV BX, 08000h ADD AX, BX
Анализ результата
;+++++++++++++++++++++++ Пример 5 #make_BIN# ;ВЫЧИТАНИЕ 8000h - 8000h ;----------------------- MOV AX, 08000h MOV BX, 08000h SUB AX, BX
Анализ результата
Пример 6 #make_BIN# ;ВЫЧИТАНИЕ 8000h - 8001h ;----------------------- MOV AX, 08000h MOV BX, 08001h SUB AX, BX
Анализ результата
Пример 7 #make_BIN# ;ВЫЧИТАНИЕ 8000h - 7FFF h ;----------------------- MOV AX, 08000h MOV BX, 07FFFh SUB AX, BX
Анализ результата
Пример 8 #make_BIN# ;ВЫЧИТАНИЕ 7FFFh - 8000h ;----------------------- MOV AX, 07FFFh MOV BX, 08000h SUB AX, BX
Анализ результата
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|