Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы по информатике.docx
Скачиваний:
68
Добавлен:
10.05.2015
Размер:
150.08 Кб
Скачать

2.Команда add

Рассмотрим возможные комбинации старших разрядов обоих операндов, участвующих при сложении, а также значение переноса, который возникает в старший разряд:

Примечание. Флаг О возникает в двух случаях

  1. если есть перенос в старший разряд, но нет переноса из старшего разряда,

  2. если нет переноса в старший разряд, но есть перенос из старшего разряда

Поясним это на примере. Пусть два старших разряда имеют значения 11 и перенос в старший разряд равен 0. То есть это попадает под определение 2. Пусть два старших разряда имеют значения 10 и перенос в старший разряд равен 1. Это не попадает ни под одно определение, так как имеем перенос в старший разряд, но также возникает перенос из старшего разряда.

В следующей таблице приведены все комбинации старших разрядов 2-х операнд и переноса в старший разряд – 23 = 8 комбинаций.

1-ый операнд

0

0

0

0

1

1

1

1

2-ой операнд

0

0

1

1

0

0

1

1

перенос

0

1

0

1

0

1

0

1

флаг SF

0

1

1

0

1

0

0

1

флаг OF

0

1

0

0

0

0

1

0

флаг CF

0

0

0

1

0

1

1

1

№ теста

1

2

3

4

5

6

7

8

Эквивалентные

тесты

3 и 5 4 и 6

Пояснение. Эквивалентные тесты получаются при

  1. Класс эквивалентности: 1-ый оп.-= 0, 2-ой оп.= 1, перенос =0 и 1-ый оп.-= 1, 2-ой оп.= 0, перенос =0

  1. Класс эквивалентности: 1-ый оп.-= 0, 2-ой оп.= 1, перенос =1 и 1-ый оп.-= 1, 2-ой оп.= 0, перенос =1

Остаются тесты 1,2,3,4,7,8

Таким образом можно увидеть, что из этих трех разрядов можно составить только 6 возможных комбинаций из флагов SF, OF и CF , а не 23=8, а комбинации

CF=0, OF=1, SF=0 и

СF=1, OF=1, SF=1 являются недостижимыми.

То есть не может быть только флаг OF без других флагов, так как при наличии только переноса будет еще и флаг SF и не может быть всех трех флагов, так как в этом случае имеется и перенос из старшего разряда и перенос в старший разряд.

Тогда из таблицы 3 для команды ADD следует исключить две комбинации CF=0, OF=1, SF=0 и СF=1, OF=1, SF=1 как недостижимые. Для команды ADD мы получаем следующие 14 возможных комбинаций флагов (таблица 4, полученная из таблицы 3).

Строки, подлежащие удалению: 8,9,11,28,29.

Таблица 4. Флаги, проверяемые для команды ADD

C

O

S

Z

P

Маски флагов

0

0

0

0

0

0

0000

1

0

0

0

0

1

0004

3

0

0

0

1

1

0044

4

0

0

1

0

0

0080

5

0

0

1

0

1

0084

12

0

1

1

0

0

0880

16

1

0

0

0

0

0001

17

1

0

0

0

1

0005

19

1

0

0

1

1

0045

20

1

0

1

0

0

0081

21

1

0

1

0

1

0085

24

1

1

0

0

0

0801

25

1

1

0

0

1

0805

27

1

1

0

1

1

0845

Осталось 14 строк!

Команды ADC

Эта команда отличается от ADD тем, что перед выполнением операции из младшей позиции поступает флаг CF. Иначе работа этой команды ничем не отличается от ADD. Флаги ZF и PF (маска 0044) при равенстве результата 0 могут выработаться при поступлении флаг CF=1 из младшей позиции только если результат операции FF, но тогда вырабатывается флаг CF и строка 3 (маска 0044) в таблице для ADD недостижима для команды ADC.

C

O

S

Z

P

Маски флагов:

0

0

0

0

0

0

0000

1

0

0

0

0

1

=0004

4

0

0

1

0

0

=0080

5

0

0

1

0

1

=0084

12

0

1

1

0

0

=0880

16

1

0

0

0

0

=0001

17

1

0

0

0

1

=0005

19

1

0

0

1

1

=0045

20

1

0

1

0

0

=0081

21

1

0

1

0

1

=0085

24

1

1

0

0

0

=0801

25

1

1

0

0

1

=0805

27

1

1

0

1

1

=0845

Нулевой результат можно получить при сложении двух чисел 80h и 80h. В этом случае возникает перенос из старшего разряда, но нет переноса из младшего разряда, то есть флаг

