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

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

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

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

Національний технічний університет

“Харківський політехнічний інститут”

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

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

“Завантажники”

                                                                                Виконав:

                                                                                студент групи АП-30б

                                                                                Шпіка П. М.

                                                                                Перевірив:

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

Харків 2002

1.  Тема роботи: Завантаження.

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

3.  Постановка задачі для лабораторної роботи: Для даної лабораторної роботи необхідно розробити програму, що завантажує в пам'ять на виконання модуль, що виконується (COM чи EXE), не використовуючи EXEC.

4.  Текст програми завантажника LOADER.ASM:

stack segment stack

       dw   0fffh

stack ends

data segment

str3         db        "Управление вернулось...",7,10,13,'$'

str2         db        10,13,"Память освободилась...",10,13,'$'

str1         db        10,13,"Память не выделяется !!!",10,13,"$"

str4         db        10,13,"Ошибка открытия файла !!!",10,13,"$"

str5         db        10,13,"usage: load1 filename",10,13,"$"

file         dw        ?

data ends

code segment

assume     ds:data,cs:code,ss:stack,es:code

usage:      mov        dx,offset str5

                mov        ah,09H

                int        21H

                mov        ax,4CFFH

                int        21H

begin:

                mov         ax,data

                mov         ds,ax

                mov         sp,400h

                mov         ah,4AH

                mov         bx,400H

                int         21H

                mov     di,0080H

search:  inc     di

       cmp     byte ptr es:[di],0DH

       jz      usage

       cmp     byte ptr es:[di],20H

       jz      search

       mov     [file],di

       mov     bx,0081H

       add     bl,es:[bx-1]

       mov     byte ptr es:[bx],00H

       mov         ax,3d00h    ;открытие

       mov         dx,file     ;файла

       push        ds

       push        es

       pop         ds

       int         21h         ;на чтение

       pop         ds

       jnc         isopen

       jmp         notopen

isopen:

       xor         dx,dx       ;определение

       xor         cx,cx       ;размера

       mov         bx,ax       ;открытого

       mov         ax,4202h    ;файла

       int         21h         ;в байта

       push        ax          ;сохранение возвращенного размера файла

       push        ax          ;сохранение еще раз

       mov         ax,3e00h    ;закрытие

       int         21h         ;файла

       pop         ax          ;вычисление

       push        ax          ;размера

       mov         bx,10h      ;памяти

       div         bx          ;который

       sub         bx,dx       ;надо

       pop         ax          ;выделить

       add         ax,100h     ;в параграфах

       add         ax,bx       ;по

       mov         bx,10h      ;формуле:

       div         bx          ;(ax+100h+ax%10h)/10h

       xor         ah,ah       ;или (ax+256+ax%16)/16

       mov         bx,ax       ;выделение памяти

       mov         ah,48h      ;размером bx параграфов

       int         21h         ;в ах возвращается начало участка ax:0000

       jc          exit        ;если неt памяти выход

       push        ax          ;сохранение начала выделенной памяти

       mov         ax,3d00h    ;открытие

       mov         dx,file     ;файла

       push        ds

       push        es

       pop         ds

       int         21h         ;на чтение

       pop         ds

       jc          notopen

       mov         bx,ax       ;описатель в bx

       pop         ax          ;чтение из

       pop         cx          ;

       push        ds

       push        ax          ;

       mov         ah,3fh      ;com-файла

       pop         ds          ;числа байт сх

       mov         dx,100h     ;по адресу

       int         21h         ;ds:100h

       mov         dx,ds

       pop         ds

       mov         ah,3eh      ;закрытие

       int         21h         ;файла

       int         3

;ПОДГОТОВКА К ПЕРЕДАЧЕ УПРАВЛЕНИЯ

       cli

       push        ss

       pop         ax

       push        es

       pop         bx

       push        ds

       pop         cx

       push        dx

       pop         ss

       mov         sp,4

       push        ax          ;save old ss

       push        bx          ;save old es

       push        cx          ;save old cs

       push        cs

       lea         bx,return

       push        bx

       mov         es,dx

       mov         ds,dx

       sti

       push        dx

       push        100h

       xor         ax,ax

       xor         bx,bx

       xor         dx,dx

       xor         cx,cx

       int         3h

       retf

notopen:

       lea         dx,str4

       mov         ah,9

       int         21h

       jmp         endo

exit:

       lea         dx,str1

       mov         ah,9

       int         21h

       jmp         endo

return:

       mov         ax,es

       pop         ds          ;восстановление

       pop         es          ;сегментных

       pop         ss          ;регистров

       mov         es,ax       ;освобождение

       mov         ah,49h      ;выделеного

       int         21h         ;блока памяти

       jc          s

       lea         dx,str2

       mov         ah,9H

       int         21h

s:

       lea         dx,str3

       mov         ah,9

       int         21h

endo:

       mov         ah,4ch      ;выход из

       int         21h         ;ДОС

code ends

end  begin

5.  Висновки: У процесі виконання даної лабораторної роботи був освоєний механізм завантаження операційною системою MS DOS дочірніх процесів, вивчена структура виконуваних модулів.

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

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