Двоичная cтрока. Арифметика ALU. Арифметические и логические операции. Арифметика Сдвигателя, страница 2

·  Целочисленный режим для целочисленных операндов формата 16.0.  Здесь сдвиг влево не выполняется.  Например, если операнды находятся в формате 16.0, результат умножителя с 32 битами будет в формате 32.0.  Сдвиг влево изменил бы число к неправильному значению.

Тип результата в MAC из дробного в целый переключается  командой  ENA  M_MODE;

(а обратно к дробному:  DIS  M_MODE ; )

Операции MAC

Эта группа осуществляет операции умножения и умножения/накопления.  Важно изучить,  как это умножение выполняется.  Бит M_MODE (бит 4 в регистре MSTAT) управляет, производится ли умножение в заданном по умолчанию дробном формате или в целочисленном формате.  Выполните следующие команды.

MX0 = 0x4000;

MY0 = 0x4000;

MR = MX0 * MY0 (SS);

MAC принимает данные в 1.15 дробном формате.  Первые две команды, следовательно, помещают значения 0.5 в регистры MY0 и MX0. Умножение двух чисел 1.15 формата  должно дать число   формата 2.30.  Однако, MAC автоматически изменит этот формат сдвигом влево на 1 разряд в заданном по умолчанию режиме, и результат получим в формате 1.31.  Третья команда умножает MX0 и MY0 (указано, что оба в знаковой форме) и помещает результат в MR.   MR - 40 разрядный регистр, который отображается как два регистра MR0 и MR1 с 16 битами и регистр MR2 с 8 битами.  Результат вышеупомянутой операции иллюстрируется ниже.  Никакие признаки не установлены в этой операции.

MX0 = 0.100 0000 0000 00002

* MY0 = 0.100 0000 0000 00002   

MX0 * MY0 =  0.001 0000 0000 0000 0000 0000 0000 00002      { считать нули справа! }

После того, как сдвиг на 1 бит влево

MX0 * MY0 = 0.010 0000 0000 0000 0000 0000 0000 00002   ( = 0.25 десятичное)

=> MR2 = 0x00

=> MR1 = 0x2000

=> MR0 = 0x0000

Теперь опробуйте следующие команды.

MX1 = 2:

MY1 = 3;

MR =MX1 * MY1 (SS);

Заметим, что десятичные числа 2 и 3 помещены в MX1 и MY1, соответственно.  Результат, однако, равен не ожидаемому целому числу 6, но 12-и  из-за заданного по умолчанию дробного формата, как было объяснено. Заметим также, что результат интерпретируется не как целое число 12, а как некоторое дробное число (какое оно?)

MX1 = 0000 0000 0000 00102

* MY1 = 0000 0000 0000 00112

MX1 * MY1 = 0000 0000 0000 0000 0000 0000 0000 01102

После сдвига на 1 бит  влево

MX1 * MY1 = 0000 0000 0000 0000 0000 0000 0000 11002

=> MR2 = 0x00

=> MR1 = 0x0000

=> MR0 = 0x000C

Теперь  включим режим целочисленного умножения.  Это сделаем,  разрешая бит M_MODE.  Выполните следующие команды.

ENA  M_MODE;

MR = MX1 * MY1  (SS)

Бит M_MODE (бит 4 регистра MSTAT) установлен в 1 командой ENA (разрешение).  Это вынуждает последующие MAC-инструкции подавлять автоматический сдвиг влево произведения и осуществлять целочисленное умножение.  Умножение MX1 и MY1 теперь даёт 6:

MX1 = 0000 0000 0000 00102

* MY1 = 0000 0000 0000 00112

MX1 * MY1 = 0000 0000 0000 0000 0000 0000 0000 01102

=> MR2 = 0x00

=> MR1 = 0x0000

=> MR0 = 0x0006

Арифметика Сдвигателя

Большинство операций в Сдвигателе явно предназначены для знаковых (в дополнительном коде) или беззнаковых величин: Логические сдвиги создают беззнаковые или двоичные строковые величины, а арифметические сдвиги предполагают дополнительный код.

Логика экспоненты  предполагает числа в дополнительном коде. Блок плавающей точки также основан на дроби в дополнительном коде.

Операции Сдвигателя

Эта группа выполняет арифметические и логические сдвиги  и операции, имеющие отношение к арифметике с плавающей точкой. Ограничимся рассмотрением операций непосредственного сдвига (сдвиг на число разрядов непосредственно указанное в инструкции после BY).  Выполните следующие команды.

SI = 0x1111;

SR = LSHIFT  SI  by  2 (HI);

Первая команда помещает шестнадцатеричное число 1111 в регистр SI.  Вторая команда, LSHIFT, является командой логического сдвига (L – это не сдвиг влево), в которой  32-битное выходное поле SR заполняется нулями справа при сдвиге влево и заполняется нулями слева при сдвиге вправо.  Вышеупомянутая команда сдвигает SI логически  влево на 2 бита (чтобы умножить число  на 2+2), следовательно, SI = 0x4444.  Результат сохранен в старших (HI) 16 битах регистра SR, т.е. SR1 = 0x4444 и SR0 = 0x0000

SR = LSHIFT  SI  by  -2 (HI);

Теперь SI сдвинут логически на 2 бита  вправо (чтобы умножить число на 2-2) и результат сохранен в старшем регистре SR, следовательно, SR1 = 0x0444 и SR0 = 0x4000

SR = LSHIFT SI  by  1 (LO);

Когда SI логически сдвинут на 1 бит влево, результат равен 0x2222.  Но сохраняется он в младшем (LO) регистре

LSHIFT  1     0x0000 2222 

=> SR1 = 0x0000

=> SR0 = 0x2222

Далее мы рассмотрим арифметический сдвиг, при котором  32 - битное выходное поле SR заполняется нулем справа для левого сдвига и заполняется знаковым символом слева для  правого сдвига.

SI = 0xC000;

SR = ASHIFT  SI  by  -8 (HI);

Первой командой установлено в SI  0xC000, т. е. отрицательное число.  Вторая команда сдвигает SI арифметически на 8 бит вправо и результат сохраняет в старших 16 битах регистра SR.  Получим результат  0xFFC0:

SI = 1100 0000 0000 00002 

ASHIFT -8   1111 1111 1100 00002 

=> SR1 = 0xFFC0

=> SR0 = 0x0000

Здесь не рассмотрены насыщение в MAC и операции с плавающей точкой в Сдвигателе.