Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_2011.doc
Скачиваний:
64
Добавлен:
09.12.2018
Размер:
1.15 Mб
Скачать
  1. Директивы сегментации

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

Сегмент объявляется директивой:

Имя segment [выравнивание] [комбинирование] [класс] [размер]

Тип выравнивания определяет размещение начала сегмента на заданной границе при компоновке модулей:

BYTE – сегмент может начинаться с любого адреса в памяти;

WORD - сегмент должен начинаться с адреса кратного двум;

DWORD - сегмент должен начинаться с адреса кратного четырем;

PARA – сегмент должен начинаться на границе параграфа (адрес кратный 16)

PAGE – сегмент начинается на границе страницы (256 байт)

MEMPAGE – начало сегмента на границе 4 Кбайт

Тип комбинирования определяет комбинирование модулей, имеющих одно и то же имя и класс.

PRIVATE – не будет объединения с сегментами вне данного модуля (то есть данный сегмент будет самостоятельным).

PUBLIC – сегменты с одинаковыми именами объединяются в непрерывный сегмент, а все адреса вычисляются от начала объединенного сегмента.

COMMON – произойдет наложение сегментов с одинаковым начальным адресом.

AT xxxx – располагается сегмент по абсолютному адресу параграфа (хххх – разрядность адреса). Для доступа к сегменту необходимо загрузить в соответствующий сегментный регистр адрес начала сегмента.

STACK – аналогично директиве PUBLIC, но относится к стеку, который объединяется с другим стеком, имеющим такое же имя и класс.

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

Группируются сегменты одного класса. Имя сегмента может быть любым, но по соглашению желательно, чтобы оно отображало содержимое сегмента.

Например:

CODE’, ‘DATA’, ‘STACK

Тип размера сегмента объявляется одной из директив:

USE16 – 16-разрядная адресация,

USE32 – 32-разрядная адресация.

Пример программы, не использующей модель памяти:

stk segmentstack’ ; объявление сегмента стека

db 256h dup (“?”)

stk ends

data segment para public ‘data’ ;объявление сегмента данных

mes db “Введите данные, $ ”

data ends

code segment para public “code” ;объявление сегмента кода

main proc ; начинается процедура

assume cs:code, ds:data, ss:stk ; логическая связь

mov ax, data ; адрес начала данных загружаем в регистр ax

mov ds, ax ; загрузка сегментного регистра ds

mov ah, 9h ; номер функции вывода сообщения

mov dx, offset mes ;загрузка адреса строки в регистр dx

int 21h ;вывод сообщения на экран

mov ax, 4c00h ; номер функции возврата

int 21h ;возврат в ОС

main endp

code ends

end main

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