Также для команды ADC невозможно получить комбинацию флагов 845, поскольку такую маску можно получить единственно возможным способом – складывая операнды 80 и 80 (в этом случае получается результат, равный 0 (формируется флаг нулевого результата ZF=1, флаг четности PF=1, флаг переноса CF=1 и флаг признака переполнения OF=1). Если же для команды ADC для получения нулевого результата использовать операнды 80 и 7F, то не будет сформирован флаг переполнения OF.

имеются следующие ограничения. Маску, равную 044 (ZF и

PF) (т.е. результат сложения равен 0) для команды ADD можно получить единственным способом, когда оба операнда равны 0, а так как для команды ADC мы всегда предполагаем значение флага CF равное 1 (до выполнения команды), то нулевой результат можно получить, если оба операнда в сумме дают FF (для 8-разрядных операндов), но в этом случае вырабатывается флаг переноса CF, и, следовательно, маску 044 для команды ADC получить нельзя. В таблице 3 для команды ADC недостижимые комбинации – это маски 0044( 3-я строка табл.3) и 0845

Таблица 5 Разрешенные комбинации флагов для команд ADD и ADC

C

O

S

Z

P

Маски флагов:

0

0

0

0

0

0

0000

1

0

0

0

0

1

=0004

3

0

0

0

1

1

=0044 не для ADC

4

0

0

1

0

0

=0080

5

0

0

1

0

1

=0084

12

0

1

1

0

0

=0880

16

1

0

0

0

0

=0001

17

1

0

0

0

1

=0005

19

1

0

0

1

1

=0045

20

1

0

1

0

0

=0081

21

1

0

1

0

1

=0085

24

1

1

0

0

0

=0801

25

1

1

0

0

1

=0805

27

1

1

0

1

1

=0845 не для ADC

Также для команды ADC невозможно получить комбинацию флагов 845, поскольку такую маску можно получить единственно возможным способом – складывая операнды 80 и 80 (в этом случае получается результат, равный 0 (формируется флаг нулевого результата ZF=1, флаг четности PF=1, флаг переноса CF=1 и флаг признака переполнения OF=1). Если же для команды ADC для получения нулевого результата использовать операнды 80 и 7F, то не будет сформирован флаг переполнения OF.

Теперь рассмотрим возможные маски флагов для команды ADD с учетом флага десятичного переноса AF. Как уже было сказано выше в виду отдельного формирования этого флага для каждой комбинации, указанной в таблице 3, имеются две возможности для синтеза тестов – с флагом AF равным 0 и 1.

Соответственно для каждой маски из таблицы можно получить вторую маску с установленным флагом AF=1. Таким образом, для команды ADD каждого кода операции сложения всего имеется 14х2=28 комбинаций. Имеется в виду, что в таблице 4 отсутствие флага AF означает, что он равен 0. Для команды ADC число комбинаций равно 12х2 = 24.

Теперь можно уточнить, каким образом мы собираемся тестировать флаги. В табл. 4 и 5 мы определили комбинации флагов и мы теперь стремимся создать такие тесты, чтобы каждый из них по возможности проверял всю комбинацию представленную в каждой строке.

Например, для строки 25 надо подобрать такие 2 операнда, чтобы вырабатывались флаги CF,OF,SF,ZF,PF и AF (Маска – 0000 1000 1101 0101 (OF,SF,ZF,AF,PF,CF- 08D5)

Теперь рассмотрим вопрос, какие операнды используются для формирования каждой маски (здесь мы приводим примеры только для 8-разрядных операндов).

Примеры тестов флагов на команде ADD

1.Маски 0080 и 0090 – то есть флаги SF и SF,AF

a0+27 - 1010 0000+0010 0111 флаг SF – 1 в разряде 7

0b+89 - 00001011 +1000 1001 флаги SFи AF– 1 в разряде 7 и перенос в разряд 4

2.Маски 805 и 815 – то есть флаги OF,PF и CF(805) и флаги OF,AF,PF и CF(815)

82+84 - 1000 0010 + 1000 0100 – 0000 0110 – перенос из старшего разряда - CF и нет переноса в старший разряд – OF, сумма разрядов четная – PF

89+CC – 1000 1001 + 1100 1100 = 0101 0101- перенос из старшего разряда - CF и нет переноса в старший разряд – OF, сумма разрядов четная – PF есть перенос в 4-ый разряд - AF

Команда вычитания SUB

Рассмотрим возможные комбинации старших разрядов обоих операндов, участвующих в вычитании, а также значение заема в старшем разряде и из старшего разряда.

Флаг О возникает в двух случаях

1.Если есть заем в старшем разряде и нет заема из старшего разряда. (уменьшаемое 10, вычитаемое 01)

2.Если нет заема в старшем разряде, и есть заем из старшего разряда (уменьшаемое 00, вычитаемое 10)

Уменьшаемое

0

0

0

0

1

1

1

1

Вычитаемое

0

0

1

1

0

0

1

1

Заем из старшего разряда

0

1

0

1

0

1

0

1

флаг OF

0

0

1

0

0

1

0

0

флаг SF

0

1

1

0

1

0

0

1

флаг CF

0

1

1

1

0

0

0

1

№ теста

1

2

3

4

5

6

7

8

Эквивалентные

тесты

1 и 7 2 и 8

Команда SUB(Продолжение)

Кроме того, команда вычитания имеет дополнительное ограничение на комбинации флагов. Нулевой результат для команды SUB, при котором флаги ZF= PF=1, получается, если уменьшаемое и вычитаемое равны, однако в этом случае флаги CF=OF=0, и поэтому среди масок, имеющих значение флага ZF=1 и PF=1, не должно быть бит, соответствующих флагам CF и OF, Теперь из основной таблицы надо удалить строки с недостижимыми комбинациями CF=0, OF=1, SF=1(строки 12,13) и CF=1, OF=1, SF=0(строки 24,25,27) CF=0, OF=0, ZF=1 – строки 3,11,19

№№ строк

C

O

S

Z

P

Маски флагов

0

0

0

0

0

0

0000

1

0

0

0

0

1

0004

4

0

0

1

0

0

0080

5

0

0

1

0

1

0084

8

0

1

0

0

0

0800

9

0

1

0

0

1

0804

16

1

0

0

0

0

0001

17

1

0

0

0

1

0005

20

1

0

1

0

0

0009

21

1

0

1

0

1

000D

28

1

1

1

0

0

0881

29

1

1

1

0

1

0885

Осталось 12 строк!

Аналогично командам сложения к указанным маскам необходимо добавить комбинации с различными значениями флага AF.

Команда NEG - изменение знака числа (вычитает из 0 число )

Флаг OF равен 1 только тогда, когда заема нет в старшем разряде, а только заем из старшего разряда. (00 -10) . Так как при заеме в старшем разряде и отсутствии заема из старшего разряда (00 – 01) происходит и заем в старшем разряде и заем из старшего разряда.

Уменьшаемое

0

0

0

0

Вычитаемое

0

0

1

1

Заем в старшем разряде

0

1

0

1

флаг OF

0

0

1

0

флаг SF

0

1

1

0

флаг CF

0

1

1

1

№ теста

1

2

3

4

Достижимые комбинации CF, OF, SF - 000, 101, 100, 111,

Недостижимые комбинации 001,010,011, 110

Исключаем следующие строки из основной таблицы

001 - строки 4,5 010 - строки 8,9,11

011 - строки 12,13 110 строки 24,25,27

Кроме того, при равенстве операнда 0 флаги ZF=1 CF=0, а при неравенствеоперанда0флаги ZF=0 CF=1. То есть флаги ZF и CF не могут принимать одинаковые значения.

Команда NEG (Продолжение)

C

O

S

Z

P

Маски флагов

1

0

0

0

0

1

0004

3

0

0

0

1

1

0044

11

0

1

0

1

1

0844

16

1

0

0

0

0

0001

17

1

0

0

0

1

0005

20

1

0

1

0

0

0081

21

1

0

1

0

1

0085

28

1

1

1

0

0

0881

29

1

1

1

0

1

0885

Команды сдвигов

Различаются логические сдвиги и арифметические вправо и влево. При логических сдвигах знаковый разряд не отличается от других разрядов. При арифметических сдвигах знаковый разряд сохраняет свое значение.

Сдвиги влево – SHL– логический ,SAL–арифметический. Выполнение этих

команд идентично

С

0 (заполнение свободных разрядов)

Посмотрим что происходит при сдвиге влево на 1.

Бит 7 Бит 6 CF OF SF

-------------------------------------------

0 0 0 0 0

0 1 0 1 1 - изменилось значение старшего бита

1 0 1 1 0 - изменилось значение старшего бита

1 1 1 0 1

Недостижимые комбинации флагов CFOFSF001 (4,5 строки) , 010(8,9,11 строки), 100 (16,17,19 строки), 111(28,29строки)

Таблица 10 (команда SHLилиSAL)

№№

C

O

S

Z

P

Маски флагов

0

0

0

0

0

0

000

1

0

0

0

0

1

004

3

0

0

0

1

1

044

12

0

1

1

0

0

880

13

0

1

1

0

1

884

20

1

0

1

0

0

081

21

1

0

1

0

1

085

24

1

1

0

0

0

801

25

1

1

0

0

1

805

27

1

1

0

1

1

845