Директивы сегментации. Упрощенные директивы сегментации. Лекция доцента кафедры ИВТ ГрГУ кандидата технических наук Ливак Е.Н. Сегментные регистры Микропроцессор имеет 6 сегментных регистров, посредством которых может одновременно работать: – с одним сегментом кода; CS – с одним сегментом стека; SS – с одним сегментом данных; DS – с тремя дополнительными сегментами данных ES, FS, GS. СЕГМЕНТЫ • Физически сегмент представляет собой область памяти, занятую командами и (или) данными. • Адреса сегментов хранятся в соответствующих сегментных регистрах. Упрощенные директивы сегментации • .CODE [имя] - Начало или продолжение сегмента кода • .DATA - Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near • .STACK [размер] - Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека • .CONST - Начало или продолжение сегмента постоянных данных (констант) модуля • .DATA? - Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near • .FARDATA [имя] - Начало или продолжение сегмента инициализированных данных типа far • .FARDATA? [имя] - Начало или продолжение сегмента неинициализированных данных типа far Директива указания модели памяти MODEL • Используется совместно директивами сегментации с упрощенными • частично управляет размещением сегментов, т.е. связывает сегменты с сегментными регистрами Директива указания модели памяти MODEL • Упрощенный формат директивы MODEL MODEL [ <модификатор>] <модель памяти> [ др. параметры ] Примеры: model small model tiny model use 32 small model compact Модели памяти MODEL памяти> [ <модификатор>] <модель [ др. параметры ] • TINY - Используется для создания программ формата .com • SMALL - Эту модель обычно используют для большинства программ на ассемблере • MEDIUM - Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль • COMPACT - Код в одном сегменте • LARGE - Код в нескольких сегментах, по одному на каждый объединяемый программный модуль Модификаторы модели памяти MODEL [ <модификатор>] <модель памяти> [ др. параметры ] • use16 • use32 • dos - сегменты выбранной модели 16-битные - сегменты выбранной модели 32-битные - программа будет работать в MS-DOS Пример: model use 16 small Идентификаторы, создаваемые директивой MODEL При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, чтобы получить информацию о тех или иных характеристиках данной модели памяти. • • • • @code @data @fardata @fardata? Физический адрес сегмента кода Физический адрес сегмента данных типа near Физический адрес сегмента данных типа far Физический адрес сегмента неинициализированных данных типа far • @curseg Физический адрес сегмента неинициализированных данных типа far • @stack Физический адрес сегмента стека Структура программы masm ;режим работы TASM: ideal или masm model small ;модель памяти .stack <размер> ;сегмент стека .data ;сегмент данных <описание данных> BEGIN : .code ;сегмент кода <команды> end BEGIN ;конец программы с точкой входа BEGIN Начало программы с упрощенными директивами сегментации masm model small .data message db 'Введите данные $' .stack db 256 dup ('?') .code main proc mov ax,@data mov ds,ax ;далее текст программы Стандартные директивы сегментации директивы SEGMENT и ASSUME Описание сегментов на языке Assembler Сегменты описываются с помощью директивы SEGMENT • Синтаксическое описание сегмента представляет собой следующую конструкцию <имя сегмента> SEGMENT [параметры] <тело сегмента> <имя сегмента> ENDS Описание сегментов на языке Assembler Параметры директивы SEGMENT <имя сегмента> SEGMENT [тип выравнивания] [ тип комбинирования] [класс сегмента] [ тип размера сегмента] • У параметров много возможных значений. Примеры использования стандартных директив Описание сегмента кода code segment begin: mov ax, data mov ds, ax <команды> code ends Описание сегмента данных data segment <описание данных> data ends Описание сегментов на языке Assembler С помощью директивы ASSUME можно сообщить транслятору какой сегмент к какому сегментному регистру привязан. Формат директивы : ASSUME <сегментный сегмента> Пример: assume cs: code, ds: data регистр>:<имя Структура программы с тремя сегментами assume cs: code, ds: data сode segment begin: mov ax, data mov ds, ax <команды> code ends data segment <описание данных> data ends Stk segment stack db 256 dup (?) Stk ends end begin Порядок описания сегментов не имеет значения В ОП сегменты попадут в том порядке, в каком описаны в программе Стандартные и упрощенные директивы сегментации • Стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные и упрощенные директивы сегментации • Стандартные директивы используются, когда программист желает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей. • Упрощенные директивы целесообразно использовать - для простых программ - программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Используем упрощенные директивы сегментации