 |
личину к far-указателю, то изменяется только смещение. Если ре-
зультат сложения превышает величину FFFF (это максимально возмож-
ная величина смещения), то указатель делает циклический переход
назад, к началу сегмента. Например, результатом прибавления 1 к
5031:FFFF, будет 5031:0000 (а не 6031:0000). Аналогично, если вы
вычитаете 1 из 5031:0000, то получите 5031:FFFF (а не 5030:000F).
Если вы хотите сравнить указатели, то надежнее использовать
или near-указатели, которые всегда используют один и тот же адрес
сегмента, или huge-указатели, описание которых следует далее.
Указатели типа HUGE
-----------------------------------------------------------------
Указатели типа huge (также как и far) имеют 32-битную длину
и содержат как адрес сегмента, так и смещение. Однако, в отличие
от far, они нормализованы с целью решения проблем, рассмотренных
в предыдущем разделе.
- 327,328 -
Что такое указатель типа huge? Это 32-битный указатель, ко-
торый имеет наибольшую из возможных величину адреса сегмента. Так
как сегмент всегда начинается с адреса, кратного 16 (или 10h), то
это означает, что смещение может принимать значения от 0 до 15
(от 0h до Fh).
Как нормализовать указатель? Очень просто: переведите его в
20-битный адрес, затем используйте правые 4 бита для смещения и
левые 16 бит для адреса сегмента. Например, дан указатель
2F84:0532; мы переведем его в абсолютный адрес 2FD72, который за-
тем нормализуется в 2FD7:0002. Приведем несколько указателей и их
нормализованные значения:
0000:0123 0012:0003
0040:0056 0045:0006
500D:9407 594D:0007
7418:D03F 811B:000F
Теперь вы знаете, что указатели типа huge всегда хранятся
нормализованными. Почему это важно? Потому, что для любого данно-
го адреса памяти имеется только один возможный указатель типа
huge - пара "сегмент:смещение". Это означает, что операторы >,
>=, <, <= дадут правильный ответ для любого указателя типа huge.
Дополнительно к этому, все операторы >, >=, <, <= используют
полную 32-битную величину указателя типа huge. Нормализация га-
рантирует, что их результат всегда будет корректным.
И, наконец, благодаря нормализации, смещение в указателе ти-
па huge автоматически делает циклический переход, при достижении
величины 16, но, в отличие от far, сегмент также увеличивается.
Например, если вы увеличиваете 811B:000F, то результат будет
811C:0000; аналогично, если вы уменьшаете 811C:0000, то получите
811B:000F. Эта особенность указателей типа huge позволяет манипу-
лировать структурами данных свыше 64К.
Однако при использовании указателей типа huge возрастают до-
полнительные расходы. Арифметические операции над указателями ти-
па huge выполняются с вызовом специальных подпрограмм, и поэтому
они выполняются гораздо медленнее, чем над указателями типа near
и far.
- 329,330 -
Шесть моделей памяти в Турбо Си
-----------------------------------------------------------------
Турбо Си позволяет вам избежать накладных расходов, исключая
те случаи, когда вы сами этого не хотите. Существует шесть раз-
личных моделей памяти, которые вы можете выбирать: крохотная (на-
именьшая), малая, средняя, компактная, большая и огромная. Какую
из них выбрать, зависит от ваших требований. Вот краткая характе-
ристика каждой из них:
Крохотная
---------
Как вы можете предположить, это самая маленькая из моделей
памяти. Все четыре сегментных регистра (DS,CS,SS,ES) указывают на
один и тот же адрес, поэтому вы имеете всего 64К для всех прог-
рамм, данных и массивов. В этом случае используются только
near-указатели. Используйте эту модель, когда у вас маленькая
оперативная память. Программы с крохотной моделью памяти могут
быть переведены в .COM формат.
Малая
-----
Программный сегмент и сегмент данных различны и не перекры-
ваются, поэтому у вас есть 64К для программ и 64К для статических
данных. Сегменты стека и дополнительные сегменты данных начинают-
ся с того же адреса, что и сегмент данных. В этом случае исполь-
зуются только near-указатели. Это наилучшая модель для большинс-
тва реализаций.
Средняя
-------
Far-указатели используются для программ, но не для данных. В
результате статические данные ограничены 64К, но программа может
иметь величину до 1М. Эта модель является наилучшей для больших
программ, которые не хранят в памяти больших обьемов данных.
Компактная
----------
Прямо противоположна средней, т.е. far-указатели используют-
ся для данных, а не для программ. Программы ограничиваются вели-
чиной в 64К, а данные (но не статические) могут быть до 1Мб. Эта
модель наиболее удобна, если ваша программа маленькая, но вам не-
обходимо адресовать большие объемы данных.
- 331,332 -
Большая
-------
Far-указатели используются как для программы, так и для дан-
ных. И программа, и данные занимают область до 1М; эта модель не-
обходима только для очень больших программных продуктов.
Огромная
--------
Far-указатели используются для программы и для данных. Турбо
Cи обычно ограничивает величину статических данных до 64К; огром-
ная модель памяти снимает это ограничение, позволяя статическим
данным занимать пространство более 64К.
Иллюстрации (Рис. 12.2-12.7) показывают, как в микропроцес-
соре 8086 реализуется 6 моделей памяти Турбо Си.
Сегментные Размер
регистры: Нач.адрес. сегмента:
CS,DS,SS -->ЙНННННННННННННННННННННННННННННН»
Й є_TEXT class 'CODE'Программа є »
є МНННННННННННННННННННННННННННННН№ є
DGROUP Н№ є_DATA class 'DATA'иниц.данные є є
є МНННННННННННННННННННННННННННННН№ є
И є_BSS class 'BSS'не иниц,данныеє є
МНННННННННННННННННННННННННННННН№ МН до 64К
є ХИП є є
МНННННННННННННННННННННННННННННН№ є
є Свободная область є є
SР(ТOS) -->МНННННННННННННННННННННННННННННН№ є
Стартовый SP-->є СТЕК є ј
ИННННННННННННННННННННННННННННННј
Конеч.адрес.
Рис. 12.2. Крохотная модель сегментации памяти
- 333,334 -
Сегментные Размер
регистры: сегмента:
Нач.адрес.
CS -->ЙНННННННННННННННННННННННННННННН»
є_TEXT class 'CODE' программа є до 64К
DS,SS -->МНННННННННННННННННННННННННННННН№
Й є_DATA class 'DATA'иниц.данные є »
DGROUР Н№ МНННННННННННННННННННННННННННННН№ є
И є_BSS class 'BSS'не иниц.данныеє є
МНННННННННННННННННННННННННННННН№ є
є ХИП є МН до 64К
МНННННННННННННННННННННННННННННН№ є
є Свободная область є є
SP(TOS) -->МНННННННННННННННННННННННННННННН№ є
є СТЕК є ј
Стартовый SP-->МНННННННННННННННННННННННННННННН№ до конца
є FAR ХИП є памяти
МНННННННННННННННННННННННННННННН№
є Свободная область є
ИННННННННННННННННННННННННННННННј
Конеч.адрес.
Рис.12.3. Малая модель сегментации памяти
|