Упрощенные директивы сегментации

advertisement
Директивы сегментации.
Упрощенные директивы
сегментации.
Лекция
доцента кафедры ИВТ ГрГУ
кандидата технических наук
Ливак Е.Н.
Сегментные регистры
Микропроцессор имеет 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
Порядок описания сегментов
не имеет значения
В ОП сегменты попадут
в том порядке,
в каком описаны
в программе
Стандартные и упрощенные
директивы сегментации
• Стандартные и упрощенные директивы
сегментации не исключают друг друга.
Стандартные и упрощенные
директивы сегментации
• Стандартные директивы используются, когда
программист
желает
получить
полный
контроль над размещением сегментов в памяти
и их комбинированием с сегментами других
модулей.
• Упрощенные директивы целесообразно
использовать
- для простых программ
- программ, предназначенных для связывания с
программными модулями, написанными на языках
высокого уровня.
Используем
упрощенные
директивы
сегментации
Download