12. UniPascal в детайли
69
Преди стартирането на програма на UniPascal цялата памет от $XXXX до SP
(указателя на стека) е била свободна и, освен това, адресите $RRRR и $ZZZZ са
съвпадали (т.е. не е имало отделени динамични променливи за програмата). Областта
между адресите $0100 и $XXXX е заета от някоя .pgm или .cmd програма, от която е
била активирана програма на UniPascal. Обикновено такава програма няма (програмата
се стартира, без да е активна друга програма) и затова $XXXX = $0100.
Паметта между адреси $ZZZZ и $C000 е памет, заета от резидентни програми
или от системните програми. Обикновено това е област от паметта с големина от
порядъка на 2-3 килобайта. Това означава, че всъщност в повечето случаи свободната
памет е около 45-46 килобайта.
След активиране на програмата на UniPascal нейният код (Y код) се зарежда от
първия свободен адрес - $XXXX. След това се отделя място за всички глобални
променливи на програмата. Ако тя използва модули, тази операция се повтаря за всеки
използван модул.
При активиране на всяка процедура, от първия свободен адрес - $YYYY се отделя
място за нейните локални променливи. След приключване на нейното изпълнение
заетата памет за локалните променливи се освобождава. Параметрите на процедурите
се предават през системния стек. Ако процедурата е овърлейна, то освен за
променливите се отделя място и за нейния код (който се прочита от външния носител -
дискета). След завършване на изпълнението й се освобождава и областта, заемана от
кода на процедурата.
Памет за динамичните променливи се заема и освобождава чрез стандартните
прекъсвания на BIOS (int $2a и int $2b). Чрез BIOS лесно се реализира механизмът на
освобождаване на памет, базиран на метода MARK - RELEASE. Получилите се в
следствие на използване на стандартната процедура DISPOSE (FREEMEMWORDS) дупки
се обработват отделно. Те се организират на свързан списък, като при заявка за памет
се дава най-малката подходяща за целта дупка и едва ако няма такава се прави заявка
към BIOS. При освобождаване на памет чрез DISPOSE/FREEMEMWORDS се появява
свободна дупка в динамичната памет. Свободната дупка се обединява със съседната й,
ако има такава, или се включва в списъка на свободните дупки. Ако дупката е на върха
на динамичната памет, то тя се освобождава чрез основния BIOS. Така реализирани
двата метода за освобождаване на памет (DISPOSE/FREEMEMWORDS и MARK-RE-
LEASE) могат да бъдат използвани съвместно. Единствената неприятност, която може
да се получи, е при използването на RELEASE да не бъде освободена паметта, заета в
някоя от дупките. За да няма такъв проблем, процедурата MARK трябва да се използва
само, ако не е настъпила фрагментация на динамичната памет. В такъв случай
използуването на RELEASE ще възстанови състоянието на динамичната памет такова,
каквото е било при използването на MARK.
Свободната памет се намира между указателя на стека (SP) и края на локалните
променливи ($PPPP). При заемане на памет за динамични променливи стекът се
премества надолу (намалява), а при активиране на процедура адресът $PPPP нараства.
Когато те се срещнат настъпва грешка - препълване на паметта.
Използване на нулевата страница
Нулевата страница на микрокомпютъра "Пълдин 601/601А/601М" е тази част
от паметта, чиито старши байт от адреса е $00, т.е. от $0000 до $00FF. От нея областта
от $0000 до $007F е резервирана за операционната система (UniDOS и BIOS). От
останалата част интерпретаторът на Y код използва областта от $0080 до $00DF.
Останалата част ($00E0..$00FF) не се използва от интерпретатора. Областта от $00B0
до $00DF се използва от интерпретатора като работна област и Вие също можете да я
<<  <  GO  >  >>

Вернуться к началу сайта