Курсовая работа: КП - резидентный загрузчик
Описание
Характеристики курсовой работы
Список файлов
- КП - резидентный загрузчик
- Прочти меня.txt 32 b
- Резидентный загрузчик
- 5
- EXE1.EXE 577 b
- EXE2.EXE 577 b
- LOADER.COM 3,86 Kb
- Listing.txt 43,2 Kb
- T_1.vsd 101 Kb
- T_2.vsd 101 Kb
- T_3.vsd 124,5 Kb
- T_4.vsd 116,5 Kb
- T_5.vsd 113,5 Kb
- T_6.vsd 126,5 Kb
- Листинги_T.doc 20 Kb
- ОП_Тим.doc 30 Kb
- ПМИ_Тим.doc 41,5 Kb
- РП_Тим.doc 30 Kb
- РСП_Тим.doc 43 Kb
- ТЗ_Тим.doc 42 Kb
- ТО_Тим.doc 64,5 Kb
Файл скачан с сайта StudIzba.com
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 1
loader.ASM
1 0000 .model tiny ;объединить сегменты кода, +
2 данных, стека и т.д.
3
4 .386 ;для pushf/popf, +
5 pusha/popa, shl, снятие ограничение в 127 байтдля
6 ;условных +
7 переходов
8 ;--------------------------------------- --------
9 ;вызывается дообработки вызова
10 prep_state macro
11 cli
12
13 cmp byte ptr cs:is_app_working,1;проверка работаетли уже +
14 приложение
15 je exit_09h_handler ;если да, то нельзя снова +
16 запускать процесс
17
18 mov al,01h
19 mov byte ptr cs:is_app_working,al;указывает, что уже работает
20
21 mov ax,ss ;сохраняет адреса +
22 стека прерванной программы
23 mov word ptr cs:app_ss,ax
24 mov ax,sp
25 mov word ptr cs:app_sp,ax
26
27 mov ax,cs ;переключает стек и+
28 все сегментныйрегистры
29 mov ds,ax ;на резидент
30 mov es,ax
31 mov ss,ax
32 lea sp,pr_stack
33 add sp,480h
34
35 sti
36 endm
37 ;--------------------------------------- --------
38 ;вызывается при завершении обработки вызова
39 rest_state macro
40 cli
41
42 xor ax,ax
43 mov byte ptr cs:is_app_working,al;указывает, что приложение +
44 большене работает
45
46 mov ax, word ptr cs:app_ss ;восстанавливает стек прерванной +
47 программы
48 mov ss,ax
49 mov ax, word ptr cs:app_sp
50 mov sp,ax
51
52 sti
53 endm
54 ;--------------------------------------- --------
55 ;считывает заголовок exe файла
56 ;обязательный параметрfile_name содержит адрес строки,
57 ;содержащей путь к файлу в виде ASCIIZстроки
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 2
loader.ASM
58 ;регистр ds уже долженбыть настроен на нужныйсегмент
59 read_header macro file_name:req
60 mov ax,3D02h ;открывает файл
61 lea dx,file_name
62 int 21h
63 jc Error_IO
64
65 mov handle,ax
66 xor ax,ax
67 mov ah,3Fh ;читает из файла
68 mov bx,handle
69 mov cx,32 ;первые 32 байта
70 lea dx,header
71 int 21h
72 jc Error_IO
73
74 mov ah,3Eh ;закрывает файл
75 mov bx,handle
76 int 21h
77 jc Error_IO
78 endm
79 ;--------------------------------------- --------
80 ;загружает exeфайл в память
81 ;настраивает его адреса
82 ;и устанавливает точкувозврата
83 ;обязательный параметрfile_name содержит адрес строки,
84 ;содержащей путь к файлу в виде ASCIIZстроки
85 ;регистр ds уже долженбыть настроен на нужныйсегмент
86 load_file macro file_name:req
87 call setEPB ;заполняет EPB
88
89 read_header file_name
90
91 mov ax,4B01h ;загружает в память +
92 программу, указанную
93 lea bx,EPB ;в переменной file_name
94 lea dx,file_name
95 int 21h
96 jc Error_IO
97
98 mov ah,62h ;получает PSP прерванного процесса
99 int 21h
100
101 add bx,10h ;настраивает SS:SP на стек +
102 загруженной
103 mov sp,word ptr header.10h
104 mov ax,bx ;программы
105 add ax,word ptr header.0Eh
106 mov ss,ax
107 mov ax,bx
108 add ax,word ptr header.16h
109 push ax ;устанавливаетточку входа в
110 mov ax,word ptr header.14h ;программу
111 push ax
112 sub bx,10h
113 mov ds,bx ;настраивает ds и es на новый PSP
114 mov es,bx
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 3
loader.ASM
115 lea dx,rest
116 mov bx,0ah
117 mov [bx],dx ;точкувозврата на rest
118 retf
119 endm
120 ;--------------------------------------- --------
121 =000D cr equ 0dh ; ASCII возврат каретки
122 =000A lf equ 0ah ; ASCII перевод строки
123 ;--------------------------------------- --------
124 =0001 stdout equ 1 ; стандартный вывод
125 ;--------------------------------------- --------
126
127 0000 .code ;сегмент кода
128 org 2Ch
129 002C ???? env_seg dw ? ;окружение DOS, +
130 сегментный адрес
131
132 org 80h
133 0080 ?? cmd_line_len db ? ;длинакомандной строки
134 0081 7F*(??) cmd_line db 7Fh dup (?) ;командная строка
135
136 0100 Start:
137 0100 E9 08E8 jmp initialize
138
139 ;--------------------------------------- --------
140 ;Выводсообщения об ошибке привыполнении операции
141 ;Ввода-вывода
142 0103 Error_IO:
143 0103 33 C0 xor ax,ax
144 0105 2E: 3B 06 0561r cmp ax,word ptr cs:which_app
145 010A 75 0F90 90 jne IO_2
146
147 010E BA 0428r lea dx,msg_er1
148 0111 B9 0031 90 mov cx,msg_er1_len
149 0115 E8 0025 call pmsg
150 0118 E9 02AB jmp rest
151
152 011B IO_2:
153 011B BA 0459r lea dx,msg_er2
154 011E B9 0031 90 mov cx,msg_er2_len
155 0122 E8 0018 call pmsg
156 0125 E9 029E jmp rest
157
158 ;--------------------------------------- --------
159 ;Установка сегментов вEPB
160 0128 setEPB proc near
161 0128 BB 04F3r lea bx,EPB
162 012B 8C D8 mov ax,ds
163 012D 89 4704 mov [bx][ 4],ax
164 0130 89 4708 mov [bx][ 8],ax
165 0133 89 470C mov [bx][12],ax
166 0136 89 4710 mov [bx][16],ax
167 0139 89 4714 mov [bx][20],ax
168 013C C3 retn
169 013D setEPB endp
170 ;--------------------------------------- --------
171 ;отображает сообщение на стандартном выходе
Turbo Assembler Version 3.1 26/12/02 04:09:58 Page 4
loader.ASM
172 ;в ds:dx адресстроки
173 ;в cx длина
174 013D pmsg proc near
175 013D BB 0001 mov bx,stdout
176 0140 B4 40 mov ah,40h
177 0142 CD 21 int 21h
178 0144 C3 ret
179 0145 pmsg endp
180
181 0145 hw_reset:
182 0145 CB retf ;минимальный +
183 hw_reset по спецификации ISP
184
185
186 ;--------------------------------------- --------
187 ;обработчик прерыванияклавиатуры
188 ;при работе вызывает старый обработчик,
189 ;а потом выполняет свои проверки и операции
190 0146 int09h_handler proc far
191 0146 EB 10 jmp short actual_int09h_handler ;ISP: пропустить блок
192
193 0148 ???????? old_int09h dd ? ;ISP: старый +
194 обработчик
195 014C 424B dw 424Bh ;ISP: сигнатура
196 014E 00 db 00h ;ISP: +
197 вторичный обработчик
198 014F EB F4 jmp short hw_reset ;ISP: ближний jmp на +
199 hw_reset
200 0151 07*(00) db 7 DUP (0) ;ISP: +
201 зарезервированно
202
203 0158 actual_int09h_handler: ;начало обработчика int 09h
204 0158 9C pushf ;сохраняем флаги
205 0159 2E: FF 1E 0148r call dword ptr cs:old_int09h ;вызываем старый обработчик
206
207 015E 60 pusha ;
208 015F 1E push ds ;в аппаратном +
209 прерывании надо сохранять все регистры
210 0160 06 push es ;
211
212
213 0161 6A 40 push 0040h
214 0163 1F pop ds ;в ds +
215 сегментный адреc области данных BIOS
Начать зарабатывать