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


Пример 4



Пример 4

/*== ПРИМЕР 12.3 ==*/ /*=========== Дисциплины распределения памяти ===========*/ #include <dos.h> #define byte unsigned char #define word unsigned int void memfree(byte *a); byte *memget(int blksize); void setorder(byte d); byte getorder(); void init(void); void memmap(int x); struct MCB { byte type; word owner, size; byte reserved[11]; } *c; word freetop, cs; union REGS rr; struct SREGS sr; main() { byte *a[10] ,*b, order; word sz, i; init(); /* составление списка исходных блоков */ /* Формирование фрагментированной памяти */ for (sz=84,i=0; i<10; i++) { a[i]=memget(sz); b=memget(8); if (i>=5) sz+=4; else sz-=4; } for (i=0; i<10; i++) memfree(a[i]); order=getorder(); clrscr(); printf(" Исходное |Дисциплина_0"); printf("|Дисциплина_1|Дисциплина_2|\n"); printf("------------|------------"); printf("|------------|------------|"); memmap(1); /* отображение памяти */ setorder(0); /* установка дисциплины */ b=memget(70); /* выделение памяти */ memmap(14); /* отображение памяти */ memfree(b); /* возврат к исходному распределению */ setorder(2); b=memget(70); memmap(27); memfree(b); setorder(1); b=memget(70); memmap(40); memfree(b); setorder(order); /* восстановление исходной дисциплины */ } /*==== Установка дисциплины распределения ====*/ void setorder(byte d) { rr.h.ah=0x58; /* Ф-ция 58 */ rr.h.al=1; /* Установить */ rr.x.bx=d; /* Дисциплина */ intdos(&rr,&rr); } /*==== Чтение дисциплины распределения ====*/ byte getorder() { rr.h.ah=0x58; /* Ф-ция 58 */ rr.h.al=0; /* Прочитать */ intdos(&rr,&rr); return (rr.x.ax); /* Дисциплина - в AX */ } /*==== Выделение памяти ====*/ byte *memget(int blksize) { rr.h.ah=0x48; rr.x.bx=blksize; intdos(&rr,&rr); if (rr.x.cflag) printf("\7Неудовл.запрос mem=%d\n",rr.x.bx); else return(MK_FP(rr.x.ax,0)); } /*==== Освобождение памяти ====*/ void memfree(byte *a) { rr.h.ah=0x49; sr.es=FP_SEG(a); intdosx(&rr,&rr,&sr); if (rr.x.cflag) printf("\7Некорректный free\n"); } /*==== Определение адреса последнего свободного блока ====*/ void init(void) { rr.h.ah=0x52; intdosx(&rr,&rr,&sr); cs=peek(sr.es,rr.x.bx-2); do { freetop=cs; c=(struct MCB *)MK_FP(cs,0); cs+=(c->size+1); } while(c->type!='Z'); } /*==== Выдача карты памяти ====*/ void memmap(int x) { int y; cs=freetop; y=3; do { c=(struct MCB *)MK_FP(cs,0); cs+=(c->size+1); gotoxy(x,y++); printf("%04X %-4u",cs,c->size); if (c->owner==0) printf("...|\n"); else printf("***|\n"); } while(c->type!='Z'); }




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