Загрузчики. Принципи загрузки програм на виповнення в системі MS-DOS

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

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

Міністерство освіти і науки України

Національний технічний університет “ХПІ”

Кафедра “Обчислювальної техніки та програмування”

Дисципліна

“Системне програмування”

Лабораторні робота №4

“Загрузчики”

Виконав:

студент групи КІТ-21Б

Хорощак Б.В.

Перевірив:

Межерицький С.Г.

            М. Харків, 2003 рік

Лабораторна робота №4

Тема: “Загрузчики”

Мета: Осовїти принципи загрузки програм на виповненняв системі MS-DOS та вивчити структуру виконуючих файлів – EXE, COM.

Індивідуальне завдання: Необхідно розробити програму, яка загружає в пам’ять на виконання виконуючий модуль EXE або COM. Не використовувати фунцію EXEC.

1.Розробка алгоритму вирішення задачі

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, також була вивчена структура виконуючих модулів.

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

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