КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Вычитание неупакованных BCD-чисел
Сложение неупакованных BCD-чисел Арифметические действия над неупакованными BCD-числами Рассмотрим два случая сложения.
Пример Результат сложения не больше 9 6 = 0000 0110 + 3 = 0000 0011 = 9 = 0000 1001 Переноса из младшей тетрады в старшую нет. Результат правильный.
Пример Результат сложения больше 9: 06 = 0000 0110 + 07 = 0000 0111 = 13 = 0000 1101 Мы получили уже не BCD-число. Результат неправильный. Правильный результат в неупакованном BCD-формате должен быть таким: 0000 0001 0000 0011 в двоичном представлении (или 13 в десятичном). Проанализировав данную проблему при сложении BCD-чисел (и подобные проблемы при выполнении других арифметических действий) и возможные пути ее решения, разработчики системы команд микропроцессора решили не вводить специальные команды для работы с BCD-числами, а ввести несколько корректировочных команд. Назначение этих команд – в корректировке результата работы обычных арифметических команд для случаев, когда операнды в них являются BCD-числами. В случае вычитания в примере 10 видно, что полученный результат нужно корректировать. Для коррекции операции сложения двух однозначных неупакованных BCD-чисел в системе команд микропроцессора существует специальная команда – ааа (ASCII Adjust for Addition) – коррекция результата сложения для представления в символьном виде. Эта команда не имеет операндов. Она работает неявно только с регистром al и анализирует значение его младшей тетрады: 1) если это значение меньше 9, то флаг cf сбрасывается в О и осуществляется переход к следующей команде; 2) если это значение больше 9, то выполняются следующие действия: а) к содержимому младшей тетрады al (но не к содержимому всего регистра!) прибавляется 6, тем самым значение десятичного результата корректируется в правильную сторону; б) флаг cf устанавливается в 1, тем самым фиксируется перенос в старший разряд, для того чтобы его можно было учесть в последующих действиях. Так, в примере 10, предполагая, что значение суммы 0000 1101 находится в al, после команды ааа в регистре будет 1101 + 0110 = 0011, т. е. двоичное 0000 0011 или десятичное 3, а флаг cf установится в 1, т. е. перенос запомнился в микропроцессоре. Далее программисту нужно будет использовать команду сложения adc, которая учтет перенос из предыдущего разряда.
Ситуация здесь вполне аналогична сложению. Рассмотрим те же случаи.
Пример Результат вычитания не больше 9: 6 = 0000 0110 - 3 = 0000 0011 = 3 = 0000 0011 Как видим, заема из старшей тетрады нет. Результат верный и корректировки не требует.
Пример Результат вычитания больше 9: 6 = 0000 0110 - 7 = 0000 0111 = -1 = 1111 1111
Вычитание проводится по правилам двоичной арифметики. Поэтому результат не является BCD-числом. Правильный результат в неупакованном BCD-формате должен быть 9 (0000 1001 в двоичной системе счисления). При этом предполагается заем из старшего разряда, как при обычной команде вычитания, т. е. в случае с BCD числами фактически должно быть выполнено вычитание 16 – 7. Таким образом, видно: как и в случае сложения, результат вычитания нужно корректировать. Для этого существует специальная команда – aas (ASCII Adjust for Substraction) – коррекция результата вычитания для представления в символьном виде. Команда aas также не имеет операндов и работает с регистром al, анализируя его младшую тетраду следующим образом: 1) если ее значение меньше 9, то флаг cf сбрасывается в 0 и управление передается следующей команде; 2) если значение тетрады в al больше 9, то команда aas выполняет следующие действия: а) из содержимого младшей тетрады регистра al (заметьте – не из содержимого всего регистра) вычитает 6; б) обнуляет старшую тетраду регистра al; в) устанавливает флаг cf в 1, тем самым фиксируя воображаемый заем из старшего разряда. Понятно, что команда aas применяется вместе с основными командами вычитания sub и sbb. При этом команду sub есть смысл использовать только один раз, при вычитании самых младших цифр операндов, далее должна применяться команда sbb, которая будет учитывать возможный заем из старшего разряда.
Дата добавления: 2017-01-14; Просмотров: 868; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |