Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Турбо Ассемблер / Использование Турбо Ассемблера /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Использование моделей памяти программы и сегментации - Программирование от RIN.RU
Использование моделей памяти программы и сегментации



Определение общих сегментов и групп


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


Директива SEGMENT


Директива SEGMENT открывает сегмент. Все последующие код или данные до директивы ENDS, которая закрывает сегмент, будут включены в этот сегмент.


В режиме Ideal директива SEGMENT имеет следующий синтаксис:


SEGMENT имя [атрибуты]


В режиме MASM директива SEGMENT имеет следующий синтаксис:


имя SEGMENT [атрибуты]


где "имя" - это имя сегмента. Назначать сегментам имена нужно в соответствии с их использованием. Примеры имен сегментов можно найти в Приложении A.


В одном сегменте вы можете несколько раз открыть и закрыть сегмент с одним и тем же именем. Турбо Ассемблер выполняет конкатенацию всех частей сегмента. Атрибуты сегмента нужно задавать только при первом его открытии.


Атрибуты могут включать в себя все или некоторые значения атрибутов сегмента, которые определяют следующее:


  • атрибут комбинирования сегмента;

  • атрибут класса сегмента:

  • атрибут выравнивания сегмента;

  • атрибут размера сегмента;

  • атрибут доступа к сегменту.


Примечание: Заметим, что Турбо Ассемблер обрабатывает значения атрибутов слева-направо.


Атрибут комбинирования сегментов


Атрибут комбинирования сегментов сообщает компоновщику, как нужно комбинировать сегменты различных модулей, имеющих одно и то же имя. Допустимые значения атрибута комбинирования сегмента перечисляются в следующем списке. Заметим, что если вы не указываете этот атрибут, Турбо Ассемблер предполагает PRIVATE.


Атрибут комбинирования сегмента
АтрибутЗначение
PRIVATEСегмент не будет комбинироваться с другими сегментами с тем же именем вне данного модуля. Будет выполняться конкатенация сегмента с сегментами с тем же именем вне данного модуля для образования одного непрерывного сегмента.
MEMORYТо же, что PUBLIC. Будет выполняться конкатенация сегмента с другими сегментами с тем же именем вне данного модуля для образования одного непрерывного сегмента, используемого как сегмент стека. Компоновщик инициализирует регистры SS SP начальными значениями, так что они указывают на конец данного сегмента.
COMMONРасполагает данный сегмент и все другие сегменты с тем же именем по одному адресу. Все сегменты с данным именем будут перекрываться и совместно использовать общую память. Размер полученного в результате сегмента будет равен размеру самого большого сегмента модуля.
VIRTUALОпределяет специальный вид сегмента, который должен описываться внутри охватывающего сегмента. Компоновщик интерпретирует его как общую область и присоединяет его к охватывающему сегменту. Виртуальный сегмент наследует свои атрибуты из охватывающего сегмента. Директива ASSUME рассматривает виртуальный сегмент как часть порождающего сегмента. Во всех других отношениях виртуальный сегмент представляет собой общую область памяти, которая используется разными сегментами. Это позволяет организовать совместное использование статических данных, которые берутся различными модулями из включаемых файлов.
AT xxxРасполагает сегмент по абсолютному адресу параграфа. Адрес задается параметром xxx. Компоновщик для сегмента AT не порождает никаких данных или кода. Используйте директиву AT для организации доступа по идентификатору к фиксированным адресам памяти (например, экран дисплея или области ПЗУ).



Атрибут класса сегмента


Атрибут класса сегмента - это заключенная в кавычки строка, которая помогает компоновщику определить соответствующий порядок сегментов при собирании их в программу из модулей. Компоновщик объединяет вместе в памяти все сегменты с одним и тем же именем класса. Типичным примером использования имени класса является объединение в группу всех сегментов кода программы (обычно для этого используется класс CODE). С помощью механизма класса группируются также данные и неинициализированные данные.


Атрибут выравнивания сегмента


Атрибут выравнивания сегмента сообщает компоновщику, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, поскольку при правильном выравнивании доступ к данным в процессорах 80х86 выполняется быстрее. Допустимые значения этого атрибута приведены в следующей таблице:


Атрибут выравнивания сегмента
АтрибутЗначение
BYTE Выравнивание не выполняется. Сегмент начинается с границы следующего байта.
WORDНачинает сегмент на границе следующего слова.
DWORDНачинает сегмент на границе следующего двойного слова.
PARA Начинает сегмент на границе следующего параграфа (выравнивание на 16 байт).
PAGE Начинает сегмент на границе следующей страницы (выравнивание на 256 байт).
MEMPAGE Начинает сегмент на границе следующей страницы памяти (выравнивание на 4 килобайта).



Если вы не задаете тип выравнивания, Турбо Ассемблер подразумевает PARA.


Атрибут размера сегмента


Если текущим выбранным процессором является процессор 80386, то сегменты могут быть 16- или 32-разрядными. Размер атрибута сегмента сообщает компоновщику, какой размер вы хотите задать для конкретного сегмента. Допустимые значения атрибута приведены в следующей таблице:


Значения атрибута размера сегмента
АтрибутЗначение
USE16Сегмент будет 16-разрядным. Такой сегмент может содержать до 64К кода или данных.
USE32Сегмент будет 32-разрядным. Такой сегмент может содержать до 4 гигабайт кода или данных.



Если в режиме MASM вы выбираете процессор 80386, то Турбо Ассемблер предполагает использование USE32. В режиме Ideal Турбо Ассемблер по умолчанию предполагает использование USE32.


Атрибут доступа к сегменту


В защищенном режиме для любого сегмента вы можете управлять доступом к определенным операциям с памятью, запрещая их. (Заметим, что данное средство поддерживается в настоящее время только компоновщиком Phar Lap. Если требуется использовать атрибут доступа к сегменту, вы должны компилировать совместимый с ним объектный код с помощью параметра командной строки /op.) Атрибут доступа к сегменту сообщает компоновщику, что к сегменту нужно применить специальные ограничения доступа.


Допустимые значения данного атрибута приведены в следующей таблице:


Значения атрибута доступа к сегменту
АтрибутЗначение
EXECONLYСегмент доступен только для выполнения.
EXECREADСегмент доступен только для чтения и выполнения.
READONLYСегмент доступен только для чтения.
READWRITE Сегмент доступен только для чтения и записи.



Если вы выбираете один из этих атрибутов или используете USE32, компоновщик Phar Lap предполагает, что сегмент предназначен для выполнения в защищенном режиме. Если вы выбираете USE32, но не задаете одно из этих значений, Турбо Ассемблер предполагает использование атрибута READONLY.


<<<  НазадВперед  >>>
 1  2  3  4  5  6  7 


 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Начало работы на Турбо Ассемблере

Использование директив и параметров

Общие принципы программирования

Объектно-ориентированное программирование

Использование выражений и значений идентификаторов

Директивы выбора процессора

Определение типов данных

Задание и использование счетчика адреса

Описание процедур

Управление областью действия идентификаторов

Определение данных

Расширенные инструкции

Использование макрокоманд

Использование условных директив

Интерфейс с компоновщиком

Генерация листинга

Интерфейс Турбо Ассемблера и Borland C++

Интерфейс Турбо Ассемблера с Турбо Паскалем

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь