
- •История разработки микропроцессоров
- •3.Регистр флагов eflags/flags
- •Сегментная организация памяти
- •Сегментная организация памяти в защищенном режиме
- •Страничная организация памяти
- •Команды передачи данных
- •Двоично-десятичная арифметика
- •2.Команда add
- •Команда sar
- •Команда shr
- •Особые случаи
- •Округления
Двоично-десятичная арифметика
Понятие упакованного и неупакованного числа.
Упакованное число: в регистре al содержатся два разряда десятичного числа. Например al= 0100 1001. Число в каждой тетраде al не должно превышать 9.
Регистр ax
ah al
<= 9 <= 9 <= 9

Неупакованное число: в младшей тетраде регистра ah содержится старший разряд десятичного числа, а в младшей тетраде регистра al содержится млаший разряд десятичного числа. Числа в каждой тетраде не должны превышать 9.
ah al
<= 9 <= 9
1. Действия над упакованными числами. Упакованным в смысле двоично-десятичного (ДД) формата считается число, в каждой тетраде которого нет запрещенных комбинаций, то есть чисел> 9 (1001)/ 1) daa – двоично-десятичная коррекция (ДДК) после сложения. Эта команда выполняется сразу после add или adc или inc. В регистре al должна находиться сумма двух упакованных двоично-десятичных чисел. Командой daa в al записывается упакованное двоично-десятичное число, которое должно было стать результатом сложения.
Команда daa выполняет следующие действия: 1) Если младшие 4 бита al больше 9 или AF=1, то al увеличивается на 6 и AF устанавливается в 1 2) Иначе число не меняется AF устанавливается в 0
Пример Пусть в результате выполнения одной из операций add или adc или inc al=1100 (12h). Команда daa добавляет 0110, получаем 0010 (02h) и флаг AF=1, то есть получаем упакованное число 12.
Пусть Пусть в результате выполнения одной из операций add или adc или inc al=0010 и флаг AF=1. Команда daa добавляет 0110, получаем 1000 и флаг остается AF=1, то есть упакованное число 18
Пример 2 al=25, bl=68
add al,bl al=93= 5Dh = 0101 1101
daa - al= 0101 1101+0000 0110= 0110 0011 – упакованное число 63h
3)
Если теперь старшие 4 бита al больше 9 или
CF=1,
то al увеличивается на 60h и CF
устанавливается в 1
4) Иначе CF
устанавливается в 0
Флаги
AF
и CF
устанавливаются, если в ходе коррекции
происходил перенос из первой или второй
цифры.
2)das
– ДДК после вычитания. Если эта команда
выполняется сразу после sub
или sbb
или dec
и в регистре al находится разность двух
упакованных двоично-десятичных чисел,
то в al записывается упакованное
двоично-десятичное число, которое должно
было стать результатом вычитания.
Команда das
выполняет следующие действия:
1)
Если младшие 4 бита al больше 9 или AF=1,
то al уменьшается на 6; и AF
устанавливается в 1
2) Иначе AF
устанавливается в 0
3) Если теперь
старшие 4 бита al больше 9 или CF=1,
то al уменьшается на 60h и CF
устанавливается в 1
Например, если al=20h=0010 0000, то после последовательности команд: dec al= 1Fh= 0001 1111;
После das; регистр al=0001 1111 -0000 0110 = 0001 1001 = 19h (а не 1Fh). 4) Иначе CF устанавливается в 0
Это
можно опустить
Флаги
AF и CF устанавливаются, если в ходе
коррекции происходил заём из первой
или второй цифры. ZF, SF и PF устанавливаются
в соответствии с результатом. Флаг OF не
определён Известный пример необычного
применения das
– преобразование шестнадцатеричной
цифры в ASCII-код соответствующего символа:
cmp
al, 10; sbb
al, 69; das;
2.Действия над неупакованными числами.
Неупакованное представление двоично-десятичных чисел обычно соответствует представлению ASCII-формата. Такое представление позволяет осуществить четыре арифметических операции. По существу корректируется только младшая тетрада!
Сложение в данном формате осуществляется в два этапа: сначала производится обычное сложение двоичных чисел с получением промежуточного результата в регистре AL, а затем производится коррекция этого результата при помощи команды AAA. Коррекция сложения включает в себя следующие шаги:
если младшая тетрада регистра AL содержит допустимое значение и флаг AF=0, то перейти к шагу 3;
если младшая тетрада регистра AL содержит запрещенную комбинацию или флаг AF=1, то необходимо прибавить 06 к содержимому регистра AL, прибавить 1 к содержимому регистра AH и установить AF=1;
сбросить старшую тетраду регистра AL в 0;
установить флаг CF в то же состояние, в каком находится флаг AF.
Для коррекции результата двоичного вычитания, полученного при помощи команды SUB, который должен находиться в регистре AL, используется команда коррекции для вычитания AAS, которая реализует следующий алгоритм:
если младшая тетрада регистра AL содержит допустимую комбинацию и флаг AF=0, то перейти к шагу 3;
если младшая тетрада регистра AL содержит запрещенную комбинацию или AF=1, то необходимо вычесть 06 из содержимого регистра AL, вычесть 1 из содержимого регистра AH и установить флаг AF=1;
сбросить старшую тетраду регистра AL;
установить флаг CF в такое же состояние, в каком находится флаг AF.
aaa – корректирует сумму двух неупакованных ДД-чисел в al. Если коррекция приводит к десятичному переносу, ah увеличивается на 1. Например, если при сложении 05 и 06 в ax окажется число 000Bh, то команда aaa скорректирует его в. 0000 1011+0000 0110= 0001 0001 =0101h
AF=CF=1, если произошёл перенос из al в ah, иначе AF=CF=0. Значения ZF, SF, OF, PF не определены
Пример ax=0535h, bl=39h, add al,bl al = 0011 0101, bl= 0011 1001 После add al= 0110 1110 = 6Eh. После aaa Младшая тетрада al= 1110 +0110= 0100 AF=CF=1,
4)aas
– корректирует разность двух неупакованных
BCD-чисел в al. Если операция приводит к
заёму, ah уменьшается на 1. AF=CF=1,
если произошёл заём из al в ah, иначе
AF=CF=0.
Значения ZF,
SF, PF, OF
не определены
Пример al=38h sub al,35h al=3 AF=CF=0
5)aam
– корректирует результат умножения
неупакованных ДД-чисел, который находится
в ax после выполнения команды mul.
Пример:
mov
al, 5; mov
bl, 5; mul
bl; aam;
После этого ax=0205h, а не 0019h.
то есть команда
AAM
разделила число 25 на 10, частное поместила
в ah,
а остаток – в al.
Умножение неупакованных десятичных чисел выполняется в два этапа:
умножение одноразрядных сомножителей, представленных байтами, в которых младшие тетрады содержат десятичные цифры, а старшие тетрады нулевые. Умножение выполняется командой MUL, которая формирует в регистре AL двоичное произведение;
команда коррекции для умножения AAM преобразует полученный результат в двухбайтное произведение, находящееся в регистрах AH (старший разряд) и AL (младший разряд). Младшие тетрады содержат в обоих байтах цифры произведения, а старшие – нулевые.
Команда AAM осуществляет деление содержимого регистра AL на десять и загружает частное в регистр AH, а остаток – в регистр AL.
Флаги ZF, SF, PF устанавливаются в соответствии с результатом. CF, OF, AF не определены
Другой пример al=07h, bl=09h, mul bl, bl=0011 1111=3Fh (63) ax=0603, то есть команда AAM разделила число 63 на 10, частное поместила в ah, а остаток – в al.
6)aad
– корректирует неупакованное BCD-число
в ax
перед
делением.
Неупакованное представление десятичных чисел позволяет выполнять и операцию деления, однако эта операция отличается от описанных тем, что необходимая коррекция производится до операции собственно деления. В двухбайтной команде коррекции деления AAD предполагается, что в регистрах AH и AL находится двухразрядное делимое, причем регистр AH содержит цифру десятков, регистр AL - цифру единиц, и обе старшие тетрады – нулевые.
Двухбайтной командой AAD выполняются следующие действия:
содержимое регистра AH умножается на десять;
полученный результат прибавляется к содержимому регистра AL;
содержимое регистра AH сбрасывается.
Собственно деление полученного в регистре AX делимого на одноразрядный делитель осуществляется командой DIV.
Пример: mov ax, 0205h; mov bl, 5; aad; div bl; После этого ax=0005.
После aad в AL =25 ((AHх10)+ AL)
Команда aad как и aam, может использоваться не только для десятичных чисел.
. Флаги ZF, SF, PF устанавливаются в соответствии с результатом. CF, OF, AF не определены
Следует
понять, что коррекция выполняется после
действия (кроме деления).
То есть мы выполняем сначала нужное
арифметическое действие как будто бы
над двоичными числами, а затем корректируем.
Но если выполняется деление, то коррекция
должна быть произведена перед делением
Тестирование флагов
1.Тестирование правильности формирования флагов является одной из частей тестирования микропроцессора (МП) на архитектурном уровне. Тестирование МП – это процесс выполнения микропроцессором команд некоторой тестовой программы с целью обнаружения неисправностей. Тестирование МП строится на основании разработанной модели неисправностей.
Данный проект посвящен тестированию правильности формирования флагов, т.е. правильности формирования и модификации флаговых признаков при выполнении всех команд, которые осуществляют такое формирование и модификацию . Для синтеза тестов контроля используется метод исчерпывающего тестирования, при котором для каждой команды, проверяется правильность обработки всех возможных комбинаций флагов.
Поскольку всего имеется 6 флагов (флаг переноса CF, флаг четности результата PF, флаг нулевого результата ZF – шестой разряд, флаг знака SF –седьмой разряд, флаг переполнения OF –и флаг AF переноса в 4-ый разряд (для работы с десятичными числами), то возможны 2^6=64 различных комбинаций этих флагов. Для того, чтобы уменьшить количество тестов необходимо проанализировать возможные (достижимые) комбинации флагов, а также комбинации, которые являются специфическими для отдельных команд.
Регистр флагов
Разряды Регистра EFLAGS |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Флаги |
|
|
|
|
OF |
|
|
|
SF |
ZF |
|
AF |
|
PF |
|
CF |
Поскольку в дальнейшем мы будем пользоваться маской флаговых признаков, то в соответствии с указываемыми комбинациями флагов и их расположением маска указывается шестнадцатеричным числом, Образуем из представления регистров флагов маски флагов, выделив для этого единицами разряды для соответствующих флагов.
Маски флагов.
CF 0001, PF – 0004, AF -0010, ZF – 0040, SF-0080, OF-0800
Некоторые комбинации флагов выразятся следующими масками CF и PF- 0005, ZF и OF 0840 и так далее. Если используются все флаги, то такая комбинация будет обозначаться числом 08D5
В первую очередь необходимо отметить, что из 6 перечисленных выше флагов один флаг AF формируется независимо от других, и поэтому тесты с этим флагом можно просто добавить к тестам с имеющимися комбинациями. Таким образом первоначально мы будем рассматривать 2^5=32 комбинации флагов. Эти комбинации представлены в таблице 1.
Таблица 1 Возможные комбинации флагов CF, OF, SF, ZF и PF
|
|
C |
O |
S |
Z |
P |
|
|
|
C |
O |
S |
Z |
P |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
|
|
16 |
1 |
0 |
0 |
0 |
0 |
|
|
1 |
0 |
0 |
0 |
0 |
1 |
|
|
17 |
1 |
0 |
0 |
0 |
1 |
|
1- |
2 |
0 |
0 |
0 |
1 |
0 |
|
1- |
18 |
1 |
0 |
0 |
1 |
0 |
|
|
3 |
0 |
0 |
0 |
1 |
1 |
|
|
19 |
1 |
0 |
0 |
1 |
1 |
|
|
4 |
0 |
0 |
1 |
0 |
0 |
|
|
20 |
1 |
0 |
1 |
0 |
0 |
|
|
5 |
0 |
0 |
1 |
0 |
1 |
|
|
21 |
1 |
0 |
1 |
0 |
1 |
|
1- |
6 |
0 |
0 |
1 |
1 |
0 |
-2 |
1- |
22 |
1 |
0 |
1 |
1 |
0 |
-2 |
|
7 |
0 |
0 |
1 |
1 |
1 |
-2 |
|
23 |
1 |
0 |
1 |
1 |
1 |
-2 |
|
8 |
0 |
1 |
0 |
0 |
0 |
|
|
24 |
1 |
1 |
0 |
0 |
0 |
|
|
9 |
0 |
1 |
0 |
0 |
1 |
|
|
25 |
1 |
1 |
0 |
0 |
1 |
|
1- |
10 |
0 |
1 |
0 |
1 |
0 |
|
1- |
26 |
1 |
1 |
0 |
1 |
0 |
|
|
11 |
0 |
1 |
0 |
1 |
1 |
|
|
27 |
1 |
1 |
0 |
1 |
1 |
|
|
12 |
0 |
1 |
1 |
0 |
0 |
|
|
28 |
1 |
1 |
1 |
0 |
0 |
|
|
13 |
0 |
1 |
1 |
0 |
1 |
|
|
29 |
1 |
1 |
1 |
0 |
1 |
|
1- |
14 |
0 |
1 |
1 |
1 |
0 |
-2 |
1- |
30 |
1 |
1 |
1 |
1 |
0 |
-2 |
|
15 |
0 |
1 |
1 |
1 |
1 |
-2 |
|
31 |
1 |
1 |
1 |
1 |
1 |
-2 |
Далее необходимо отметить, что не все 32 комбинации возможны. Это обусловлено 2 причинами и первая причина связана с тем, что в случае нулевого значения операнда, т.е. если ZF=1, флаг четности PF не может иметь значение, равное 0, и , таким образом комбинация ZF=1 и PF=0 является запрещенной.
Удаляем строки с номерами, имеющими в последних 2-х разрядах 10: 2,6,10,14,18,22,26,30 – всего 8 строк . Остается 24 строки..
Таблица 2
|
|
C |
O |
S |
Z |
P |
|
|
|
C |
O |
S |
Z |
P |
|
|
0 |
0 |
0 |
0 |
0 |
0 |
|
|
16 |
1 |
0 |
0 |
0 |
0 |
|
|
1 |
0 |
0 |
0 |
0 |
1 |
|
|
17 |
1 |
0 |
0 |
0 |
1 |
|
1- |
3 |
0 |
0 |
0 |
1 |
1 |
|
1- |
19 |
1 |
0 |
0 |
1 |
1 |
|
|
4 |
0 |
0 |
1 |
0 |
0 |
|
|
20 |
1 |
0 |
1 |
0 |
0 |
|
|
5 |
0 |
0 |
1 |
0 |
1 |
|
|
21 |
1 |
0 |
1 |
0 |
1 |
|
|
7 |
0 |
0 |
1 |
1 |
1 |
|
|
23 |
1 |
0 |
1 |
1 |
1 |
|
1- |
8 |
0 |
1 |
0 |
0 |
0 |
-2 |
1- |
24 |
1 |
1 |
0 |
0 |
0 |
-2 |
|
9 |
0 |
1 |
0 |
0 |
1 |
-2 |
|
25 |
1 |
1 |
0 |
0 |
1 |
-2 |
|
11 |
0 |
1 |
0 |
1 |
1 |
|
|
27 |
1 |
1 |
0 |
1 |
1 |
|
|
12 |
0 |
1 |
1 |
0 |
0 |
|
|
28 |
1 |
1 |
1 |
0 |
0 |
|
1- |
13 |
0 |
1 |
1 |
0 |
1 |
|
1- |
29 |
1 |
1 |
1 |
0 |
1 |
|
|
15 |
0 |
1 |
1 |
1 |
1 |
|
|
31 |
1 |
1 |
1 |
1 |
1 |
|
Во втором случае если имеется признак знакового разряда, т.е. SF=1 (а это означает , что старший разряд операнда равен 1), то в этом случае операнд не может быть равен 0, т.е. ZF не может иметь значение равное 1. Запрещенные комбинации – 1и 2-ой разряды номера не могут иметь значение 11. Это строки номер 7,15,23,31
Если мы уберем из всех рассматриваемых комбинаций запрещенные, то останется 20 разрешенных комбинаций, которые представлены в таблице 3. Дальнейшее сокращение комбинаций флагов производится при анализе отдельных групп команд.
Таблица 3 Допустимые комбинации флагов CF, OF, SF, ZF и PF
|
C |
O |
S |
Z |
P |
|
|
C |
O |
S |
Z |
P |
0 |
0 |
0 |
0 |
0 |
0 |
|
16 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
|
17 |
1 |
0 |
0 |
0 |
1 |
3 |
0 |
0 |
0 |
1 |
1 |
|
19 |
1 |
0 |
0 |
1 |
1 |
4 |
0 |
0 |
1 |
0 |
0 |
|
20 |
1 |
0 |
1 |
0 |
0 |
5 |
0 |
0 |
1 |
0 |
1 |
|
21 |
1 |
0 |
1 |
0 |
1 |
8 |
0 |
1 |
0 |
0 |
0 |
|
24 |
1 |
1 |
0 |
0 |
0 |
9 |
0 |
1 |
0 |
0 |
1 |
|
25 |
1 |
1 |
0 |
0 |
1 |
11 |
0 |
1 |
0 |
1 |
1 |
|
27 |
1 |
1 |
0 |
1 |
1 |
12 |
0 |
1 |
1 |
0 |
0 |
|
28 |
1 |
1 |
1 |
0 |
0 |
13 |
0 |
1 |
1 |
0 |
1 |
|
29 |
1 |
1 |
1 |
0 |
1 |
Напомним, что к этим комбинациям нужно просто добавить флаг AF, который формируется независимо от других флагов. Далее мы рассмотрим, какие комбинации флагов возможны (достижимы) для каждой конкретной команды.
Таблицу 3 можно рассматривать как модель работы микропроцессора в части формирования флагов. Она является исходной моделью для любой из рассматриваемой далее команд.