Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
212-235.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
179.35 Кб
Скачать

Задания 228 230 231 имеют одинаковые вопросы только в разной последовательности

212

Многомодульные программы

Разбиение исходного текста программы на несколько файлов делает этот текст более понятным для программиста или нескольких программистов, участвующих в создании программного продукта. Однако остаётся нерешёнными ещё несколько задач:

  1. Программа-транслятор работает со всем исходным текстом целиком, ведь она соединяет все файлы перед трансляцией вместе. Поэтому время трансляции исходного текста программы остаётся значительным (и даже возрастает). В то же самое время программа никогда не переписывается целиком. Обычно изменяется только небольшой участок программы.

  2. При назначении переменных их количество ограничено программой-транслятором и может быть исчерпано при написании программы.

  3. Различные программисты, участвующие в создании программного продукта могут назначать одинаковые имена для своих переменных и при попытке соединения файлов в единую программу обычно возникают проблемы.

213

Модульность в языках программирования — принцип, согласно которому программное средство (ПС, программа, библиотека, веб-приложение и др.) разделяется на отдельные именованные сущности, называемые модулями. Модульность часто является средством упрощения задачи проектирования ПС и распределения процесса разработки ПС между группами разработчиков. При разбиении ПС на модули для каждого модуля указывается реализуемая им функциональность, а также связи с другими модулями.

Роль модулей могут играть структуры данных, библиотеки функций, классы, сервисы и др. программные единицы, реализующие некоторую функциональность и предоставляющие интерфейс к ней.

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой.

Динамическая трансляция (например Java), интерпретация (с некоторыми оговорками) - независимая трансляция.

Динамическая трансляция рассматривает короткие последовательности кода (как правило, это базовый блок: цикл или метод), транслирует его и кэширует результирующую последовательность. Код транслируется не весь, а по мере считывания и, соответственно, возможности его трансляции, и для инструкций ветвления создается контрольная точка в транслируемом коде.

Модуль состоит из последовательности разделов. Каждый раздел начинается ключевым словом и продолжается до начала следующего раздела.

  • unit //ИмяМодуля;

  • interface // раздел интерфейса

{ Здесь находятся описания процедур и функций модуля, коч-орые могут использоваться другими модулями. )

  • const // раздел объявления констант

{ Здесь находятся объявления глобальных констант модуля, которые могут использоваться процедурами и функциями модуля.}

  • type  // раздел объявления типов

{ Здесь находятся объявления глобальных типов модуля,

которые могут использоваться процедурами и функциями модуля }

  • var // раздел объявления переменных

{ Здесь находятся объявления глобальных переменных модуля, которые могут использоваться процедурами и функциями модуля }

  • implementation  // раздел реализации

{ Здесь находятся описания (текст) процедур и функций модуля)

end.

Пример:

unit <идентификатор>; interface uses <список модулей>; { Необязательный } { глобальные описания } implementation uses <список_модулей>; { Необязательный } { локальные описания } { реализация процедур и функций } begin { код инициализации } end.

214

Общее имя

Общим называется имя, которое указано в директиве PUBLIC (например, PUBLIC B). Содержательно - это имя, описанное в данном модуле, но доступное для всех остальных модулей программы. При объединении модулей в единую программу в тех модулях, где это имя используется, надо будет заменить его на его адрес внутри данного модуля.

Внешние имена

Если ассемблер транслирует один из модулей многомодульной программы и в нем используются внешние имена, т.е. имена из других модулей, то, транслируя этот модуль независимо от других, ассемблер, естественно, не может оттранслировать эти имена, т.е. не может заменить их на соответствующие им адреса. Эти адреса станут известными позже, на этапе объединения модулей в единую программу, только тогда и появится возможность сделать эти замены.

 Директивы: инструкции, не переводящиеся непосредственно в машинные команды, а управляющие работой компилятора. В языке ассемблера директивы указывают общую информацию, такую как целевая среда, указание границ между секциями.

………………………………

215

Комбинирование сегментов

Атрибут комбинирования сегментов (комбинаторный тип) сообщает компоновщику, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя.

