- •Лекция 1. Введение. Системное программное обеспечение. Состав системного программного обеспечения
 - •Лекция 2. Принципы функционирования систем программирования
 - •Этапы подготовки программы
 - •Трансляторы и интерпретаторы – общая схема работы
 - •Лекция 4. Назначение и функции компоновщика.
 - •Раздельная компиляция
 - •Переместимые коды и абсолютные коды
 - •Редактирование связей с оверлеями
 - •Связывание с динамически подсоединяемыми библиотеками (dll)
 - •Лекция 5. Назначение и функции программы загрузчика
 - •Виды загрузчиков. Загрузчики типа «компиляция-выполнение».
 - •Абсолютный загрузчик
 - •Настраивающий загрузчик
 - •Непосредственно связывающий загрузчик
 - •Динамический загрузчик
 - •Программные отладчики и их эксплуатация
 - •Лекция 6. Базовые понятия языка.
 - •Лекция 7. Базовые понятия языка.
 - •Лекция 8. Команды и алгоритмы языка.
 - •Лекция 9.1. Сложные структуры данных.
 - •Команда loop
 - •Лекция 9.2. Сложные структуры данных. Структуры
 - •Объединения
 - •Лекция 2.4. Организация и использование подпрограмм
 - •Передача параметров по значению
 - •Передача параметров по ссылке
 - •Передача параметров по возвращаемому значению
 - •Передача параметров по результату
 - •Передача параметров по имени
 - •Передача параметров отложенным вычислением
 - •Передача параметров в регистрах
 - •Передача параметров в глобальных переменных
 - •Передача параметров в стеке
 - •Передача параметров в потоке кода
 - •Передача параметров в блоке параметров
 - •Лекция 2.5. Макросредства языка Ассемблер
 - •Лекция 2.6. Работа с файлами, каталогами и дисками под управлением ms-dos
 - •Лекция 3.1. Структура и программирование контроллера прерываний.
 - •Лекция 4.1. Работа с консолью. Организация ввода/вывода информации.
 - •Лекция 5.1. Системные средства управления памятью
 - •Окружение dos
 - •Лекция 6.1. Основы организации резидентных программ
 - •7.1. Функции драйвера
 - •7.2. Архитектура драйвера
 - •Процесс загрузки драйверов
 - •7.3 Команды драйвера
 
Настраивающий загрузчик
Чтобы избежать необходимости повторного ассемблирования всех подпрограмм при внесении изменения в одну из них, а также чтобы освободить программиста от задач распределения памяти и осуществления связи подпрограмм, были разработаны так называемые настраивающие загрузчики. Этот загрузчик допускает наличие в программе нескольких программных сегментов и одного сегмента данных (общего сегмента). Ассемблер транслирует каждый сегмент отдельно и передает загрузчику текст и информацию, касающуюся перемещений и перекрестных ссылок между сегментами.
Выходом ассемблера при такой схеме является объектная программа и информация обо всех других программах, к которым в данной программе имеются обращения. Кроме того, имеется информация о тех местах, которые должны быть изменены при загрузке (информация о перемещении), т.е. о ячейках, содержимое которых зависит от расположения программы в памяти.
Для каждой исходной программы ассемблер в качестве выходной информации вырабатывает текст (результат трансляции), предваряемый вектором переходов, содержащим адреса имен подпрограмм, к которым имеются обращения в исходной программе. Например, если подпрограмма SQRT является первой вызываемой подпрограммой, то первая ячейка вектора переходов будет содержать символическое имя SQRT. Предложения, содержащие вызов подпрограммы SQRT, будут транслироваться в команду перехода, указывающую адрес элемента вектора переходов, связанного с SQRT. Ассемблер, кроме того, будет передавать дополнительную информацию такую, как общая длина программы и длина вектора переходов. После загрузки в память текста программы и вектора переходов загрузчик будет загружать каждую подпрограмму, указанную в векторе. Затем он в каждый элемент вектора поместит команду перехода к соответствующей подпрограмме. Таким образом, вызов подпрограммы SQRT приведет к выполнению команды перехода к первой ячейке вектора переходов, в которой будет содержаться команда перехода к вызываемой подпрограмме.
  
Такая схема загрузки с двухступенчатой передачей управления часто используется в вычислительных машинах с фиксированным форматом команд и непосредственной адресацией.
Такой загрузчик имеет ряд недостатков:
вектор переходов не вполне удобен для загрузки и сохранения внешних данных (расположенных в другом программном сегменте);
вектор переходов увеличивает длину объектной программы;
загрузчик работает с программными сегментами, но не облегчает доступ к сегментам данных, которые могут совместно использоваться несколькими подпрограммами.
Непосредственно связывающий загрузчик
Непосредственно связывающий загрузчик наиболее полно обеспечивает возможность перемещения в памяти программ и данных и в настоящее время наиболее распространен. Такой загрузчик обладает тем преимуществом, что допускает использование большого числа как программных сегментов, так и сегментов данных и дает программисту полную свободу обращения к данным, находящимся в других сегментах, допуская при этом раздельную трансляцию.
Ассемблер (транслятор) должен передать загрузчику следующую информацию с каждым сегментом программы и данных:
длину сегмента;
список всех символов сегмента, к которым возможно обращение из других сегментов, и их относительные адреса;
список всех символов, не определенных в данном сегменте, к которым есть обращение в данном сегменте;
информацию о расположении адресных констант в сегменте и описание того, каким образом должны изменяться их значения;
машинные коды, полученные в результате трансляции, и приписанные относительные адреса.
Одним из недостатков непосредственно связывающего загрузчика в простейшем виде является необходимость при каждом выполнении программы повторно выполнять функции распределения памяти, перемещения, связывания и загрузки всех необходимых подпрограмм. Эти проблемы можно устранить путем выполнения загрузки с помощью двух отдельных программ: объединителя и загрузчика модуля. Выходом объединителя является набор данных в формате, допускающем загрузку программы в память, и называется загрузочным модулем. Существует несколько типов объединителей. Один из них, так называемый, редактор связей, который сохраняет информацию, необходимую для перемещения модуля, в памяти, так что модуль как единое целое может затем настраиваться и загружаться в произвольное место памяти. В этом случае загрузчик модуля должен выполнять функции распределения памяти и перемещения, но остается свободным от решения сложной задачи связывания объектных модулей и подпрограмм.
  
