Вопрос № 20831: Доступная память компилятору Borland C++ for DOS 64 Kbytes. Возможно ли выделить больше? Если да, то каком способом?...
Вопрос № 20831
Доступная память компилятору Borland C++ for DOS 64 Kbytes. Возможно ли выделить больше? Если да, то каком способом?
Отправлен: 13.05.2005, 23:35
Вопрос задал: MikeR (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Jadd
Здравствуйте, MikeR!
Это не совсем так, как вы описываете. Существуют разные модели памяти и связанные с ними типы указателей. Коротко перечислю и опишу их и их особенности. Как вы знаете, физический адрес формируется парой сегмент-смещение. При формировании физического адреса в качестве его сегментной част процессор использует значения, которые находятся в сегментных регистрах CD, DS, SS, ES. Максимальный размер сегмента - 64К. Та часть программы, которая адресуется без изменения значения в сегментном регистре, называется сегментом
программы. Если явное переопределение сегментов не происходит в программе, сегментные регистры юзаются следующим образом:1) значение в CS - при формировании адреса следующей комманды (CS:IP). Значениев CS меняется только при использовании FAR вызовов, FAR безусловных передач, FAR возвратов, инструкций програмных прерываний. 2) значение в DS - для формирования физического адреса данных, учавствующих в выполняемой процессором операции. 3)значение в ES - для формирования
адреса данных вместо значения в DS при переопределении сегментной части адреса данных или при выполнении комманд переноса данных из одной области памяти в другую (цепочечные примитивы). 4) значение в SS для доступа к стеку. Так вот. Для чего я это все пишу. Все эти моменты ВАЖНЫ для понимания указателей, вернее их форм. В зависимости от потребностей программы указатели бывают near и far. Near указатель задает только смещение объекта адреса, т.е. смещение относительно начала сегмента. В качестве сегментной
части адреса объекта используется текущее значение регистра DS. Поэтому такие указатели занимают в памяти 2 байта и могу адресовать не более 64К. Far указатели задает полный адрес, т.е. сегмент:смещение и занимает 4 байта. Он позволяет адресовать любой байт в адресном пространстве. При доступе к объекту данных по значению указателя сегмент адреса помещается в сегментный регистр, как правилов ES. А частным случаем far-указателя является huge-указатель. Теперь главное. Испол
ьзуемая форма указателя может задаваться либо явно, либо неявно
(т.е. по дефолту). Форму указателя по дефолту определяет выбранная модель памяти:TINY, SMALL, MEDIUM, COMPACT, LARGE и HUGE. Для моделей TINY, SMALL и medium дефолтовые указатели - near. Для моделей COMPACT, LARGE и HUGE - far-указатели. Т.е. в Вашем случае нужно в опциях компилятора выставить иную модель памяти, чтобы программа могла адресовать большие объемы памяти или явно задавать тип указателей на far или huge. Кстати, более подробное описание моделей памяти есть в хелпе к BC++. Надеюсь, что не утомил
подробностями, но тут важно фундаментальное понимание проблемы. Удачи.
Ответ отправил: Jadd (статус: 3-ий класс)
Отправлен: 14.05.2005, 11:03 Оценка за ответ: 5
Отвечает: DSota
Здравствуйте, MikeR!
Jadd уже все рассказал про теорию, добавлять тут нечего... Это только теории много, а используется все это очень просто:
Приложение:
Ответ отправил: DSota (статус: Студент)
Отправлен: 16.05.2005, 09:23 Оценка за ответ: 4