- •Предисловие редактора перевода
- •Предисловие автора
- •1. Введение
- •1.1. Вычислительная система
- •1.2. Редактор
- •1.3. Запоминание и выборка информации
- •1.4. Выполнение программы
- •2. Основы
- •2.1. Регистры
- •2.2. Команды перехода
- •2.3. Память
- •2.4. Формат слова
- •3. Стpуктуpа пpогpаммы
- •3.1. Подпрограммы
- •3.2. Стеки
- •3.3. Управление выполнением программы
- •3.4. Модульное программирование
- •3.5. Структурная разработка программы
- •4. Пеpифеpийное обоpудование
- •4.1. Ввод-вывод с терминала и пульта управления
- •4.2. Прерывания
- •4.3. Внешние запоминающие устройства под управлением монитора
- •4.4. Внешние запоминающие устройства под управлением пользователя
- •4.5. Управление памятью
- •Приложение a. Odt
- •Работа odt
- •Глобальные имена
- •Отладка и исправление программы
- •Выполнение программы
- •Приложение б. Аpифметика
- •Команды mul и div
- •Целая арифметика повышенной точности
- •Арифметика чисел с плавающей точкой
- •Коды ascii
- •Система команд pdp-11
- •Указатель макpокоманд в ассемблеpе macro-11
Приложение б. А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АЖНЕНИЕ. Изучите работу команды деления, когда один или оба операнда отрицательны; особое внимание при этом обратите на остаток.
