- •2. Арифметические основы микропроцессорной техники
- •2.1. Системы счисления
- •2.2. Перевод из одной системы счисления в другую
- •2.2.1. Перевод целого десятичного числа в двоичную систему счисления
- •2.2.4. Перевод целого двоичного числа в шестнадцатеричную систему счисления
- •2.2.5. Перевод целого шестнадцатеричного числа в двоичную систему счисления
- •2.2.6. Перевод целого шестнадцатеричного числа в десятичную систему счисления
- •2.2.7. Перевод дробного десятичного числа в двоичную систему счисления
- •2.2.8. Перевод дробного двоичного числа в десятичную систему счисления
- •2.3. Представление информации в вычислительно технике
- •2.3.1. Целые числа без знака (unsigned)
- •2.3.2. Целые числа со знаком (signed)
- •2.3.3. Числа с плавающей точкой (float)
- •2.3.4. Символьные данные (char)
- •2.3.5.2. Представление десятичного числа в двоично-десятичном неупакованном формате
- •2.3.5.3. Перевод bcd упакованного формата в десятичное число
- •2.3.5.4. Перевод bcd неупакованного формата в десятичное число
- •2.4. Арифметические операции
- •2.4.1. Арифметическое сложение
- •2.4.1.1. Арифметическое сложение двоичных чисел
- •2.4.1.2. Арифметическое сложение шестнадцатеричных чисел
- •2.4.2. Арифметическое вычитание
- •2.4.3. Арифметическое умножение
- •2.4.4. Арифметическое деление
- •2.5. Проверка результатов выполнения арифметических операций
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
Результат |
FFFFh |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
0 |
0 |
1 |
0 |
1 |
0 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=1 |
Отрицательный |
CF=0 |
Нет переполнения |
OF=0 |
Нет переполнения |
Операция |
32768+32767=65535 |
Операция |
-32768+32767=-1 |
Вывод |
Результат 65535 верный |
Вывод |
Результат -1 верный |
Пример 2
#make_BIN#
;СЛОЖЕНИЕ FFFFh + 0001h
;+++++++++++++++++++++++
MOV AX, 0FFFFh
MOV BX, 00001h
ADD AX, BX
Результат |
0000h |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
1 |
1 |
0 |
0 |
1 |
1 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=0 |
Положительный |
CF=1 |
Есть переполнение |
OF=0 |
Нет переполнения |
Операция |
65535 + 1 = 0 |
Операция |
-1+1=0 |
Вывод |
Результат 0 неверный, т.к. 65535 + 1 = 65536 |
Вывод |
Результат 0 верный |
Пример 3
#make_BIN#
;СЛОЖЕНИЕ 07FFFh + 00001h
;+++++++++++++++++++++++
MOV AX, 07FFFh
MOV BX, 00001h
ADD AX, BX
Результат |
8000h |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
0 |
0 |
1 |
1 |
1 |
1 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=1 |
Отрицательный |
CF=0 |
Нет переполнения |
OF=1 |
Есть переполнение |
Операция |
32767 + 1 = 32768 |
Операция |
32767 + 1 = -32768 |
Вывод |
Результат 32768 верный. |
Вывод |
Результат -32768 неверный, т.к. 32767 + 1 = 32768 |
Пример 4
#make_BIN#
;СЛОЖЕНИЕ 8000h + 8000h
;+++++++++++++++++++++++
MOV AX, 08000h
MOV BX, 08000h
ADD AX, BX
Результат |
0000h |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
1 |
1 |
0 |
1 |
1 |
0 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=0 |
Положительный |
CF=1 |
Есть переполнение |
OF=1 |
Есть переполнение |
Операция |
32768 + 32768 = 0 |
Операция |
-32768 + -32768 = 0 |
Вывод |
Результат 0 неверный, т.к. 32768 + 32768 = 65536 |
Вывод |
Результат 0 неверный, т.к. -32768 + -32768 = -65536 |
;+++++++++++++++++++++++
Пример 5
#make_BIN#
;ВЫЧИТАНИЕ 8000h - 8000h
;-----------------------
MOV AX, 08000h
MOV BX, 08000h
SUB AX, BX
Результат |
0000h |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
0 |
1 |
0 |
0 |
1 |
0 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=0 |
Положительный |
CF=0 |
Нет переполнения |
OF=0 |
Нет переполнения |
Операция |
32768 - 32768 = 0 |
Операция |
32768 - (-32768) = 0 |
Вывод |
Результат 0 верный. |
Вывод |
Результат 0 верный |
Пример 6
#make_BIN#
;ВЫЧИТАНИЕ 8000h - 8001h
;-----------------------
MOV AX, 08000h
MOV BX, 08001h
SUB AX, BX
Результат |
FFFFh |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
1 |
0 |
1 |
0 |
1 |
1 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=1 |
Отрицательный |
CF=1 |
Есть переполнение |
OF=0 |
Нет переполнения |
Операция |
32768 – 32769 = 65535 |
Операция |
-32768 - (-32767) = -1 |
Вывод |
Результат 65535 неверный, т.к. 32768 – 32769 = -1 |
Вывод |
Результат -1 верный |
Пример 7
#make_BIN#
;ВЫЧИТАНИЕ 8000h - 7FFF h
;-----------------------
MOV AX, 08000h
MOV BX, 07FFFh
SUB AX, BX
Результат |
0001h |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
0 |
0 |
0 |
1 |
0 |
1 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=0 |
Положительный |
CF=0 |
Нет переполнения |
OF=1 |
Есть переполнение |
Операция |
32768 – 32767 = 1 |
Операция |
-32768 – 32767 = 1 |
Вывод |
Результат 1 верный. |
Вывод |
Результат 1 неверный, т.к. -32768 – 32767 = -65535 |
Пример 8
#make_BIN#
;ВЫЧИТАНИЕ 7FFFh - 8000h
;-----------------------
MOV AX, 07FFFh
MOV BX, 08000h
SUB AX, BX
Результат |
FFFFh |
|||||
Флаги |
CF |
ZF |
SF |
OF |
PF |
AF |
Значение флага |
1 |
0 |
1 |
1 |
1 |
0 |
Анализ результата
UNSIGNED |
SIGNED |
||
|
|
SF=1 |
Отрицательный |
CF=1 |
Есть переполнение |
OF=1 |
Есть переполнение |
Операция |
32767 – 32768 = 65535 |
Операция |
32767 - (-32768) = -1 |
Вывод |
Результат 65535 неверный, т.к. 32767 – 32768 = -1 |
Вывод |
Результат -1 неверный, т.к. 32767 - (-32768) = 65535 |