· Целочисленный режим для целочисленных операндов формата 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 и операции с плавающей точкой в Сдвигателе.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.