Док 7 - Текст программы (1071540)
Текст из файла
Московский государственный технический университет им. Н.Э.Баумана
_________________________________________________________________
Утверждаю: | |
Большаков С.А. | "__"_____________2005 г. |
Курсовая работа по курсу Системное программирование
«Управление цветом фона экрана»
Текст программы
(вид документа)
писчая бумага
(вид носителя)
9
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-53 | _____________________ |
Абламцев Д. М. | "__"_____________2005 г. |
Москва - 2005
________________________________________________________________
Файл bkgtsr.lst
Turbo Assembler Version 4.1 21/11/05 14:20:36 Page 1
bkgtsr.asm
1 ; Резидентная программа для изменения цвета фона по нажатию клавишы
2 ; Выполнил: Абламцев Д. М. (Oman) (Группа ИУ5-53, вар №1)
3 ; Фаил: bkgtsr.asm
4 ; Дата: 18.10.05
5 ; Версия: 1.00.051018
6
7 0000 cseg segment
8 assume cs:cseg, ds:cseg, ss:cseg, es:cseg
9 org 100h
10
11 0100 BEGIN:
12 0100 E9 00C7 jmp INIT
13
14 0103 00 background_colour db 0 ; цвет фона
15 0104 00 screen_width db 0 ; ширина экрана
16 0105 00000000 old_09h dd 0 ; адрес старого обработчика 09h прерывания.
17 0109 00000000 old_2fh dd 0 ; адрес старого обработчика 2Fh прерывания.
18
19
20 ; новый обработчик 2Fh прерывания (multiplex interrupt)
21 ; пользовательский запрос AH=0xAAxx, где xx - запрашиваемая функция.
22 ; хх=00 - проверка на загрузку программы, если программа уже есть в памяти то на выходе AL=0xAA
23 ; xx=01 - выгрузка прораммы, если программа удачно выгружена из памяти, то на выходе AL=0хАА
24 010D NEW_2FH proc
25 010D 80 FC AA cmp AH, 0AAH ;Пользовательская ли функция прерывания 2FH?
26 0110 74 05 je my_func_int2Fh
27 0112 2E: FF 2E 0109r jmp CS:old_2FH ; какая-то из старых функции (запуск старого обработчика)
28
29 0117 my_func_int2Fh:
30 0117 3C 00 cmp AL, 00H ;Проверка на установку
31 0119 74 09 je int2Fh_inst
32
33 011B 3C 01 cmp AL, 01H ;Проверка на ыыгрузку
34 011D 74 08 je int2Fh_unins
35
36 011F 2E: FF 2E 0109r jmp CS:old_2FH ; запуск старого обработчика
37
38 0124 int2Fh_inst:
39 0124 B0 AA mov AL, 0AAH ;Возврат обозначает что резидентная программа
40 0126 CF iret ;уже установлена (0хАА)
41
42 0127 int2Fh_unins:
43 0127 1E push DS
44 0128 06 push ES
45
46 0129 B4 25 mov AH, 25H ;Восстановление обработчика прерывания 09H
47 012B B0 09 mov AL, 09H
48 012D 2E: C5 16 0105r lds DX, CS:old_09H
49 0132 CD 21 int 21H
50
51 0134 B4 25 mov AH, 25H ;Восстановление обработчика прерывания 2FH
52 0136 B0 2F mov AL, 2FH
53 0138 2E: C5 16 0109r lds DX, CS:old_2FH
54 013D CD 21 int 21H
55
56 013F 2E: 8E 06 002C mov ES, CS:2CH ;Выгрузка собственного окружения.(берем из PSP)
57 0144 B4 49 mov AH, 49H
58 0146 CD 21 int 21H
59
60 0148 0E push CS ;выгрузка кода программы
61 0149 07 pop ES
62 014A B4 49 mov AH, 49H
63 014C CD 21 int 21H
64
65 014E 07 pop ES
66 014F 1F pop DS
67 0150 B0 AA mov AL, 0AAH ; все ок
68 0152 CF iret
69 0153 NEW_2FH endp
70
71 ; новый обработчик 09h прерывания (keyboard interrupt)
72 ; запускается только если нажаты кнопки B R G,
73 ; в противном случае - сразу запускает старый обработчик прерывания.
74 0153 NEW_09H proc
75 0153 9C pushf
76 0154 50 push AX
77 0155 E4 60 in AL, 60h ; считать из порта клавиатуры скан код нажатой +
78 клавишы
79 0157 2E: C6 06 0103r 10 mov CS:background_colour, 10h ; фон - синий
80 015D 3C 30 cmp AL, 30h ; scan-код клавиши B
81 015F 74 1D je captured
82 0161 2E: C6 06 0103r 20 mov CS:background_colour, 20h ; фон - зеленый
83 0167 3C 22 cmp AL, 22h ; scan-код клавиши G
84 0169 74 13 je captured
85 016B 2E: C6 06 0103r 40 mov CS:background_colour, 40h ; фон - красный
86 0171 3C 13 cmp AL, 13h ; scan-код клавиши R
87 0173 74 09 je captured
88 0175 2E: C6 06 0103r 00 mov CS:background_colour, 00h
89 017B EB 37 90 jmp not_captured ; нужные клавишы не были нажаты
90
91 017E captured: ; изменение фона
92 017E 53 push BX
93 017F 51 push CX
94 0180 52 push DX
95 0181 1E push DS
96 0182 57 push DI
97
98 0183 BF 0001 mov DI,1
99 0186 B8 B800 mov AX, 0b800h
100 0189 8E D8 mov DS, AX
101 018B E8 002E call READ_VIDEO_MODE ; считываем текущий видео режим
102 018E 33 D2 xor DX, DX ; курсор в точку 0,0
103
104 0190 full_scr:
105 0190 8A 05 mov AL,DS:[DI]
106 0192 24 0F and AL,0Fh
107 0194 2E: 0A 06 0103r or AL,CS:background_colour
108 0199 88 05 mov DS:[DI],AL
109 019B 47 inc DI
110 019C 47 inc DI
111 019D FE C2 inc DL
112 019F 2E: 3A 16 0104r cmp DL, CS:screen_width ; прошли строчку?
113 01A4 75 EA jnz full_scr
114 01A6 32 D2 xor DL, DL
115 01A8 FE C6 inc DH
116 01AA 80 FE 19 cmp DH, 25 ; все 25 строк?
117 01AD 75 E1 jnz full_scr
118
119 01AF 5F pop DI
120 01B0 1F pop DS
121 01B1 5A pop DX
122 01B2 59 pop CX
123 01B3 5B pop BX
124 01B4 not_captured:
125 01B4 58 pop AX
126 01B5 9D popf
127 01B6 2E: FF 2E 0105r jmp CS:old_09h ; запустить старый обработчик
128 01BB CF iret
129 01BC NEW_09H endp
130
131
132 ; функция получения текущего видео режима
133 ; входные данные:
134 ; нет
135 ; выходные данные:
136 ; cur_page - текущая видео страница
137 ; screen_width - ширина экрана
138 01BC READ_VIDEO_MODE proc
139 01BC 50 push AX
140 01BD 53 push BX
141 01BE B4 0F mov AH, 0Fh ; func: read video mode
142 01C0 CD 10 int 10h ; int: video services
143 01C2 2E: 88 26 0104r mov CS:screen_width, AH
144 01C7 5B pop BX
145 01C8 58 pop AX
146 01C9 C3 ret
147 01CA READ_VIDEO_MODE endp
148
149 ; инициализация резидентной прораммы
150 ; (первый запуск)
151 01CA INIT:
152 01CA 26: 8A 0E 0080 mov CL, ES:80H
153 01CF 80 F9 00 cmp CL, 0 ; есть параметры командной строки?
154 01D2 74 1F je no_info ; нету
155
156 01D4 32 ED xor CH, CH ; есть
157 01D6 BF 0081 mov DI, 81H
158
159 01D9 B0 20 mov AL, ' '
160 01DB F3> AE repe scasb ;пропускаем пробелы
161 01DD 4F dec DI
162
163 01DE 26: 8A 05 mov AL, ES:[DI] ;проверяем на '/?' и '/?'
164 01E1 3C 2F cmp AL, '/'
165 01E3 75 50 jne wrong_parametr
166 01E5 47 inc DI
167 01E6 26: 8A 05 mov AL, ES:[DI]
168 01E9 3C 3F cmp AL, '?'
169 01EB 75 48 jne wrong_parametr ; неизвестный параметр
170
171 01ED BA 02B8r mov DX, offset mes_info ; вывести информацию о программе
172 01F0 E8 0065 call STR_OUT
173
174 01F3 no_info:
175 01F3 B8 AA00 mov AX, 0AA00h ; проверить не загружен ли уже резидент
176 01F6 CD 2F int 2Fh
177 01F8 3C AA cmp AL, 0AAh
178 01FA 74 51 je already_load ; уже загружен!
179
180 01FC load_resident: ; загрузка
181 01FC B4 35 mov AH, 35H ; сохранение адреса старого обработчика прерывания 2FH
182 01FE B0 2F mov AL, 2FH
183 0200 CD 21 int 21H
184 0202 89 1E 0109r mov word ptr old_2FH, BX
185 0206 8C 06 010Br mov word ptr old_2FH+2, ES
186
187 020A B4 25 mov AH, 25H ; назначение нового обработчика прерывания 2FH
188 020C B0 2F mov AL, 2FH ; (функция new_2FH)
189 020E BA 010Dr mov DX, offset new_2FH
190 0211 CD 21 int 21H
191
192 0213 B4 35 mov AH, 35H ; сохранение адреса старого обработчика прерывания 09H
193 0215 B0 09 mov AL, 09H
194 0217 CD 21 int 21H
195 0219 89 1E 0105r mov word ptr old_09H, BX
196 021D 8C 06 0107r mov word ptr old_09H+2, ES
197
198 0221 B4 25 mov AH, 25H ; назначение нового обработчика прерывания 09H
199 0223 B0 09 mov AL, 09H ; (функция new_09H)
200 0225 BA 0153r mov DX, offset NEW_09H
201 0228 CD 21 int 21H
202
203 022A BA 025Fr mov DX, offset mes_load ; выдать сообщение о загрузке
204 022D E8 0028 call STR_OUT
205
206 0230 BA 01CAr mov DX, offset init ; выход невыгружая резидентную часть программы
207 0233 CD 27 int 27h ; int: terminate but stay resident
208
209 0235 wrong_parametr: ; не верный параметр командной строки
210 0235 BA 0433r mov DX, offset mes_wr_par ; выдать сообщение об ошибке
211 0238 E8 001D call STR_OUT
212 023B B8 AA00 mov AX, 0AA00h ; проверить загружен ли уже резидент
213 023E CD 2F int 2Fh
214 0240 3C AA cmp AL, 0AAh
215 0242 74 09 je already_load ; уже загружен
216 0244 BA 047Ar mov DX, offset mes_not_load ; не загружен, выдать об этом сообщение
217 0247 E8 000E call STR_OUT
218 024A EB 07 90 jmp exit ; выход
219
220 024D already_load: ; резидент уже находится в памяти
221 024D BA 028Er mov DX, offset mes_already_load ; выдать сообщение об этом
222 0250 E8 0005 call STR_OUT
223 0253 exit: ; полный выход
224 0253 B8 4C00 mov AX, 4C00H ; выход с полной выгрузкой текущей копии программы
225 0256 CD 21 int 21H
226
227 ; функция вывода строки на экран
228 ; входные данные:
229 ; DX - адрес строки
230 ; выходные данные:
231 ; нет
232 0258 STR_OUT proc
233 0258 50 push AX
234 0259 B4 09 mov AH, 09h
235 025B CD 21 int 21h
236 025D 58 pop AX
237 025E C3 ret
238 025F STR_OUT endp
239
240 025F 54 68 65 20 72 65 73+ mes_load db 'The resident programm was succesfully loaded',0Ah,0Dh,'$'
241 69 64 65 6E 74 20 70+
242 72 6F 67 72 61 6D 6D+
243 20 77 61 73 20 73 75+
244 63 63 65 73 66 75 6C+
245 6C 79 20 6C 6F 61 64+
246 65 64 0A 0D 24
247 028E 54 68 65 20 72 65 73+ mes_already_load db 'The resident programm is already loaded',0Ah,0Dh,'$'
248 69 64 65 6E 74 20 70+
249 72 6F 67 72 61 6D 6D+
250 20 69 73 20 61 6C 72+
251 65 61 64 79 20 6C 6F+
252 61 64 65 64 0A 0D 24
253 02B8 2D 2D 2D 2D 2D 2D 2D+ mes_info db '-------------------------------------------------------',0Ah, +
254 2D 2D 2D 2D 2D 2D 2D+ 0Dh,'This is resident programm for changing background colour',0Ah,0Dh,'Press G - for green +
255 2D 2D 2D 2D 2D 2D 2D+ colour',0Ah,0Dh,'Press R - for red colour',0Ah,0Dh,'Press B - for blue colour',0Ah,0Dh, +
256 2D 2D 2D 2D 2D 2D 2D+ 'bkgtsr.com - itself resident programm',0Ah,0Dh,'unldtsr.exe - tool for unload this resident +
257 2D 2D 2D 2D 2D 2D 2D+ programm',0Ah,0Dh,'Coded by Ablamtsev Dm. (Oman)',0Ah,0Dh, +
258 2D 2D 2D 2D 2D 2D 2D+ '-------------------------------------------------------',0Ah,0Dh,'$'
259 2D 2D 2D 2D 2D 2D 2D+
260 2D 2D 2D 2D 2D 2D 0A+
261 0D 54 68 69 73 20 69+
262 73 20 72 65 73 69 64+
263 65 6E 74 20 70 72 6F+
264 67 72 61 6D 6D 20 66+
265 6F 72 20 63 68 61 6E+
266 67 69 6E 67 20 62 61+
267 63 6B 67 72 6F 75 6E+
268 64 20 63 6F 6C 6F 75+
269 72 0A 0D 50 72 65 73+
270 73 20 47 20 2D 20 66+
271 6F 72 20 67 72 65 65+
272 6E 20 63 6F 6C 6F 75+
273 72 0A 0D 50 72 65 73+
274 73 20 52 20 2D 20 66+
275 6F 72 20 72 65 64 20+
276 63 6F 6C 6F 75 72 0A+
277 0D 50 72 65 73 73 20+
278 42 20 2D 20 66 6F 72+
279 20 62 6C 75 65 20 63+
280 6F 6C 6F 75 72 0A 0D+
281 62 6B 67 74 73 72 2E+
282 63 6F 6D 20 20 2D 20+
283 69 74 73 65 6C 66 20+
284 72 65 73 69 64 65 6E+
285 74 20 70 72 6F 67 72+
286 61 6D 6D 0A 0D 75 6E+
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.