ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Упакованные BCD-числаКак уже отмечалось выше, уУпакованные BCD-числа можно только складывать и вычитать. Для выполнения других действий над ними их нужно дополнительно тпеореобриазовывать либо в неупакованный формат, либо в двоичное представление.
1. Сложение Пример 8.13. Сложение упакованных BCD-чисел 67 = 0110 0111 + 75 = 0111 0101 142 = 1101 1100 = 220 Как видим, в двоичном виде результат равен 1101 1100 (или 220 в десятичном представлении), что неверно. Это происходит по той причине, что микропроцессор не подозревает о существовании BCD-чисел и складывает их по правилам сложения двоичных чисел. На самом деле результат в двоично-десятичном виде должен быть равен 0001 0100 0010 (или 142 в десятичном представлении). Читатель видит, что, как и для неупакованных BCD-чисел, для упакованных BCD-чисел существует необходимость как-то корректировать результаты арифметических операций. Микропроцессор предоставляет для этого команду daa: daa (Decimal Adjust for Addition) — коррекция результата сложения для представления в десятичном виде. Команда daa преобразует содержимое регистра al в две упакованные десятичные цифры по алгоритму, приведенному в Справочнике. Получившаяся в результате сложения единица (если результат сложения больше 99) запоминается в флаге cf, тем самым учитывается перенос в старший разряд. Проиллюстрируем сказанное на примере сложения двух двузначных BCD-чисел в упакованном формате (листинг 8.12). Листинг 8.12. Сложение упакованных BCD-чисел ;prg8_12.asm masm model small stack 256 .data;сегмент данных b db 17h;упакованное число 17h c db 45h;упакованное число 45 sum db 2 dup (0) .code;сегмент кода main:;точка входа в программу mov ax,@data mov ds,ax xor ax,ax mov al,b add al,c daa jnc $+6;переход через команду, если результат <= 99 mov sum+1,ah;учет переноса при сложении (результат > 99) mov sum,al;младшие упакованные цифры результата exit: mov ax,4c00h int 21h end main
В приведенном примере все достаточно прозрачно; единственное, на что следует обратить внимание — это описание упакованных BCD-чисел и порядок формирования результата. Результат формируется в соответствии с основным принципом работы микропроцессоров Intel: младший байт по младшему адресу.| - Вычитание Аналогично сложению, микропроцессор рассматривает упакованные ВСО-числал как двоичные, и, соответственно, выполняет вычитание BCD-чисел как двоичным (см. пример 8.14). Выполним вычитание 67-75. Так как микропроцессор выполняет вычитание способом сложения, то и мы последуем этому: Пример 8.14. Вычитание упакованных BCD-чисел 67 =0110 0111 + -75 = 1011 0101 = -8 = 0001 1100 = 28??? Как видим, результат равен 28 в десятичной системе счисления, что является абсурдом. В двоично-десятичном коде результат должен быть равен 0000 1000 •' (или 8 в десятичной системе счисления). При программировании вычитания упакованных BCD-чисел программист, как и при вычитании неупакованных BCD-чисел, должен сам осуществлять контроль за знаком. Это делается с помощью флага cf, который фиксирует заем из старших разрядов. Само вычитание BCD-чисел осуществляется простыми командами вычитания sub или sbb. Коррекция результата осуществляется командой das: das (Decimal Adjust for Substraction) — коррекция результата вычитания для представления в десятичном виде. В Справочнике описан алгоритм, по которому команда das преобразует содержи-;
Подведем некоторые итоги: 0 Микропроцессор имеет достаточно мощные средства для реализации вычислительных операций. Для этого у него есть блок целочисленных операций и блок операций с плавающей точкой. Для большинства задач, использующих язык ассемблера, достаточно целочисленной арифметики, 0 Команды целочисленных операций работают с данными двух типов: двоичными и двоично-десятичными числами (BCD-числами).[7(Двоичные данные могут либо иметь знак, либо не иметь такового. Микропроцессор, на самом деле, не различает числа со знаком и без. Он помогает пишь отслеживать изменение состояния некоторых битов операндов и состояние отдельных флагов. Операции сложения и вычитания чисел со знаком vi без знака проводятся одним устройством и по единым правилам. И Контроль за правильностью результатов и их надлежащей интерпретацией полностью лежит на программисте. Он должен контролировать состояние флагов cf и of регистра eflags во время вычислительного процесса. 0 Для операций с числами без знака нужно контролировать флаг cf. Установка его в 1 сигнализирует о том, что число вышло за разрядную сетку операндов. 0 Для чисел со знаком установка флага of в 1 говорит о том, что в результате сложения чисел одного знака результат выходит за границу допустимых значений чисел со знаком в данном формате, и сам результат меняет знак (пропадает порядок). Ш По результатам выполнения арифметических операций устанавливаются также флаги pf, zf и sf. 0 В отличие от команд сложения и вычитания, команды умножения и деления позволяют учитывать знаки операндов. 0 Арифметические команды очень «капризны» к размерности операндов, поэтому в систему команд микропроцессора включены специальные команды, позволяющие отслеживать эту характеристику. 0 Двоичные данные имеют довольно большой, но ограниченный диапазон значений. Для коммерческих приложений этот диапазон слишком мал, поэтому в архитектуру микропроцессора введены средства для работы с так называемыми двоично-десятичными (BCD) данными. 0 Двоично-десятичные данные представляются в двух форматах, упакованном и неупакованном. Наиболее универсальным является неупакованный формат. Не нашли, что искали? Воспользуйтесь поиском:
|