
- •МІнІстерство оСвІти і науКи УкраЇни
- •Двоичные числа
- •Шестнадцатеричные числа
- •1.2.4. Числа со знаком.
- •Знаковый бит
- •Дополнение до двух.
- •1.2. Представление данных.
- •00001001 (Инверсия бит)
- •Максимальные и минимальные значения
- •Лабораторная работа №2
- •Трансляция программы
- •Компоновка программы
- •Отладка программы
- •Лабораторная работа №3
- •Теоретическая часть Упрощенные директивы сегментации
- •I этап.
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №7
- •Вариант №1. (*)
Лабораторная работа №3
Цель работы: изучить упрощенные директивы сегментации пакета TASM, директивами объявления переменных и правилами формирования COM-файлов.
Теоретическая часть Упрощенные директивы сегментации
Мы рассматривали программы с директивами сегментации. Эти директивы изначально использовались для оформления программ в трансляторах MASM и TASM. Поэтому их называют стандартными директивами сегментации.
Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить их описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые, в случае использования упрощенных директив сегментации, имеют предопределенные имена с сегментными регистрами (хотя явно инициализировать DS все равно придется).
Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель памяти для программного модуля (табл 3.1).
В режиме MASM используется тот же синтаксис, но директива имеет вид .MODEL.
"Модель_памяти" и "модификатор_модели" определяют модель сегментации памяти, используемую в программе.
В применяемых в Турбо Ассемблере стандартных моделях можно использовать специальные сегменты для:
- кода;
- инициализированных данных;
- неинициализированных данных;
- инициализированных данных дальнего типа;
- неинициализированных данных дальнего типа;
- констант;
- стека.
Сегмент кода содержит обычно код модуля (но при необходимости может также содержать данные). В целях совместимости с языками высокого уровня инициализированные данные и константы интерпретируются по-разному. Они содержат такие данные, как сообщения, когда важно начальное значение. Неинициализированные данные и стек содержат данные, начальные значения которых не существенны. Инициализированные данные дальнего типа (far) - это неинициализированные данные, которые не являются частью стандартного сегмента данных, и которые доступны только при изменении значения сегментного регистра. Это же относится к неинициализированным данным дальнего типа, только вместо инициализированных данных здесь содержатся неинициализированные данные.
Специальные модели памяти задают, как можно ссылаться на эти сегменты с помощью сегментных регистров, и как они объединяются в группы (если это имеет место). При написании программы вы должны хранить эти сегменты отдельно, независимо от размера программы. Затем для объединения сегментов в группы вы можете выбрать соответствующую модель. Если вы храните эти сегменты раздельно, и ваша программа увеличивается в размере, вы можете использовать большую модель.
Единственным обязательным параметром директивы MODEL является модель памяти. Каждая стандартная модель памяти описывается в Таблице 3.1.
Стандартные модели памяти
Таблица 7.1
Модель |
Тип кода |
Тип данных |
Назначение модуля |
TINY |
NEAR |
NEAR |
Весь код и все данные комбинируютсяв одну группу с именем DGROUP. Эта модель используется для программ, ассемблируемых в формат .COM |
SMALL |
NEAR |
NEAR |
Код представляет собой один сегмент. Все данные комбинируются в группу с именем DGROUP. Это наиболее общая модель, использующаяся для абольшинства программ на Ассемблере. |
MEDIUM |
FAR |
NEAR |
Для кода используется несколько сегментов, по одному на модуль. Данные находится в группе с именем DGROUP |
COMPACT |
NEAR |
FAR |
Код находится в одном сегменте. Ссылка на данные – типа FAR. |
LARGE |
FAR |
FAR |
Для кода используется несколько сегментов, по одному на каждый объединяемый программный модуль. |
FLAT |
NEAR |
NEAR |
Код и данные в одном 32-битном сегменте (плоская модель памяти) |
Предполагается, что программный модуль может иметь только опредленные типы сегментов, которые определяются так называемыми упрощенными директивами описания сегментов. Эти директивы приведены в табл. 3.2.
Табл. 3.2
Формат директивы (режим MASM) |
Формат директивы (режим IDEAL) |
Назначение |
.CODE |
CODESEG |
Начало или продолжение сегмента кода |
.DATA |
DATASEG |
Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа NEAR |
.CONST |
CONST |
Начало или продолжение сегмента постоянных данных (констант) модуля. |
.DATA? |
UDATASEG |
Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа NEAR |
.STACK [размер] |
STACK [размер] |
Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека |
.FARDATA [имя] |
FARDATA [имя] |
Начало или продолжение сегмента инициализированных данных типа FAR |
.FARDATA? [имя] |
UFARDATA [имя] |
Начало или продолжение сегмента инициализированных данных типа FAR |
При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (табл. 3.1). Перечислим эти идентификаторы и их значения (табл. 3.3).
Табл. 3.3
Имя идентификатора |
Значение переменной |
@code |
Физический адрес сегмента кода |
@data |
Физический адрес сегмента данных типа NEAR |
@fardata |
Физический адрес сегмента данных типа FAR |
@fardata? |
Физический адрес сегмента неинициализированных данных типа NEAR |
@stack |
Физический адрес сегмента стека |
Описанные нами стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные директивы используются, когда программист желает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей. Упрощенные директивы целесообразно использовать для простых программ и программ, предназначенных для связывания с программными модулями, написанными на языках высокого уровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.
ЗАДАНИЕ