Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
рыбак.docx
Скачиваний:
43
Добавлен:
21.09.2019
Размер:
2.35 Mб
Скачать

2.4.4. Позиционно-независимые программы и методы адресации.

Программы, создаваемые в рамках концепции модульного программирования, в соответствии со сказанным выше должны быть стандартны, доступны различным пользователям. Так как не известно заранее, куда будет загружена такая программа, требуется реализация возможности ее загрузки и выполнения в произвольном месте памяти. Для достижения этого существует несколько способов:

- Повторно ассемблировать программу так, чтобы она начиналась с требуемой ячейки.

- Использовать перемещающий загрузчик, который принимает от ассемблера специально подготовленные перемещаемые двоичные коды.

- Создавать программы, перемещающие себя после загрузки.

- Писать позиционно-независимые программы.

Повторное ассемблирование чаще используется на малых машинах. Если позволяют ресурсы памяти, то предпочтительнее иметь перемещающий загрузчик. Программы, перемещающие себя, оказываются экономически нецелесообразными, поскольку требуют перестройки сотен или даже тысяч адресов. Возможность создания позиционно-независимых программ определяется структурой машины, на которой они реализуются. В частности, система PDP-11 допускает позиционно-независимое кодирование (PIC) программ. Для этого служат те методы адресации, в которых исполни тельный адрес формируется относительно счетчика команд (PC). Следовательно, при любом перемещении команды перемещаются и другие связанные с ней элементы программы, а расстояние между ними не меняется. ^Такое постоянное относительно PC значение смещения можно вычислять для всех адресов программы. При PIC для ссылки на ячейку используется ее смещение относительно той, в которой осуществляется обращение. Абсолютные ссылки в PIC-программах возможны только к тем ячейкам памяти, которые занимают постоянное место даже если сама программа перемещается.

Позиционно-независимые методы адресации

Существуют три типа позиционно-независимых команд.

1. Переходы — команды условного перехода и безусловный переход JMP позиционно-независимые, в них адрес вычисляется как смещение относительно счетчика команд PC.

2. Относительные ссылки к ячейкам памяти — ссылки б форме «CLRX» или «MOV X, Y» позиционно-независимые, потому что смещение в этих командах ассемблируется относительно значения PC. Под смещением понимается расстояние между текущим значением PC и ячейкой, на которую выполняется ссылка.

Смещение суммируется с содержимым PC. В этом примере значение PC равно адресу команды, следующей за ячейкой, содержащей смещение,— 104 (CLR X — двухсловная команда). Заметим, что в форме CLR X команда позиционно-независимая, а в форме CLR@X — позиционно-зависимая.

  1. Непосредственные операнды — адресная форма Ассемблера служит для

непосредственного задания данных, в этом случае часть команды ассемблируется как значение операнда. Непосредственные операнды могут быть позиционно-независимыми только в том случае, если ими представлены константы, а не адреса. Тогда команда SUB ф2, HERE позиционно-независимая, так как здесь ф2 не адрес; в то же время команда MOV #А, ADRPTR позиционно-зависимая, поскольку А — символический адрес. Это справедливо, несмотря на то, что в обоих случаях операнд выбирается с использованием PC в автоинкрементном режиме.