PRIVATE — сегмент не будет объединяться с другими сегментами с тем же именем вне данного модуля; PUBLIC — заставляет компоновщик объединить все сегменты с одинаковым именем. COMMON — располагает все сегменты с одним и тем же именем по одному адресу, то есть все сегменты с данным именем перекрываются. РAT xxxx — располагает сегмент по абсолютному адресу параграфа (параграф — область памяти, объем которой кратен 16, потому последняя шестнадцатеричная цифра адреса параграфа равна 0). STACK — определение сегмента стека. Заставляет компоновщик объединить все одноименные сегменты и вычислять адреса в этих сегментах относительно регистра SS. Комбинированный тип STACK (стек) аналогичен комбинированному типу PUBLIC за исключением того, что регистр SS является стандартным сегментным регистром для сегментов стека. По умолчанию комбинирование PRIVATE.

Ассемблерные вставки - это части кода написанные на языке ассемблера вставленные в программу написанную на боле высоком языке(к примеру С, С++) и выполняющие заложение в них функции работая совместно с программой, в которую они был вставлены, как её часть.

216

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

0 Таймер

1 Клавиатура

2 Перемещено с IRQ9

3 COM2 или COM4 (последовательный порт)

4 COM1 или COM3 (последовательный порт)

5 LPT2 (параллельный порт)

6 Контроллер гибких дисков

7 LPT1 (параллельный порт)

8 Часы реального времени

9 Перемещен на IRQ2

10 Не использован, часто используется для подключения сетевых карт

11 Не использован

12 PS/2 шина мыши

13 Математический сопроцессор

14 Контроллер жесткого диска

15 Некоторые компьютеры используют это прерывание для подключения вторичного IDE контроллера

Операции ввода/вывода по прерыванию INT 21H:

0AH: Ввод данных в буфер: Определяется максимальная длина

вводимого текста. Это необходимо для предупреждения пользователя звуковым

сигналом, если набран слишком длинный текст; символы, превышающие

максимальную длину, не принимаются. Во второй байт буфера команда

возвращает действительную длину введенного текста в байтах.

Команда INT ожидает, пока пользователь не введет с клавиатуры текст,

проверяя при этом, чтобы число введенных символов не превышало

максимального значения, указанного в списке параметров.

Также используют:

ВВОД/ВЫВОД ПО ПРЕРЫВАНИЮ INT 10H, INT 16H

Для  управления вводом-выводом непосредственно на уровне порта используются команды  IN  и OUT: - Команда IN передает данные из  входного  порта  в  регистр  AL (байт) или в регистр АХ (слово). Формат команды: IN  регистр,порт

- Команда OUT передает данные в порт из регистра AL  (байт)  или  из регистра АХ (слово). Формат команды: OUT порт,регистр

String DB “Введите символ” //Строка для вывода

Mov dx, offset string //Смещение строки в регистр DX

Mov ah, 9 //Выполняем функцию вывода строки

Int 21h //Прерываемся для вывода строки

217

Существует два вида прерываний. Аппаратные прерывания формируются внешними устройствами для обработки процессором некоторого события. Напри­мер, нажатие клавиши на клавиатуре вызывает событие клавиатуры, уведомляющее процессор о необходимости ввести очередной символ в буфер клавиатуры BIOS. Программные прерывания генерируются выполняемой програм­мой при необходимости обращения к какому-либо устройству ПК, например, при выводе данных на монитор.

Контроллер прерываний

Когда какому-либо устройству ПК необходимо обслуживание со стороны про­цессора, оно направляет запрос на прерывание и направляет его процессору. Такое прерывание называется аппаратным, поскольку оно формируется аппарат­ным устройством. Для координации и упорядочивания обслуживания запросов на аппаратные прерывания используется специальный контроллер прерываний. Мик­росхема контроллера прерываний Intel 8259 устанавливается на материнской плате и выполняет следующие операции:

  • принимает запросы на прерывания;

  • организует очередь запросов;

  • посылает процессору запрос на прерывание текущей программы, сообщая ему адрес текущей программы обработки прерывания.

Прерывания, генерируемые программами, называются программными пре­рываниями. Они не требуют обращения к контроллеру прерываний, поскольку инициатор прерывания — программа — уже использует процессор.

Обработка прерываний

Когда периферийное устройство нуждается в обслуживании процессором, оно посылает соответствующий запрос на контроллер прерываний, т.е. генерирует аппаратное прерывание. Контроллер помещает запрос в очередь и посылает про­цессору сигнал INT. Если процессор разрешает прерывание, контроллер получает от него разрешающий сигнал INTA.

После этого управление шиной данных переходит к контроллеру прерываний, который находит в таблице векторов прерываний начальный адрес соответствую­щей программы обработки прерывания. Адрес этой программы поступает в счетчик команд процессора и начинается ее выполнение.

