Висновки: В данiй роботi ознайомилися з засобами написання резидентних програм, зокрема була написана резидентна програма управлiння клавiатурою, зокрема при першому натиску " гарячої " комбiнацiї клавiш з вхідного потоку даних iз клавiатури блокувалася клавiша 1, а при другому натиску " гарячої " комбiнацiї вона
розблоковувалася .
Лабораторна робота № 10
«Заголовки файлів.Таблиця переходів»
Індивідуальне завдання: Написати прогрму котра б виконувала прегляд таблиці заголовка програми, і програмц\у якаб виконівала преглід тиблиці преходів.
Програма, що виконує перегляд таблиці заголовка.
Опис пограми: Програма виконує перегляд власної таблиці завантаження. Адрес розміщення файлу програми програма дістає з командної строчки , потім відкриває його і виконує читання завантажуючи данних в структуру, котра описує таблицю завантаження програми, і виконує форматований вивід на екран монітору.
Текст програми.
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define byte unsigned char
#define word unsigned int
struct EXEH {
byte ExeFlag[2]; /* 0x4D5a признак EXE-файла ('MZ') */
word LastPag; /* длина неполной последней страницы */
word PageCnt; /* длина образа в 512-байтовых стр. */
word ReloCnt; /* число элементов в табл.перемещения */
word HdrSize; /* длина заголовка в параграфах */
word MinMem; /* мин. памяти за концом прогр.*/
word MaxMem; /* макс.требуемой памяти */
word ReloSS; /* смещение сегмента стека */
word ExeSP; /* значение регистра SP при запуске */
word ChkSum; /* контрольная сумма */
word ExeIP; /* значение регистра IP при запуске */
word ReloCS; /* смещение кодового сегмента */
word TabOff; /* смещение 1-го эл-та перемещения */
word Overlay; /* номер оверлея */
} exeh;
FILE *file;
#pragma argsused
int main(int argc,char *argv[])
{
clrscr();
if ( (!(file = fopen(argv[0],"r"))) )
{
printf ("Cann't Open File");
return -1;
}
fread (&exeh,1,sizeof(struct EXEH),file);
printf("======= Заголовок файла %s =======\n",argv[0]);
printf("Подпись файла .EXE = %02X%02X (%c%c)\n",
exeh.ExeFlag[0],exeh.ExeFlag[1],
exeh.ExeFlag[0],exeh.ExeFlag[1]);
printf("Длина последней страницы = %d\n",
exeh.LastPag);
printf("Длина модуля в страницах = %d\n",
exeh.PageCnt);
printf("Число эл-тов в табл.перемещ. = %d\n",
exeh.ReloCnt);
printf("Длина заголовка = %d\n",
exeh.HdrSize);
printf("Минимум памяти = %04Xh\n",
exeh.MinMem);
printf("Максимум памяти = %04Xh\n",
exeh.MaxMem);
printf("Смещение сегмента стека = %04Xh\n",
exeh.ReloSS);
printf("Значение регистра SP = %04Xh\n",
exeh.ExeSP);
printf("Контрольная сумма = %d\n",
exeh.ChkSum);
printf("Значение регистра IP = %04Xh\n",
exeh.ExeIP);
printf("Смещение кодового сегмента = %04Xh\n",
exeh.ReloCS);
printf("Смещение 1-го элемента таблицы = %04Xh\n",
exeh.TabOff);
printf("Номер оверлея = %d\n",
exeh.Overlay);
getch();
return 0;
}
Результат виконання програми:
======= Заголовок файла D:\TEMP\PRM1.EXE =======
Подпись файла .EXE = 4D5A (MZ)
Длина последней страницы = 64
Длина модуля в страницах = 35
Число эл-тов в табл.перемещ. = 239
Длина заголовка = 96
Минимум памяти = 0000h
Максимум памяти = FFFFh
Смещение сегмента стека = 03DCh
Значение регистра SP = 0080h
Контрольная сумма = 0
Значение регистра IP = 0000h
Смещение кодового сегмента = 0000h
Смещение 1-го элемента таблицы = 003Eh
Номер оверлея = 0
Програма, котра читає таблицю переміщень.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.