![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Для простых программ, содержащих по одному сегменту для кода, данных и стека описание упрощено. Для этого в трансляторы MASM и TASM введена возможность использования упрощенных директив сегментации. Совместно с упрощенными директивами сегментации используют директиву указания модели памяти MODEL. Эта директива связывает сегменты, которые, в случае использования упрощенных директив сегментации, имеют предопределенные имена с сегментными регистрами (хотя явно инициализировать DS все равно необходимо).
Обязательным параметром директивы MODEL является модель памяти.
Таблица 2. – Модели памяти
Модель | Тип кода | Тип данных | Назначение модели |
TINY | near | near | Код и данные объединены в одну группу с именем DGROUP. Используется для создания программ формата .сом. |
SMALL | near | near | Код занимает один сегмент, данные объединены в одну группу с именем DGROUP. Эту модель обычно используют для большинства программ на ассемблере. |
MEDIUM | far | near | Код занимает несколько сегментов, по одному на каждый объединяемый программный модуль. Все ссылки на передачу управления - типа far. Данные объединены в одной группе, все ссылки на них - типа near. |
COMPACT | near | far | Код в одном сегменте, ссылка на данные - типа far. |
LARGE | far | far | Код в нескольких сегментах, по одному на каждый объединяемый программный модуль. |
FLAT | near | near | Код и данные в одном 32-битном сегменте (плоская модель ОП). |
Таблица 3. – Упрощенные директивы определения сегмента
Формат директивы | Назначение |
.CODE[имя] | Начало или продолжение сегмента кода |
.DATA | Начало или продолжение сегмента инициализированных данных. Используется также для определения данных типа near |
.CONST | Начало или продолжение сегмента постоянных данных (констант) модуля |
.DATA? | Начало или продолжение сегмента неинициализированных данных. Используется также для определения данных типа near |
.STACK [размер] | Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека |
.FARDATA [имя] | Начало или продолжение сегмента инициализированных данных типа far |
.FARDAТА? [имя] | Начало или продолжение сегмента неинициализированных данных типа far |
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы.
Операнды директивы MODEL используются для задания модели памяти, которая определяет набор сегментов программы, размеры сегментов данных и кода, способ связывания сегментов и сегментных регистров. В следующей таблице приведены некоторые значения параметров модели памяти директивы MODEL.
Таблица 4. – Идентификаторы, создаваемые директивой MODEL
Имя идентификатора | Значение переменной |
@code | Физический адрес сегмента кода |
@data | Физический адрес сегмента данных типа near |
@fardata | Физический адрес сегмента данных типа far |
@fardata? | Физический адрес сегмента инициализированных данных типа far |
@curseg | Физический адрес сегмента неинициализированных данных типа far |
@stack | Физический адрес сегмента стека |
Для сравнения приведем три листинга с программами на ассемблере. Функционально они одинаковы и выводят на консоль сообщение: «Hello World!».
Листинг 1 содержит программу со стандартными директивами сегментации, а листинг 2, соответственно, — с упрощенными, листинг 3 содержит программу типа.com.
Листинг 1. Использование стандартных директив сегментации.
data segment para public 'data'
message db 'Hello World! $'; сегмент данных
data ends
stk segment stack; сегмент стека
db 256 dup ('?')
stk ends
code segment para public 'code'; начало сегмента кода
start:; точка входа в программу
assume cs:code,ds:data,ss:stk
mov ax,data; адрес сегмента данных
mov ds,ax; в регистр ах
mov ah,9h ;загрузка номера функции
mov dx,offset message ;загрузка смещения строки
int 21h; вывод сообщения на экран
mov ax,4c00h ;функция завершения
int 21h
code ends; конец сегмента кода
end start; конец программы с точкой входа start
Листинг 2. Использование упрощенных директив сегментации.
masm; режим работы для TASM
.model small; модель памяти
.data; сегмент данных
message db 'Hello World$’
.stack 256; сегмент стека 256 байт
.code; сегмент кода
start:
mov ax,@data
mov ds,ax
mov ah,9h
mov dx,offset message
int 21h
mov ax,4c00h
int 21h
end start
Листинг 3. Создание программы типа.com.
.model small
.code
org 100h ;смещение на 100h от начала сегмента
begin:
jmp start ;переход на метку start
message db 'Hello World$’
start:
mov ah,9h
mov dx,offset message
int 21h
mov ax,4c00h
int 21h
end begin
Дата публикования: 2014-12-08; Прочитано: 599 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!