Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП Арифметика ТЕОРИЯ_v4 2012-весна.doc
Скачиваний:
12
Добавлен:
04.09.2019
Размер:
752.13 Кб
Скачать

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