Доступ до віддалених полів МСВ дозволяє побудувати програми, визначаючі
поточний стан оперативної пам’яті. Далі наведено приклад декількох Сі-функцій, які використовують
безпосередній доступ до МСВ-блоків MS-DOS:
Scan_mcb() – аналізує вміст МСВ блока;
Firstpsp() – повертає сегмент першого PSP в пам’яті;
Exe_name() – визначає і’ім’я файла програми-власника блока пам’яті.
Функції використовують структуру МСВ та ряд символьних констант, які зручно
об’єднати у власний файл,
наприклад, з ім’ям mcb.h:
/************************* МСВ ***********************/
/* Заготовочний файл для роботи з
МСВ блоками пам’яті */
/******************************************************/
#if!defined(DEF_MCB) /*застерігає від
повторного описування */
struct MCB{
char first_symb; /*Перший символ МСВ-блока:
=’M’ – не останній блок;
=’Z’ – останній блок. */
unsigned owner _psp;
/*індикатор зайнятості блоку:
=0 – блок вільний;
=PID – програми-власника.*/
unsigned block_size; /*розмір блока в параграфах*/
char unsigned[11]; /*блоки МСВ які не використовуються*/
};
/* Описання прототипів функцій 6.5 для роботи з
МСВ.*/
int scan_mcb(unsigned, unsigned *,unsigned *);
char far* exe_name(unsigned);
unsigned firstpsp(void);
/*Описання повертаючих символьних констант*/
#define OK 0 /*блок пам’яті звільнений */
#define MCB_ERROR 1 /*блок має не коректний МСВ*/
#define LAST 130 /*блок – останній в ланцюжку МСВ*/
#define NOT_LAST 131 /* блок – не останній в ланцюжку МСВ */
#define DEF_MCB 1 /*описування використовується лише раз*/
#endif
Відмітимо, що при компіляції програм, які використовують структуру МСВ,
необхідно задати вирівнювання на границі байту, а не слова.
/*L6_7.c – функція scan_mcb()
Аналізує МСВ-блок, описаний блок пам’яті, розміщений з адреси start_seg:0000. Сам МСВ розміщується з адреси start_seg-1:0000.
Повертає:
NOT_LAST - даний блок – не останній в ланцюжку МСВ;
LAST - даний блок – останній в ланцюжку МСВ;
MCB_ERROR - даний блок описується не коректним МСВ;
next_block_seg - сегмент, з якого починається наступний
блок пам’яті; для останнього
блоку – число параграфів до кінця оперативної пам’яті.
owner_psp - байти 1-2 МСВ: 0 – для
вільного блоку пам’яті; сегмент PSP програми-власника
блока в противному разі.
*/
#include <dos.h>
#include “mcb.h”
int scan_mcb(unsigned start_seg, unsigned *
next_block_seg, unsigned * owner_psp)
{ struct MCB far * work;
register int ret;
work=(struct MCB far*) MK_Fp ()start_seg –1,0);
/*Аналіз першого байту МСВ.*/
switch(work->first_symb){
case ’M’:
ret=NOT_LAST;
*next_block_seg=start_seg+work->block_size+1;
*owner_psp=work->owner+psp;
break;
case ‘Z’:
*next_block_seg=work->block_size;
*owner_psp=work->owner_psp;
ret=LAST;
break;
defoult: ret=MCB_ERROR;
}
return ret;
}
![]() |
![]() |
![]() |