Маскирование прерываний

Запрет на выполнение аппаратных прерываний процессором называется маскированием прерывания. Такой запрет необходим, например при обработке данных, когда новое прерывание может помешать выполнению текущей про­граммы, уже использующей некоторый обработчик прерывания. Маскирование также применяется в случае, когда выполнение точно рассчитанной по времени процедуры ввода/вывода не должно быть нарушено прерыванием, требующим длительной обработки. Некоторый особо важные прерывание не могут быть за­прещены и называются немаскируемыми.

Уровни аппаратных прерываний

Существует восемь уровней запросов на маскируемые аппаратные прерыва­ния (запросы IRQ0...IRQ7). Эти запросы обрабатываются контроллером прерываний в порядке уменьшения номера IRQ. Наибольший приоритет имеет прерывание с номером IRQ0. При одновременном поступлении на обработку не­скольких прерываний (как это ни мало вероятно), первым обслуживается запрос с наименьшим IRQ. Так, например, при поступлении запросов с IRQ3 и IRQ5, пер­вым будет обработан запрос с IRQ3.

Наивысший приоритет среди маскируемых прерываний (IRQ0) имеет преры­вание системных часов, обеспечивающее точный отсчет времени. Следующий приоритет (IRQ1) у прерываний от клавиатуры, которое вызывается при нажатии или отпускании клавиши.

Немаскируемые прерывания имеют абсолютный приоритет и посылаются на специальный порт микросхемы контроллера.

Приоритеты аппаратных прерываний

Компьютеры с микропроцессорами 386 и 486 поддерживают 17 уровней ап­паратных прерываний. Прерывания обрабатываются двумя контроллерами прерываний, обеспечивающим отдельные порты для каждого уровня прерываний.

Второй контроллер служит для обработки прерываний с номерами IRQ3...IRQ15. Эти прерывания выше по приоритету, чем прерывание IRQ3, но ниже чем прерывания IRQ1. IRQ2 при этом используется для подключения вто­рого контроллера. Кроме того, второй контроллер не имеет отдельного порта для обслуживания немаскируемых прерываний.

218

…………………………………………….

219

Процесс подготовки и отладки программы:

-        трансляция программы,

-        создание загрузочного модуля,

-        отладка программы.

Начальной процедурой создания программы на языке Ассемблера является ввод исходного текста программы в файл с расширением .asm. При этом может быть использован любой текстовый редактор, сохраняющий текст в виде стандартных кодов ASCII, например, редакторNC или блокнот. Основное требование к редактору, заключается в том, чтобы он (редактор) не вставлял посторонних символов (специальных символов форматирования).

Следующим шагом формирования программы является компиляция, которая носит специфическое название ассемблирование. Этот этап может быть выполнен программами ASM, MASM или TASM(сложность программ-компиляторов растет в указанной последовательности). Результатом выполнения этого этапа является программа в машинных кодах с расширением .obj, или, иначе, объектная программа, уже “понятная” микропроцессору. Естественно перевод состоится лишь в том случае, если исходный текст программы не содержит ошибок. Одновременно с объектным файлом могут быть созданы файлы листинга (*.lst ) и перекрестных ссылок (*.crf). Рекомендуется файл листинга создавать обязательно, поскольку при наличии ошибок в листинге описывается характер ошибки сразу после ошибочной команды, что значительно упрощает внесение исправлений, особенно на этапе обучения.

Файл листинга содержит код ассемблера исходной программы, машинный (объектный) код каждой команды и ее смещение в кодовом сегменте (значение регистра IP). Кроме того, сообщения о найденных синтаксических ошибках в программе помещаются непосредственно после ошибочной команды (бывают исключения, когда ошибка не в самой команде, а ранее нее, но эти ситуации встречаются редко).

Однако объектная программа еще не является законченной и исполняемой, т.к. в ней определены не все адреса (программа не является “перемещаемой”) и не объединены части (блоки) программы, которые могут транслироваться отдельно с целью более простой отладки. Преобразование объектной программы в исполняемую (компоновка) выполняется загрузчиком (редактором связей) LINK либо TLINK(в зависимости от используемой программы ассемблирования: для ASM, MASM — LINK, дляTASM — TLINK).

Чтобы проверить работоспособность созданной программы и увидеть результаты ее работы (если не использован вывод на дисплей), применяют программу отладчик. Тестирование и отладка исполняемой программы выполняется отладчиком TD или DEBUG.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]