
- •Замковец с.В. Левин н.А. Попкова е.Я. Архитетура микропроцессоров
- •Удк 681.3.06
- •Классификация микропроцессоров по архитектуре
- •Архитектура микропроцессоров 80х86
- •2.1. Используемые типы данных
- •2.2. Регистры микропроцессоров
- •2.3. Режимы адресации
- •2.4. Управление стеками
- •2.5. Сегментная организация памяти
- •Система команд микропроцессоров
- •3.2.Команды передачи данных
- •Команды двоичной арифметики
- •Команды десятичной арифметики
- •Логические команды
- •Команды сдвигов
- •Команды обработки бит и байт
- •Команды обработки цепочек
- •Команды передачи управления
- •3.9.1. Команды условных переходов
- •3.9.2 Команды безусловных переходов
- •3.9.3 Команды вызова подпрограмм
- •3.9.4 Команды возврата из подпрограмм
- •4. Прерывания
- •4.1. Прерывания в реальном режиме
- •Защита по привилегиям
- •5.1. Определение уровней привилегий
- •Вычисления с плавающей запятой
- •6.1. Форматы чисел с плавающей запятой
- •6.3. Регистры сопроцессора
- •Mmx архитектура
- •7.1. Форматы представления данных
- •7.2. Арифметика с насыщением
- •7.3. Mmx регистры
- •7.4. Система команд mmx
- •1. Классификация микропроцессоров по архитектуре ... 8
- •2. Архитектура микропроцессоров 80х86 ………………...10
Команды десятичной арифметики
Микропроцессоры данного семейства не имеют команд, непосредственно оперирующих упакованными и неупакованными десятичными цифрами. Для выполнения операций над двоично-десятичными цифрами имеется шесть команд, которые выполняют коррекцию, т.е. позволяют правильно осуществлять сложение и вычитание упакованных чисел, а также производят все арифметические действия над неупакованными числами. Эти команды коррекции выполняются после выполнения обычных операций над двоичными числами.
При использовании упакованного формата двоично-десятичного представления, т.е. когда один байт содержит две десятичные цифры, процессор может осуществлять коррекцию для сложения и вычитания.
Сложение для этого случая осуществляется в два этапа: сначала операнды складываются как два двоичных числа, т.е. выполняется команда ADD, при этом необходимо, чтобы результат находился в регистре AL. После этого осуществляется корректировка результата при помощи однобайтной команды DAA десятичной коррекции для сложения. Алгоритм коррекции состоит из двух шагов:
сначала осуществляется коррекция младшей тетрады и для этого осуществляются следующие действия - если младшая тетрада содержит запрещенную для десятичного представления цифры комбинацию (в диапазоне чисел от 10 до 15) или выработался флаг дополнительного переноса AF, то к содержимому AL прибавляется 06;
2) затем аналогичным способом осуществляется корректировка старшей тетрады – если эта тетрада содержит запрещенную комбинацию или выработался флаг переноса CF, то к содержимому AL прибавляется 60.
Вычитание упакованных чисел также осуществляется в два этапа: сначала осуществляется обычное вычитание двух операндов при помощи команды SBB, при этом необходимо, чтобы результат располагался в регистре AL. После этого осуществляется корректировка полученного результата при помощи однобайтной команды DAS десятичной коррекции для вычитания. Аналогично коррекции сложения коррекция вычитания осуществляется за два шага следующим образом:
если младшая тетрада регистра AL содержит запрещенную комбинацию или установлен флаг дополнительного переноса AF, то из содержимого AL вычитается 06, после чего осуществляется корректировка старшей тетрады;
если старшая тетрада содержит запрещенную комбинацию или установлен флаг переноса CF, то из содержимого регистра AL вычитается 60.
Неупакованное представление двоично-десятичных чисел обычно соответствует представлению ASCII-формата. Такое представление позволяет осуществить четыре арифметических операции.
Сложение в данном формате осуществляется в два этапа: сначала производится обычное сложение двоичных чисел с получением промежуточного результата в регистре AL, а затем производится коррекция этого результата при помощи команды AAA. Коррекция сложения включает в себя следующие шаги:
если младшая тетрада регистра AL содержит допустимое значение и флаг AF=0, то перейти к шагу 3;
если младшая тетрада регистра AL содержит запрещенную комбинацию или флаг AF=1, то необходимо прибавить 06 к содержимому регистра AL, прибавить 1 к содержимому регистра AH и установить AF=1;
сбросить старшую тетраду регистра AL;
установить флаг CF в то же состояние, в каком находится флаг AF.
Для коррекции результата двоичного вычитания, полученного при помощи команды SUB, который должен находиться в регистре AL, используется команда коррекции для вычитания AAS, которая реализует следующий алгоритм:
если младшая тетрада регистра AL содержит допустимую комбинацию и флаг AF=0, то перейти к шагу 3;
если младшая тетрада регистра AL содержит запрещенную комбинацию или AF=1, то необходимо вычесть 06 из содержимого регистра AL, вычесть 1 из содержимого регистра AH и установить флаг AF=1;
сбросить старшую тетраду регистра AL;
установить флаг CF в такое же состояние, в каком находится флаг AF.
Умножение неупакованных десятичных чисел выполняется в два этапа:
умножение одноразрядных сомножителей, представленных байтами, в которых младшие тетрады содержат десятичные цифры, а старшие тетрады нулевые. Умножение выполняется командой MUL, которая формирует в регистре AL двоичное произведение;
двухбайтная команда коррекции для умножения AAM преобразует полученный результат в двухбайтное произведение, находящееся в регистрах AH (старший разряд) и AL (младший разряд). Младшие тетрады содержат в обоих байтах цифры произведения, а старшие – нулевые.
Команда AAM осуществляет деление содержимого регистра AL на десять и загружает частное в регистр AH, а остаток – в регистр AL.
Неупакованное представление десятичных чисел позволяет выполнять и операцию деления, однако эта операция отличается от описанных тем, что необходимая коррекция производится до операции собственно деления. В двухбайтной команде коррекции деления AAD предполагается, что в регистрах AH и AL находится двухразрядное делимое, причем регистр AH содержит цифру десятков, регистр AL - цифру единиц, и обе старшие тетрады – нулевые.
Двухбайтной командой AAD выполняются следующие действия:
содержимое регистра AH умножается на десять;
полученный результат прибавляется к содержимому регистра AL;
содержимое регистра AH сбрасывается.
Собственно деление полученного в регистре AX делимого на одноразрядный делитель осуществляется командой DIV.