У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент



Реферат - Assembler
42
объединение в группу всех сегментов кода программы (обычно для этого используется класс "code"). С помощью механизма типизации класса можно группировать также сегменты инициализированных и неинициализированных данных;

Атрибут размера сегмента. Для процессоров i80386 и выше сегменты могут быть 16 или 32-разрядными. Это влияет, прежде всего, на размер сегмента и порядок формирования физического адреса внутри него. Атрибут может принимать следующие значения:

USE16 - это означает, что сегмент допускает 16-разрядную адресацию. При формировании физического адреса может использоваться только 16-разрядное смещение. Соответственно, такой сегмент может содержать до 64 Кбайт кода или данных;

USE32 - сегмент будет 32-разрядным. При формирования физического адреса может использоваться 32-разрядное смещение. Поэтому такой сегмент может содержать до 4 Гбайт кода или данных.

Все сегменты сами по себе равноправны, так как директивы SEGMENT и ENDS не содержат информации о функциональном назначении сегментов. Для того чтобы использовать их как сегменты кода, данных или стека, необходимо предварительно сообщить транслятору об этом, для чего используют специальную директиву ASSUME, имеющую формат, показанный на рис. 15. Эта директива сообщает транслятору о том, какой сегмент к какому сегментному регистру привязан. В свою очередь, это позволит транслятору корректно связывать символические имена, определенные в сегментах. Привязка сегментов к сегментным регистрам осуществляется с помощью операндов этой директивы, в которых имя_сегмента должно быть именем сегмента, определенным в исходном тексте программы директивой SEGMENT или ключевым словом nothing. Если в качестве операнда используется только ключевое слово nothing, то предшествующие назначения сегментных регистров аннулируются, причем сразу для всех шести сегментных регистров. Но ключевое слово nothing можно использовать вместо аргумента имя сегмента; в этом случае будет выборочно разрываться связь между сегментом с именем имя сегмента и соответствующим сегментным регистром (см. рис. 15).

Рис. 15. Директива ASSUME 

На уроке 3 мы рассматривали пример программы с директивами сегментации. Эти директивы изначально использовались для оформления программы в трансляторах MASM и TASM. Поэтому их называют стандартными директивами сегментации.

Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить ее описание. Для этого в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Но здесь возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при использовании упрощенных директив сегментации директиву ASSUME можно не использовать). Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds все равно придется).

В листинге 1 приведен пример программы с использованием упрощенных директив сегментации:         

Листинг 1. Использование упрощенных директив сегментации

;---------Prg_3_1.asm-------------------------------

masm                    ;режим работы TASM: ideal или masm

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

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

message db      'Введите две шестнадцатеричные цифры,$'

.stack                  ;сегмент стека       

db     256    dup ('?')       ;сегмент стека

.code                   ;сегмент кода

main   proc            ;начало процедуры main       

mov    ax,@data        ;заносим адрес сегмента данных в регистр ax       

mov    ds,ax  ;ax в ds

;далее текст программы (см. сегмента кода в листинге 3.1 книги)       

mov    ax,4c00h        ;пересылка 4c00h в регистр ax       

int    21h             ;вызов прерывания с номером 21h

main   endp            ;конец процедуры main

end    main            ;конец программы с точкой входа main

Синтаксис директивы MODEL показан на рис. 16.

Рис. 16. Синтаксис директивы MODEL

Обязательным параметром директивы MODEL является модель памяти. Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типы сегментов, которые определяются упомянутыми нами ранее упрощенными директивами описания сегментов. Эти директивы приведены в табл. 3.

Таблица 3. Упрощенные директивы определения сегмента

Формат директивы 
(режим MASM) | Формат директивы 
(режим IDEAL) | Назначение

.CODE [имя] | CODESEG[имя] | Начало или продолжение сегмента кода

.DATA | DATASEG | Начало или продолжение сегмента инициализированных данных. Также используется для определения данных типа near

.CONST | CONST | Начало или продолжение сегмента постоянных данных (констант) модуля

.DATA? | UDATASEG | Начало или продолжение сегмента неинициализированных данных. Также используется для определения данных типа near

.STACK [размер] | STACK [размер] | Начало или продолжение сегмента стека модуля. Параметр [размер] задает размер стека

.FARDATA [имя] | FARDATA [имя] | Начало или продолжение сегмента инициализированных данных типа far

.FARDATA? [имя] | UFARDATA [имя] | Начало или продолжение сегмента неинициализированных данных типа far

Наличие в некоторых директивах параметра [имя] говорит о том, что возможно определение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимость с некоторыми компиляторами языков высокого уровня, которые создают разные сегменты данных для инициализированных и неинициализированных данных, а также констант.

При использовании директивы MODEL транслятор делает доступными несколько идентификаторов, к которым можно обращаться во время работы программы, с тем, чтобы получить информацию о тех или иных характеристиках данной модели памяти (см. ). Перечислим эти идентификаторы и их значения (табл. 4). Таблица 4. Идентификаторы, создаваемые директивой MODEL

Имя идентификатора | Значение переменной

@code | Физический адрес сегмента кода

@data | Физический адрес сегмента данных типа near

@fardata | Физический адрес сегмента данных типа far

@fardata? | Физический адрес сегмента неинициализированных данных типа far

@curseg | Физический адрес сегмента неинициализированных данных типа far

@stack | Физический адрес сегмента стека

Если вы посмотрите на текст , то увидите пример использования одного из этих идентификаторов. Это @data; с его помощью мы получили значение физического адреса сегмента данных нашей программы.

Теперь можно закончить обсуждение директивы MODEL. Операнды директивы MODEL используют для


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12