Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodichka_lek_OAiP_Meleshko.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
377.68 Кб
Скачать

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

Для простых программ, содержащих по одному сегменту для кода, данных и стека описание упрощено. Для этого в трансляторы 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

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