Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

MERCURY127



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору


Код:
 
>Everytime I try to search for "how mem.exe works" or something like
>that I end up with "you need to use int21h/52h to get list-of-lists
>and walk through the MCB chain"...  Well, I tried this:
 
This works for me:
 
/*----------------------------------------------------------------------------
Displays DOS MCB chain
Compile with Turbo C, Borland C, or Watcom C
----------------------------------------------------------------------------*/
#include <stdio.h>
#include <dos.h>
 
typedef unsigned short        uint16_t;
 
/* mcb_t must be a packed struct: */
#pragma pack(1)
 
/* That doesn't work for Turbo C++ 1.0, so do this: */
#if defined(__TURBOC__)
#if __TURBOC__==0x296
#pragma option -a-
#endif
#endif
 
typedef struct
{
        char type;
        uint16_t owner_psp;
        uint16_t size; /* in paragraphs */
        char unused[3];
        char owner_name[8];
} mcb_t;
/*****************************************************************************
*****************************************************************************/
static void wrstr(char far *s)
{
        int i;
 
        for(i = 0; i < 8; i++)
        {
                putchar(*s < ' ' ? '.' : *s);
                s++;
        }
}
/*****************************************************************************
debug function
*****************************************************************************/
#define BPERL                16        /* byte/line for dump */
 
void dump(void far *data_p, unsigned count)
{
        unsigned char far *data = (unsigned char far *)data_p;
        unsigned byte1, byte2;
 
        while(count != 0)
        {
                for(byte1 = 0; byte1 < BPERL; byte1++)
                {
                        if(count == 0)
                                break;
                        printf("%02X ", data[byte1]);
                        count--;
                }
                printf("\t");
                for(byte2 = 0; byte2 < byte1; byte2++)
                {
                        if(data[byte2] < ' ')
                                printf(".");
                        else
                                printf("%c", data[byte2]);
                }
                printf("\n");
                data += BPERL;
        }
}
/*****************************************************************************
*****************************************************************************/
int main(void)
{
        struct SREGS sregs;
        union REGS regs;
        mcb_t far *mcb;
        unsigned s;
 
        regs.x.ax = 0x5200;
        int86x(0x21, &regs, &regs, &sregs);
/* segment of MCB list entry
Watcom C has no 'peek'
        s = peek(sregs.es - 1, regs.x.bx + 14); */
        s = *(uint16_t far *)MK_FP(sregs.es - 1, regs.x.bx + 14);
        while(1)
        {
                mcb = (mcb_t far *)MK_FP(s, 0);
/*dump(mem, sizeof(mcb_t));*/
                printf("adr=%04X, owner_psp=%04X, size=%6lu, owner=",
                        FP_SEG(mcb), mcb->owner_psp, mcb->size * 16uL);
                wrstr(mcb->owner_name);
                printf(", contents=");
                wrstr(&((char far *)mcb)[16]);
                printf("\n");
                if(mcb->type == 0x5A)
                        break;
                s += (1 + mcb->size);
        }
        printf("adr=%04X\n", FP_SEG(mcb));
        return 0;
}
 


Всего записей: 11593 | Зарегистр. 03-08-2008 | Отправлено: 20:35 22-08-2012
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru