Системное программное обеспечение персональных ЭВМ


Пример 3



Пример 3

/*== ПРИМЕР 12.2 ==*/ /*============= Функции упpавления памятью DOS ===========*/ #include <dos.h> #define byte unsigned char #define word unsigned int struct MCB { char type; word owner, size; byte reserved[11]; } *cmcb; /* указатель на текущий MCB */ void init(void); void memfree(byte *a); byte *memget(word blksize); byte *memnew(word blksize,byte *a); void memmap(char *s); word freetop; /* сегментный адpес начала свободной памяти */ word csegm; /* сегм.адрес текущего MCB */ byte *a[7]; /* указатели на блоки памяти */ union REGS rr; struct SREGS sr; main() { clrscr(); init(); /* инициализация */ /* Шаги 1 - 5 - выделение новых блоков */ a[0]=memget(64); memmap("a[0]=memget(64)"); a[1]=memget(64); memmap("a[1]=memget(64)"); a[2]=memget(64); memmap("a[2]=memget(64)"); a[3]=memget(64); memmap("a[3]=memget(64)"); a[4]=memget(64); memmap("a[4]=memget(64)"); /* шаг 6 - уменьшение блока a2 */ memnew(50,a[1]); memmap("memnew(50,a[1])"); /* шаг 7 - попытка увеличения блока a2 */ memnew(80,a[1]); memmap("memnew(80,a[1])"); /* шаги 8,9 - освобождение блоков */ memfree(a[1]); memmap("memfree(a[1])"); memfree(a[3]); memmap("memfree(a[3])"); /* шаг 10 - выделение блока большего размера */ a[5]=memget(80); memmap("a[5]=memget(80)"); /* шаг 11 - выделение блока меньшего размера */ a[6]=memget(50); memmap("a[6]=memget(50)"); } /*==== Выделение нового блока размером blksize ====*/ byte *memget(word blksize) { rr.h.ah=0x48; /* функция 48 */ rr.x.bx=blksize; /* требуемый размер */ intdos(&rr,&rr); if (rr.x.cflag) printf("\7Неудовл.запрос mem=%d\n",rr.x.bx); /* сегм. адрес блока - в AX */ else return(MK_FP(rr.x.ax,0)); } /*==== Освобождение блока a ====*/ void memfree(byte *a) { rr.h.ah=0x49; /* функция 49 */ sr.es=FP_SEG(a); /* сегм. адрес блока */ intdosx(&rr,&rr,&sr); if (rr.x.flags&1) printf("\7Некорректный free\n"); } /*==== Изменение размера блока a до blksize ====*/ byte *memnew(word blksize,byte *a) { rr.h.ah=0x4a; /* функция 4A */ rr.x.bx=blksize; /* требуемый размер */ sr.es=FP_SEG(a); /* сегм.


- Начало -  - Назад -  - Вперед -