Программирование >>  Перегруженные имена функций и идентификаторы 

1 ... 55 56 57 [ 58 ] 59 60 61 ... 210


Программирование со смешанными моделями и модификаторы адресации

Borland C ++ вводит восемь новых ключевых слов, отсутствующих в языке Си стандарта ANSI (near, far, huge, cs, ds, es, ss и seg), которые с некоторыми ограничениями и предупреждениями могут использоваться в качестве модификаторов для указателей (и в некоторых случаях, для функций).

В Borland C++ при помощи ключевых слов near, far или huge вы можете модифицировать объявления функций и указателей. Указатели данных near, far и huge рассматривались выше. Объекты far объявляются при помощи ключевого слова far. Функции near запускаются при помощи ближних вызовов (near), а выход из них происходит с использованием ближних команд возврата. Аналогичным образом, функции far вызываются дальними вызовами (far) и выполняют дальний (far) возврат. Функции huge похожи на функции far, за исключением того, что функции huge устанавливают регистр DS в новое значение, тогда как функции far не изменяют значения этого регистра.

Существует также четыре специальных ближних (near)

указателя данных: cs, ds, es и ss. Имеются 16-битовые

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

char ss *p;

то p будет содержать 16-битовое смещение в сегмент стека.

Функции и указатели в данной программе по умолчанию бывают ближними или дальними, в зависимости от выбранной модели памяти. Если функция или указатель являются ближними, то они автоматически связываются с регистром CS или DS.

В следующей таблице показано, как это происходит. Отметим, что размер указателя соответствует предельному размеру памяти, равному 64К (ближний, в пределах сегмента) или 1 Мб (дальний, содержит собственный адрес сегмента).



Типы указателей

Модель памяти

Указатели функции Указатели данных

Tiny

near, cs

near, ds

Small

near, cs

near, ds

Medium

near, ds

Compact

near, cs

Large

Huge

Указатели сегментов

В объявлениях типа указателя сегмента используется seg.

В результате получаются 16-битовые указатели сегментов. Синтаксис seg следующий:

тип данных seg *идентификатор Например,

int seg *name

Любое обращение по сс1лке через идентификатор предполагает смещение 0. В арифметических операциях с указателями выполняются следующие правила:

Нельзя использовать с указателями сегментов операции ++, --, +- ии -=.

Нельзя вычитать один указатель сегмента из другого.

При сложении сегментного указателя с ближним (near) указателем результатом будет дальний (far) указатель, который формируется из сегмента, задаваемого сегментным указателем, и смещения из ближнего указателя. Эта операция разрешена только в том случае, если два указателя указывают на один и тот же тип, либо если один из указателей указывает на тип void. Независимо от указываемого типа умножение смещения не происходит.

Когда сегментный указатель используется в выражении обращения по ссылке, он также неявно преобразуется в дальний указатель.

При выполнении операции сложения или вычитания целочисленного операнда и сегментного указателя



результатом является дальний указатель, где сегмент берется из сегментного указателя, а смещение получается умножением размера объекта, на который указывает целочисленный операнд. Арифметическая операция выполняется таким образом, как если бы целое складывалось с указателем far или вычиталось из него.

Сегментные указатели могут присваиваться,

инициализироваться, передаваться в функции и из функций, сравниваться, и т.д. (Сегментные указатели сравниваются по правилам для unsigned int). Другими словами, за исключением перечисленных выше ограничений, они обрабатываются так же, как и любые другие указатели.

Объявление дальних объектов

Borland С++ позволяет объявлять дальние (far) объекты. Например:

int far x = 5; int far z;

extern int far y = 4; static long j;

Компилятор Borland C++ создает для каждого дальнего объекта отдельный сегмент. Параметры компилятора командной строки -zE, -zF и -zH (которые могут также задаваться директивой #pragma option) влияют на имя, класс и группу дальнего сегмента, соответственно. Изменяя эти значения при помощи указания #pragma option, вы тем самым распространяете новые установки на все объявления дальних объектов. Таким образом, для создания в конкретном сегменте дальнего объекта, можно использовать следующую последовательность:

#pragma option -zEmysegment -zHmygroup -zFmyclass int far x;

#pragma option -zE* =zH* -zF*

Тем самым x будет помещен в сегмент MYSEGMENT с классом MYCLASS в группе MYGROUP, после чего все дальние объекты будут сброшены в значения, используемые по умолчанию. Отметим, что при использовании этих параметров можно поместить несколько дальних объектов в один сегмент:

#pragma option -zEcombined -zFmyclass int far x;



1 ... 55 56 57 [ 58 ] 59 60 61 ... 210

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика