А. Ю. Каргашина и А. С. Миркотан под редакцией > Ю. М. Баяковского

Вид материалаКнига

Содержание


Приложение Б. АPИФМЕТИКА
Команды MUL и DIV
Подобный материал:
1   ...   19   20   21   22   23   24   25   26   27

Приложение Б. АPИФМЕТИКА


В предыдущем изложении мы рассматривали основные арифметические операции над целыми числами в предположении, что результат всегда помещается в одно слово машины PDP-11. Теперь обсудим возможности ассемблера MACRO-11 при работе с большими числами, не обязательно целыми. Здесь мы не можем позволить себе ничего иного, кроме беглого просмотра обширного материала, полное понимание которого требует достаточно высокого уровня математической подготовки. Цель наша состоит в том, чтобы арифметические команды макроассемблера были понятны студенту, который уже изучил или изучит основы вычислительной математики. В этом приложении будет также предполагаться более глубокое знакомство с двоичной и восьмеричной арифметикой, чем в остальных частях книги.

Команды MUL и DIV


Приведенное ранее описание этих команд дает о них упрощенное представление. Если в команде MUL MEM,R используется нечетный регистр R, то все верно. Если же используется четный, то произведение в виде тридцатидвухразрядного числа заносится в регистр R и регистр со следующим номером. Рассмотрим такой пример:

MOV #1100,R2

MUL #1000,R2

Результат, если его рассматривать как тридцатидвухразрядное число, содержит 1 в битах 15 и 18 и нули в остальных. Младшие шестнадцать битов запоминаются в R3, а старшие — в R2. Таким образом, в данном случае после выполнения команды MUL третий регистр содержит число 100000, а второй 4:

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0




1

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

31
















R2
















16




15
















R3
















0

В команде MUL операнды считаются целыми двоичными числами со знаком, а результат формируется в виде тридцатидвухразрядного числа, 15-й бит старшего слова которого является знаковым. Нужно заметить, что результат умножения всегда корректен, потому что произведение двух шестнадцатиразрядных чисел не выходит за пределы двойного слова.

Команда DIV выполняет деление целого числа в форме двойного слова, расположенного в регистре с четным номером и следующим за ним:

MOV #1,R0

MOV #100007,R1

DIV #400,R0

В этом примере две первые команды загружают число 300007 в регистры R0 и R1. Команда DIV частное (600) запишет в R0, а остаток (7) — в R1.

Если бы первой шла команда MOV #1000,R0, то результат от деления не поместился бы в одно слово. Действительно, при делении числа 200100007 на 400 получается 400200. При подобных попытках выполнение команды прерывается и устанавливается бит V.


УПPАЖНЕНИЕ. Изучите работу команды деления, когда один или оба операнда отрицательны; особое внимание при этом обратите на остаток.