Лабораторна робота 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(" Стек: ");
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.