- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
9. Директивы порядка загрузки сегментов
Нами уже было разобрано понятие «сегмент» и основы работы с ним. Однако, существуют и более тонкие способы настройки, один из которых и будет сейчас разобран. Как правило, сегменты загружаются в память в том порядке, в котором они описываются в тексте программы, причем, если несколько сегментов объединяются в один, порядок определяется по началу первого из объединяемых сегментов. Этот порядок можно изменить с помощью одной из специальных директив:
1. Директива .alpha загружает сегменты в алфавитном порядке.
2. Директива .dosseg загружает сегменты в том порядке, в котором они запрашиваются дисковой операционной системой (DOS). Именно он часто требуется при организации эффективного взаимодействия ассемблерных программ с программами на языках высокого уровня.
3. Директива .seq отменяет действие .alpha или .dosseg, восстанавливая загрузку сегментов в том порядке, в котором они описаны в программе.
Знание порядка загрузки сегментов необходимо, например, для вычисления длины программы или адреса ее конца. Для этого надо знать, какой сегмент будет загружен последним, и смещение последнего байта в нем.
10. Директивы управления программным счетчиком
Также полезно уметь работать с директивами управления программным счетчиком, используемым в ассемблере для преобразования меток в адреса.
Вообще, программный счетчик – внутренняя переменная ассемблера, равная смещению текущей команды или данных относительно начала сегмента. Для управления его значением используются следующие директивы:
1. ORG. Устанавливает значение программного счетчика. Имеет формат
ORG выражение
ORG 100h ; как пример в файлах типа COM, которые загружаются в память после блока параметров размером 100h.
2. EVEN. Делает текущее значение счетчика кратным двум, вставляя команду NOP, если оно было нечетным. Это увеличивает скорость работы программы, так как для доступа к слову, начинающемуся с нечетного адреса, процессор должен считать два слова из памяти.
3. ALIGN. Развитие директивы EVEN. Ориентировано на кратность не только двум, поэтому округляет значение программного счетчика до кратного указанному значению. Оно может быть любым четным числом. Если счетчик некратен указанному числу, вставляется необходимое количество команд NOP. Имеет формат
ALIGN значение.
11. Условия
Практически во всех сложных программах возникают ситуации, когда необходимо игнорировать тот или иной участок программы в зависимости от условий. Иногда для этого достаточно команд условного перехода. но порой их оказывается недостаточно. Особенно верно это для тех случаев, которые сложно увязать со значениями флагов.
В подобных случаях ассемблер подключает инструменты, специально предназначенные для описания развилок. Например, для самой простой из них будет использована следующая структура:
IF выражение
...
…
ENDIF
Если значение выражения – ноль, то есть ложь, тогда участок кода программы между IF и ENDIF игнорируется. При двойно развилке усложняем используемую структуру, вводя ELSE:
IF выражение
...
…
ELSE
…
…
ENDIF
Если значение выражения – ноль, ассемблируется код программы от ELSE до ENDIF; иначе – от IF до ELSE.
Ну и в случае множественного выбора, аналогично операторам switch/case языков высокого уровня, ассемблер использует ELSEIF в необходимом количестве. Например:
IF выражение1
...
ELSEIF выражение2
…
ELSEIF выражение3
…
ELSE
…
ENDIF
Иногда директивы условного ассемблирования используются для того, чтобы прервать ассемблирование программы. Для этого используется специальная директива генерации ошибок .ERR. Как только ассемблер встречает ее, то работа программы прекращается и происходит выход с сообщением об ошибке.
