Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ЭВМ и ПУ.doc
Скачиваний:
64
Добавлен:
16.03.2015
Размер:
1.16 Mб
Скачать

2.5.2.4.Команды расширения знака.

CBW преобразует байт в регистре AL в слово в регистре АХ путем расширения знакового бита AL во все биты регистра AH. Команда CWD преобразует слово в регистре АХ в двойное слово , расположенное в паре регистров DX, AX путем расширения знакового бита регистра AX во все биты регистра DX.

Новые команды расширения знака

Начиная с микропроцессора 80386, существуют еще две команды расширения знака CWDE и CDQ. CWDE преобразует слово в расширенное двойное слово путем расширения знакового разряда АХ во все старшие разряды регистра ЕАХ. CDQ преобразует двойное слово в регистре ЕАХ в учетверенное слово в паре регистров EDX, EAX путем расширения знакового разряда ЕАХ во все разряды EDX.

2.5.2.5.Десятичная арифметика.

До сих пор мы рассматривали арифметические операции под двоичными числами, так как компьютеры работают только с двоичными числами, но для людей более привычны десятичные числа. Поэтому возникает проблема преобразования десятичных чисел в двоичные. Можно десятичное число представить в двоичной системе полностью, кодом, например 37 - 00100101, а можно закодировать отдельно каждую цифру 3 и 7 и получить код 0011 0111. Такое двоичное изображение десятичных чисел называется двоично-десятичным кодированием (BCD - кодом). Для выполнения арифметических операций над числами в данном формате потребовалось бы ввести соответствующие команды сложения, вычитания, умножения и деления. Возможен и второй вариант: применить к таким числам команды двоичной арифметики, заранее зная о неправильном результате, а затем выполнить команду коррекции, которая сформирует правильный результат в BCD формате. Именно такой вариант был выбран в процессорах семейства 8086.

Рассмотрим сложение чисел 23 и 14 в BCD формате с помощью двоичного сложения:

0

0

1

0

0

0

1

1

=

25

0

0

0

1

0

1

0

0

=

14

0

0

1

1

0

1

1

1

=

37

Результат правильный, коррекция не нужна

Сложим 29 и 14:

0

0

1

0

1

0

0

1

=

29

0

0

0

1

0

1

0

0

=

14

0

0

1

1

1

1

0

1

=

3?

Ответ неверен, так как код 1101 не соответствует десятичной цифре, требуется коррекция.

Коррекция заключается в том, чтобы добавить 6 к сумме в тех разрядах, где получена запрещённая комбинация, компенсируя этим, 6 запрещённых комбинаций для десятичных чисел (4 разряда - 16 комбинаций, 10 цифр пра­вильных, 6 - лишних).

0

0

1

1

1

1

0

1

=

3?

0

1

1

0

=

06

0

1

0

0

0

0

1

1

=

43

Результат правильный

Более сложная ситуация возникает, когда сумма “проскакивает” запрещённый диапазон и становится допусти­мой цифрой.

Сложим 29 и 18:

0

0

1

0

1

0

0

1

=

29

0

0

0

1

1

0

0

0

=

18

0

1

0

0

0

0

0

1

=

41

Результат неверный, так как младшая цифра проскочила запрещенный диапазон.

При коррекции требуется добавить 6 и получить правильный результат 47. Однако необходимость такой коррекции невозможно определить по самому результату. Признаком “проскока” цифрой запрещённого диапазона служит перенос из соответствующего бита (разряда). В приведённом примере им будет перенос из младшего (десятичного) разряда в старший. Флаг CF показывает, что при сложении возник перенос из старшего бита (разряда), флаг вспомогательного переноса AF предназначен только для регистрации переноса из младшего 10-го разряда, зная который можно осуществить коррекцию. После сложения в нашем примере CF = 0 и AF = 1 (если CF = 1, то при следующем сложении надо учитывать его и сумму).

Десятичную коррекцию сложения осуществляет команда DAA, в которой предполагается, что сумма находится в регистре AL. С учётом содержимого AL и состояний флагов AF и CF команда DAA определяет необходимость коррекции и реализует её для AL.

Аналогично команда DAS корректирует результат после операции вычитания.

Для умножения чисел в формате BCD произвести коррекцию невозможно, так как в результате “замешаны” перекрёстные члены произведения. Аналогично и для команды деления. Следовательно, для умножения и деления необходимо перейти к другому представлению десятичных чисел. BCD формат называется упакованным, а в неупакованном формате байт содержит всего одну десятичную цифру. Она находится в 4-х младших битах, а старшие биты не влияют на значение цифры. Примером такого формата служит код ASCII, в котором символы представлены 8 битами. ASCII-коды десятичных цифр представлены в таблице 2.9.

Таблица 2.9. ASCII-коды десятичных цифр.

Цифра

Код

0

00110000

1

00110001

2

00110010

3

00110011

4

00110100

5

00110101

6

00110110

7

00110111

8

00111000

9

00111001

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

Результаты двоичного сложения и вычитания ASCII-чисел можно скорректировать аналогично коррекции в BCD формате, причём корректируется только младшая цифра. В системе команд микропроцессора существуют специальные команды коррекции:

AAA - ASCII коррекция сложения.

AAS - ASCII коррекция вычитания.

AAM - ASCII коррекция умножения.

AAD - ASCII коррекция деления.

Пример: умножим 9 * 4, 9 - находится в регистре BL, а 4 - в регистре AL.

BL: 00001001 = 9 MUL BL - даёт в AX 16-битный результат, равный 36

AL: 00000100 = 4 36 = 0000 0000 0010 0100

Команда коррекции AAM должна “разложить” результат на 3 (00000011) в регистре AH и 6 в регистре AL. Для этого нужно просто раз делить содержимое AL на 10 и поместить частное в AH, а остаток в AL.

Поэтому команда AAM имеет длину 2 байта, так как второй байт - это представление 10. В рассмотренном примере старшие биты были нулевыми, иначе результат нельзя скорректировать. Поэтому перед умножением неупакованных десятичных чисел следует сбросить четыре старших бита в 0.

Рассмотрим деление неупакованных десятичных чисел, например 42/6. 42 находится в AL (0000 0100 в AH и 0000010 в AL), а 6 (00000110) в BL. Неупакованное представление одноразрядного числа 6 является его двоичным представлением, следовательно, нужно преобразовать 42 в двоичное число. Для этого AH следует умножить на 10 и сложить с содержимым регистра AL. Тогда при делении в AL получится число 7, двоичное представление которого совпадает с неупакованным представлением. Команда коррекции деления имеет свои особенности:

AAD - двухбайтовая команда (второй байт - 10).

Коррекция AAD предшествует делению, а в сложении, вычитании и умножении производится после опера­ции.

Делимое и делитель (множимое и множитель) должны иметь 0 в старших 4-х битах.