6.3.1. Загальна характеристика моделей пам’яті

Turbo С підтримує 6 різних моделей пам’яті, кожна з яких має свої особливості адресації. В табл. 6.1 приведена зведена характеристика моделей пам’яті Turbo С.

Табл. 6.1. Моделі пам’яті Turbo С

Модель

 

Тип покажчика

 

Число 64К-байтовых сегментів для

 

пам’яті

 

(по умовчанню)

 

секцій програми

 

 

 

Дані

 

Функція

 

Дані

 

Код

 

Усього

 

Один об'єкт

 

TINY

 

near

 

near

 

Розділяють

 

   1

 

   1

 

SMALL

 

near

 

near

 

   1

 

    1

   2

 

   1

 

MEDIUM

 

near

 

far

 

   1

 

> 1

 

> 1

 

   1

 

COMPACT

 

far

 

near

 

> 1

 

    1

 

> 1

 

   1

 

LARGE

 

far

 

far

 

> 1

 

> 1

 

> 1

 

   1

 

HUGE

 

far

 

far

 

> 1

 

> 1

 

> 1

 

> 1

 

 

Turbo С будує завантажувальний модуль з сегментів з зарезервованими іменами. Весь код програми (один або більш сегментів) компонується в секцію коду (підряд розташовані сегменти). Всі дані розташовуються підряд в секцію даних. Посиланням на початок секції являється ім'я групи DGROUP. секція коду в завантажувальному модулі і, отже, в оперативній пам’яті передує секції даних. Крім того, програма обов'язково має стек, який включається в склад завантажувального модуля. В залежності від моделі пам’яті завантажник створює доступне для динамічного розподілу простір пам’яті, називане "купою" (heap). В табл. 6.2 приведена зведена характеристика сегментів для різних моделей пам'яті Turbo С версії 2.01.

