Скачиваний:
23
Добавлен:
11.05.2015
Размер:
998.91 Кб
Скачать

8.6. Модели памяти и упрощенные директивы определения сегментов

Модели памяти задаются директивой:

.model модель, язык, модификатор

Применяются следующие модели памяти:

1. TINY — код, данные и стек размещаются в одном и том же сегменте и объединены в группу с именем DGROUP. Используется для создания программ типа .COM.

2. CMALL — код размещается в одном сегменте, а объединенные данные — в другом с именем DGROUP.

3. MEDIUM — код в нескольких сегментах, а данные в одном сегменте. Ссылки на передачу управления типа программы far; для обращения к данным — near.

4. COMPACT — программный код в одном сегменте, а данные в нескольких сегментах, так что для обращения к данным необходимо указать код и сегмент.

5. LARGE и HUGE — и код и данные занимают несколько сегментов (Far, Far).

6. FLAT — то же, что и TINY, но используется 32-битные сегменты. Размер сегмента 4 мегабайта.

Язык — необязательный операнд: С, PASCAL, BASIC, FORTRAN.

Модификатор — определяет некоторые особенности вызова процедур.

Директивой .model создается ряд идентификаторов, которые в дальнейшем можно использовать.

@code

– физический адрес сегмента кода.

@data

– физический адрес сегмента данных типа near.

@fardata

– физический адрес сегмента данных типа far.

@fardata?

– физический адрес сегмента неинициализированных данных типа far.

@curseg

– физический адрес сегмента неинициализированных данных типа far.

@stack

– физический адрес сегмента стека.

Пример.

Загрузка физического адреса сегмента данных:

MOV ax, @data

MOV ds, ax

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

Упрощенные директивы объединяют действия директив segment и assume.

.сode имя сегмента — определяет сегмент кода.

Это описание эквивалентно следующим описаниям:

_text segment word public ‘code’,

для моделей памяти TINY, CMALL, COMPACT;

name_text segment word public ‘code’

для моделей памяти MEDIUM, HUGE, LARGE.

Директива .stack размер

Эквивалентно описанию: STACK segment para public ‘stack’

(размер по умолчанию = 1 Кбайт).

.data сегменты данных

_DATA segment word public ‘DATA’

.DATA ? – сегмент неинициализированных данных.

_BSS segment word public ‘BSS’ (располагается сразу после конца программы).

.сonst (констант)

const segment word public ‘COMST’

.fardata имя сегмента – сегмент дальних данных требует загрузки сегментного регистра

имя_сегмента segment para private ‘FARDATA’

Дальний сегмент неинициализированных данных

Имя_сегмента segment para private ‘FAR_BSS’

Если нет, то к сегменту обращаются по имени.

8.8. Создание программы на ассемблере

Самая первая программа, которую пишет пользователь, это программа вывода сообщения на экран. Приведем программу:

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

.model small ; модель памяти

.stack 100h ; сегмент стека размером в 256 байт

.сode

start : MOV ax, DGROUP ; сегментный адрес строки message

MOV ds, ax ; перемещается в ds

MOV dx,offset message ; занесли в dx смещение massage

MOV ah, 9 ;в регистр ah=09h и в DS:DX – адрес строки,

заканчивающейся символом $.

INT 21h ; функция DOS – вывод строки

MOV ax, 4C00h

INT 21h ; функция DOS – завершить программу

.data ; сегмент данных

message db “Hello World!”, 0dh, 0Ah, ‘$’

end start

Здесь определена модель памяти Small, и три сегмента — стека, кода и данных.

Для ввода исходного текста можно использовать любой редактор с кодировкой DOS. Программа должна иметь расширение *.asm.

Соседние файлы в папке Введение в вычислительную технику.