Настроювання адрес

Якщо в програмі використовуються значення фізичних адрес, то правильність її роботи залежить від того, за якими адресами завантажена в пам'ять сама програма. Це особливо очевидно для команд переходу: якщо в програмі є команда «Перейти за адресою 1000», то зсув цієї програми в пам'яті призведе до того, що перехід буде виконаний на зовсім іншу команду, хоча і за тією ж адресою.

У той же час важко розраховувати, що при кожному запуску програми ОС зможе завантажити її по одним і тим же адресам. Якщо це ще в принципі можливо для однозадачной ОС, то в разі декількох завдань їх програми можуть претендувати на одні й ті ж адреси.

Для вирішення цієї проблеми в складі файла програми доводиться зберігати словник переміщень - список всіх тих місць в програмі, які містять адреси, що вимагають настройки на адресу завантаження програми. Така настройка в більшості випадків являє собою просто додавання адреси завантаження з адресою, що зберігається у файлі програми, і виконується при завантаженні програми в пам'ять. Виконання налаштування призводить до деякої затримки при запуску програм.

Пізніші архітектури ЕОМ дозволили в значній мірі спростити справу за рахунок використання відносної адресації - вказівки адреси як зміщення відносно значення в деякому базовому регістрі. Тепер настройка потрібна лише для декількох команд, що завантажують значення в базові регістри. Більш того, для багатьох не дуже складних програм стало можливо обійтися взагалі без словника переміщень (наприклад, якщо всі адреси вказані тільки як зміщення відносно початку програми). Подібні програми, здатні без змін правильно працювати при завантаженні по будь-якою адресою, називаються позиційно-незалежними, на відміну від переміщуваних програм, що вимагають настройки адрес.

В системі MS-DOS всі файли типу COM містять позиційно-незалежні програми, а файли EXE - переміщувані.