В сегмент _ТЕХТ (name_TEXT для моделей MEDIUM, LARGE та HUGE) поміщається код усієї програми (моделі пам'яті TINY, SMALL, COMPACT) або окремої функції name (моделі пам’яті MEDIUM, LARGE, HUGE). Усі сегменти _ТЕХТ в пам’яті будуть розташовуватися один за одним в тому порядку, в якому вони зустрічаються в тексті Сі-програми або в окремих файлах, якщо виконується багатофайлова компіляція. При виконанні функції сегмент початку _ТЕХТ (name_TEXT) зберігається в регістрі CS, значення якого доступно програмі через псевдозмінну _CS. Зміщення усередині _ТЕХТ (name_TEXT) задає регістр IP, значення якого доступно програмі через псевдозмінну _1Р. Якщо функція має тип near, її виклик зв'язаний зі зміною тільки IP. Якщо функція має тип far, при її виклику буде змінюватися як CS, так і IP. навіть якщо загальний об'єм програмного коду не перевищує 64К байт (тобто може весь адресуватись без зміни CS), але або по замовченню, або відверто функція має тип far, при її виклику будуть змінюватися іС8,і1Р.

В сегмент _DATA (name_DATA для моделі HUGE) містяться ініціалізовані зовнішні та статичні дані усієї програми (або конкретної функції name для моделі HUGE). В пам’яті усі сегменти name_DATA розташовуються один за одним в тому порядку, в якому вони зустрілися компонувальнику при його роботі. В сегмент _BSS містяться не ініціалізовані зовнішні й статичні дані усіх модулів програми. звідси випливає, що незалежно від моделі пам’яті загальний об’єм таких даних не може перевищувати б4К байт.В моделі пам’яті HUGE сегмент _BSS відсутній. Сегменти _DATA й _BSS об'єднуються в групу по імені DGROUP (для HUGE не виконується). Це об'єднання дозволяє при обчисленні зміщення в пам’яті до об’єктів, віднесених до різних сегментів, відраховувати його від однієї границі, заданої іменем групи. Розмір однієї групи не перевищує 64 К байт. По умовчанню об’єкти в DGROUP адресуються сегментним регістром DS й зміщенням. Якщо в програмі використовується зміщення відносно DGROUP, можна не перевизначати значення сегментного регістра DS. Тому безпосередньо перед передачею керування функції main () завантажник системи програмування COX.OBJ записує в DS константу DGROUP, після чого значення в DS, як пра­вило, не змінюється у ході усього часу виконання програми. Для функцій, скомпільованих з моделлю пам’яті HUGE, перед початком їх виконання в DS записується значення name_DATA. Після завершення функції значення в DS відновлюється. Тому кажуть, що такі функції мають власні сегменти статичних даних і їх загальний об’єм може перевищувати 64К байт.

Табл. 6.2. Сегменти програми та їх типи, установлювані по умовчанню для моделей пам’яті Turbo С

Модель пам’яті

 

Ім’я сегмента

 

Вирівнювання

 

Тип комбінації

 

Клас

сегмента

 

Група

 

TINY

 

_TEXT
_DATA
_BSS

 

BYTE PARA WORD

 

PUBLIC PUBLIC
PUBLIC

 

'CODE'
'DATA' 'BSS'

 

_
DGROUP
DGROUP

 

SMALL

 

_TEXT
_DATA
_BSS
_STACK

 

BYTE PARA WORD PARA

 

PUBLIC PUBLIC PUBLIC STACK

 

'CODE' 'DATA'

'BSS' 'STACK'

 

_
DGROUP DGROUP
_

MEDIUM

 

name _TEXT
_DATA
_BSS
_STACK

 

BYTE PARA WORD PARA

 

PUBLIC

PUBLIC PUBLIC STACK

 

'CODE'

'DATA' 'BSS' 'STACK'

 

_

DGROUP DGROUP
_

COMPACT

 

_TEXT
_DATA
_ BSS
_STACK

 

BYTE PARA WORD PARA

 

PUBLIC PUBLIC PUBLIC STACK

 

'CODE' 'DATA'

'BSS' 'STACK'

 

_

DGROUP DGROUP
_

 

LARGE

 

name _TEXT _DATA

_BSS

 _STACK

 

BYTE PARA WORD

PARA

 

PUBLIC PUBLIC PUBLIC STACK

 

'CODE'
'DATA'
'BSS'
'STACK'

 


DGROUP
DGROUP

 

HUGE

 

name_TEXT name _DATA _STACK

 

BYTE PARA PARA

 

PUBLIC PUBLIC STACK

 

'CODE'
'DATA'
'STACK'

 

 

 

 

Зміщення для доступу до даних міститься або в самій машинній команді (пряма адресація), або в одному з регістрів (непряма адресація). джерело, з якого береться значення сегмента (DS, ES, SS, CS), при обчисленні фізичного адреса задається або по умовчанню (див. 1.2), або відверто префіксом перевизначення сегмента. При використанні для доступу до пам’яті far-покажчиків Turbo С установлює сегмент покажчика в ES, а зміщення покажчика - в один з регістрів загального призначення і використовує префікс перевизначення сегмента ES:.

Сегмент стека використовується при виконанні програми під дані, що мають клас збереження auto (див. першу книгу комплексу), при виконанні машинних інструкцій виклику процедур, перериваннях, в інших випадках (див. 1.2). Сегмент початку стека в пам’яті поміщається в сегментний регістр SS та доступний програмі через псевдозмінну _SS. Регістр SP задає поточну вершину стека. відразу після завантаження значення SP установлюється рівним "дну" стека. Це значення, близьке до FFFFh.

Модель пам’яті указується при компіляції програми (опція IDE Main Menu-Options-Compile-Memory Model; опції -mt, -ms, -mm, -me, -ml, -mh компілятора командного рядка; по умовчанню приймається -ms). Крім завдання моделі пам’яті, можливе завдання імен сегментів, що відрізняються від приведених в табл. 6.2. розташування завантажувальних модулів програми в оперативній пам’яті до передачі керування в main () для різних моделей пам’яті приведені на рис. 6.3 - 6.8.

Значення сегмента DGROUP записується завантажником в кодовий сегмент в два байта, розміщувані безпосередньо перед початком кодової секції Сі-програми.