Вивчення принципів керування програмами в MS_DOS

Страницы работы

Содержание работы

Лабораторна робота 11

КЕРУВАННЯ ПРОГРАМАМИ

1. Тема лабораторної роботи.

          Керування програмами.

2. Ціль роботи

          Вивчення принципів керування програмами в MS_DOS і придбання практичних навичок роботи із програмним сегментом і його полями.

3. Індивідуальне завдання.

          Розробити програму, що робить форматний вивід на печатку свого Префікса Програмного Сегмента.

4. Опис змінних

          Змінні, глобальні для всієї програми:

p_psp - покажчик на структуру struct PSP, що описує формат префікса програмного сегмента (PSP);

pid - сегментна адреса PSP;

dos_ver - старше число номера версії DOS;

i - вспомагательная змінна, використовувана для перегляду таблиці файлів завдання (JFT), що являє собою масив з 20 елементів (хоча можливо, що їхнє число відмінно від 20, тому розмір масиву визначимо з поля JFT_size);

l - змінна, використовувана для виводу вмісту сегмента оточення DOS і визначення числа рядків виклику (для версії DOS 3.0 і вище);

s - змінна, котра спочатку використається як покажчик на таблицю файлів завдання, потім на рядки сегмента оточення й рядки виклику;

 rr - змінна, котра використається для завдання значень регістрів загального призначення при виклику переривання.

5. Текст програми



/*----------------Лабораторная работа N11-----------------*/

/*----------------"Управление программами"----------------*/

/* Подключение стандартных заголовков */

#include <dos.h>

#include <conio.h>

#include<string.h>

/* Типы данных */

#define byte unsigned char

#define word unsigned int

/* Описание функций */

void get_DOS_version_h(void);  /* Определение версии DOS  */

void addr_PSP (void);          /* Получение адреса PSP    */

struct psp

{        /* ФОРМАТ PSP */

  byte ret_op[2];       /* команда INT 20h                */

  word end_of_mem;      /* вершина доступной памяти       */

  byte reserved1;

  byte old_call_dos[5]; /* старый вызов DOS               */

  void *term_ptr;       /* адрес завершения               */

  void *ctrlbrk_ptr;    /* адрес обработчика Ctrl+Break   */

  void *criterr_ptr;    /* адрес обработчика крит.ошибок  */

  word father_psp;      /* PID родителя                   */

  byte JFT[20];         /* таблица файлов программы       */

  word env_seg;      /* адрес окружения      void *stack_ptr;      /* адрес стека  */

  word JFT_size;        /* размер таблицы файлов          */

  byte *JFT_ptr;        /* адрес таблицы файлов           */

  byte reserved2[24];

  byte new_call_dos[3]; /* новый вызов DOS                */

  } *p_psp;

word pid;               /* сегм.адрес PSP                 */

int dos_ver,            /* версия DOS                     */

    i, l, j;

char *s;

union REGS rr;

main()

{

  textbackground(0);

  clrscr();

  textattr(0x0a);

  cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

  cprintf("             Лабораторная  работа N11             ");

  cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

  cprintf("▓▓▓▓▓▒▒▒▒▒░░░░░");

  cprintf("              Управление программами              ");

  cprintf("░░░░░▒▒▒▒▒▓▓▓▓▓");

  textcolor(11);

  get_DOS_version_h();

  addr_PSP();

  /* распечатка PSP */

  cprintf("\n\n            Адрес PID = %04X\n\n\r",pid);

  p_psp=(struct psp *)MK_FP(pid,0);

  textcolor(10);

  cprintf("Команды:\n\r");

  cprintf("────────\n\r");

  textcolor(14);

  cprintf("     Завершение - int 20h:");

  textcolor(12);

  cprintf("  %02X %02X\n\r",p_psp->ret_op[0],p_psp->ret_op[1]);

  textcolor(14);

  cprintf("     Старый вызов DOS:      ");

  textcolor(12);

  for (i=0;i<5;cprintf("%02X ",p_psp->old_call_dos[i++]));

  textcolor(14);

  cprintf("\n\r     Новый вызов DOS:       ");

  textcolor(12);

  for(i=0;i<3;cprintf("%02X ",p_psp->new_call_dos[i++]));

  textcolor(10);

  cprintf("\n\n\rАдреса:\n\r");

  cprintf("───────\n\r");

  textcolor(14);

  cprintf("    Конец памяти:             ");

  textcolor(12);

  cprintf("%04X:0000\n\r",p_psp->end_of_mem);

  textcolor(14);

  cprintf("    Обработчик завершения:    ");

  textcolor(12);

  cprintf("%Fp\n\r",p_psp->term_ptr);

  textcolor(14);

  cprintf("    Адрес завершения (вектор 22h):    ");

  textcolor(12);

  cprintf("     %Fp\n\r",p_psp->term_ptr);

  textcolor(14);

  cprintf("    Обработчик Ctrl+Break (вектор 23h):    ");

  textcolor(12);

  cprintf("%Fp\n\r",p_psp->ctrlbrk_ptr);

  textcolor(14);

  cprintf("    Обработчик критич.ошибки (вектор 24h): ");

  textcolor(12);

  cprintf("%Fp\n\r",p_psp->criterr_ptr);

  textcolor(14);

  cprintf("    Стек:                     ");

Похожие материалы

Информация о работе