Міністерство освіти і науки України
Національний технічний університет “ХПІ”
Кафедра “Обчислювальної техніки та програмування”
Дисципліна
“Системне програмування”
Лабораторні робота №4
Виконав:
студент групи КІТ-21Б
Хорощак Б.В.
Перевірив:
Межерицький С.Г.
М. Харків, 2003 рік
Мета: Осовїти принципи загрузки програм на виповненняв системі MS-DOS та вивчити структуру виконуючих файлів – EXE, COM.
Індивідуальне завдання: Необхідно розробити програму, яка загружає в пам’ять на виконання виконуючий модуль EXE або COM. Не використовувати фунцію EXEC.
1) Знайти файл, що треба загрузити. Якщо його немає, то вийти з програми.
2) Підрахувати розмір виконуючого модулю та вивести значення на екран.
3) Виділит необхідну кількість пам’яті. Якщо не вдалося, то повідомити про це та вийти.
4) Вичислити сегмент програми.
5) Вичислити зміщення програми.
6) Загрузити програму та передати їй управління.
2. Приведення тексту програми
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <alloc.h>
char Filename[12]; // имя файла
unsigned int Size,i; // размер файла
unsigned int Segment; // адрес сегмента программы
char far * off; // смещение программы в памяти
char far * Memory; // необходимая память
union REGS r; // обьединение регистров
struct SREGS sr; // структура системных регистров
FILE * runme; // файл для запуска
long Tmp; // временная переменная
void main(int argc,char * argv[]) // аргументы для запуска программы
{
clrscr();
r.h.ah = 0x4A;
r.x.bx = 0x400;
intdosx(&r, &r, &sr); // прерывание DOS
if ( argc < 2 ) // не прописано имя файла
{
printf("Filename required! Try again.");
getch();
exit(0);
}
strcpy(Filename,argv[argc-1]);
runme=fopen(Filename,"r+b");
if (runme==NULL) // файл не найден в данной директории
{
printf("File not found or it's not accesible!");
getch();
exit(0);
}
Size=0; // вычисление размера файла
while (!feof(runme))
{
fgetc(runme);
Size++;
}
Size--;
fclose(runme); //вывод размера файла
printf("Size of file = %i\n",Size);
// выделение памяти
Memory=(char far *)farmalloc(Size+0x100+16);
if (Memory==NULL) // невозможно выделить память
{
printf("Not enough memory!");
getch();
exit(0);
}
// вычисление сегмента
Segment = FP_SEG(Memory)+1;
r.h.ah = 0x26;
r.x.dx = Segment;
intdosx(&r, &r, &sr);
runme=fopen(Filename,"r+b");
// вычисление смещения
Tmp=((long)Segment<<16)+0x100;
off=(char far*)Tmp;
for (i=0;i<Size;i++)
{
*(off+i)=fgetc(runme);
}
// вывод начала кода
printf("Code begins at %4.4X:%4.4X\n",FP_SEG(off),FP_OFF(off));
printf("Program loaded \n\n");
asm {
push es
push ds
push ds
pop es
mov ax,Segment
mov ds,ax
call dword ptr es:[off]
pop ds
pop es
}
printf("\nProgram unloaded");
farfree(Memory); // освобождение памяти
fclose(runme);
getch();
}
3. Вхідний файл
.MODEL TINY
.CODE
ORG 100H
start:
mov dx,offset strn
mov ah,09H
int 21h
retf
strn DB 'Program is running..',7,10,13,'$'
END start
4. Результати роботи програми
Size of file = 32
Code begins at 20F1:0100
Program loaded
Program is running..
Program unloaded
5. Висновки
В процесі виконання даної роботи був засвоєний механізм загрузки дочірніх процесів в операційній системі MS-DOS, також була вивчена структура виконуючих модулів.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.