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


Пример 2



Пример 2

/*== ПРИМЕР 12.1 ==*/ /*================== Выдача карты памяти =================*/ #define byte unsigned char #define word unsigned int #include <dos.h> #include <string.h> struct MCB { /* блок упpавления памятью */ char type; word owner, size; byte reserved[3]; char pgmname[8]; }; struct MCB *cmcb; /* адpес текущего MCB */ struct MCB *emcb; /* адpес MCB сpеды */ word memtop; /* сегм.адрес начала памяти */ word csegm; /* сегментный адpес текущего MCB */ word othersegm; /* сегм.адрес другого MCB */ word fathersegm; /* сегм.адрес родителя */ byte *envstr; /* адpес стpоки окружения */ int envlen; /* длина очередной строки окружения */ int envsize; /* размер блока окружения */ byte dos; /* номер версии DOS */ union REGS rr; struct SREGS sr; int i; char *s; main() { clrscr(); /* получить номер версии DOS */ rr.h.ah=0x30; intdos(&rr,&rr); dos=rr.h.al; /* получить адрес системных блоков */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); /* получить адрес начала цепочки */ memtop=csegm=peek(sr.es,rr.x.bx-2); do { cmcb=(struct MCB *)MK_FP(csegm,0); printf("Addr=%04X:0000 PID=%04X Size=%-6u ", csegm,cmcb->owner,cmcb->size*16); if (cmcb->owner==0) printf(" Free"); /* блок свободен */ else { /* блок занят */ /* блок принадлежит DOS ? */ if (cmcb->owner<memtop) printf(" Dos "); else { /* блок не принадлежит DOS */ /* если PID хозяина указывает на текущий блок, то это программный сегмент */ if (csegm==cmcb->owner-1) printf(" Pgm "); else { /* адpес блока сpеды для хозяина этого блока памяти находится в PSP хозяина со смещением 0x2C */ othersegm=peek(cmcb->owner,0x2c); /* адpес родителя для программы-хозяина этого блока находится в PSP хозяина со смещением 0x16 */ fathersegm=peek(cmcb->owner,0x16); /* если на текущий блок указывает адрес окружения хозяина, то это блок окружения */ if (csegm==othersegm-1) printf(" Env "); /* иначе - это блок данных */ else printf(" Data "); } /* если хозяин сам себе родитель, то это COMMAND */ if (cmcb->owner==fathersegm) printf("COMMAND.COM"); else { /* для другой программы узнаем ее имя */ if (dos>3) { emcb=(struct MCB *)MK_FP(cmcb->owner-1,0); for (i=0,s=emcb->pgmname; i<8; i++) { if (*s>0) printf("%c",*(s++)); else printf(" "); } printf(" "); } if (dos>2) { /* для DOS 3.0 и выше имя - из строки вызова */ emcb=(struct MCB *)MK_FP(othersegm-1,0); envsize=emcb->size*16; /*размер окружения */ envstr=(char *)MK_FP(othersegm,0); do { /* пропуск строк окружения до пустой строки */ envlen=strlen(envstr)+1; envstr+=envlen; envsize-=envlen; } while ((envlen>1)&&(envsize>0)); envstr+=2; envsize-=2; /* 2 байта - кол.строк */ /* envstr - указатель на строку вызова */ if (envsize>0) printf("%s",envstr); } } } } printf("\n"); csegm+=(cmcb->size+1); /* переход к следующему блоку */ } while (cmcb->type!='Z'); /* выход по последн.блоку */ getch(); }




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