
- •Предисловие редактора перевода
- •Предисловие автора
- •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
Приложение a. Odt
ODT — это комплекс отладки в режиме on line (On line Debugging Technique), входящий в состав операционных систем DEC PDP-11. Его реализация, как и реализация любой другой системной программы, зависит от принятой версии операционной системы. Однако основные возможности ODT остаются в большой мере неизменными, несмотря на различия в формате команд.
Работа odt
Как правило, программа ODT поставляется в виде перемещаемого двоичного файла ODT.OBJ. Он должен быть скомпонован с отлаживаемой программой. Допустим, что нам нужно отладить программу TEST.MAC посредством ODT. Сначала ее надо оттранслировать, а потом при помощи компоновщика скомпоновать перемещаемый модуль TEST.OBJ с ODT:
TEST,TEST=ODT,TEST
Эта команда указывает компоновщику на два входных файла. Он связывает их друг с другом и создает два выходных файла: TEST.SAV и TEST.MAP. Имейте в виду, что оба эти файла представляют собой снимок оперативной памяти программы TEST вместе с ODT. Поэтому, если нужно сохранить образ памяти о одной лишь вашей программой, то при компоновке вы можете просто задать различные имена для результирующих файлов. В зависимости от компоновщика может оказаться необходимым, чтобы в списке компонуемых файлов файл с ODT был расположен первым, как это и показано выше. Причина этого заключается в следующем: после того как системная команда
RUN TEST
загрузит файлы в память, она обязательно осуществит переход на начальный адрес программы отладки, а не на вход программы TEST. Когда это произойдет, отладчик напечатает краткое сообщение о номере своей версии и затем символ *, означающий, что он готов принимать указания.
Прежде чем идти дальше, необходимо научиться легко выполнять описанный процесс на имеющейся в вашем распоряжении машине. Обычный способ выхода из ODT на уровень монитора состоит в наборе на пульте ^C в момент, когда отладчик ожидает очередную команду.
Глобальные имена
Один из способов использования комплекса ODT заключается в прослеживании на различных стадиях вычислительного процесса изменений содержимого некоторых особенно важных ячеек. В команды отладчику должны при этом входить не имена ячеек, присвоенные пользователем, а значения их адресов. Так, мы не можем заглянуть в ячейку с меткой MEM, пока нам не известно, куда она была загружена. В файле .MAP не содержится подобной информации; по нему даже нельзя определить начальный адрес отлаживаемой программы, поскольку она теперь лишь часть программного комплекса, точка входа в который совпадает с адресом запуска отладчика.
Можно, однако, побудить компоновщик при создании файла .MAP указать начальный адрес нашей программы. Это достигается путем объявления имени глобальным (т.е. доступным вне программы) с помощью директивы
.GLOBL START
...
START: ...
Такая директива необходима также при независимой трансляции различных подпрограмм и затем последующего объединения их компоновщиком. Предположим, что нам нужно скомпоновать два файла MAIN.MAC и SUB.MAC после того, как они будут оттранслированы, и что файл SUB.MAC содержит подпрограмму SUBRTN. Если в первом файле стоит вызов подпрограммы, то они оба должны содержать описание .GLOBL SUBRTN.
Отдельно транслируемые части программы или модули должны оканчиваться директивой .END. Причем начальный адрес всей программы должен быть задан в качестве параметра этой директивы только того модуля, в котором он определяется. Все же остальные модули завершаются просто .END. При компоновке с отладчиком чаще всего нет необходимости выкидывать из отлаживаемой программы адрес запуска, так как в большинстве операционных систем предусмотрено, чтобы управление сразу передавалось комплексу ODT.