Лист (1071495)
Текст из файла
Московский государственный технический университет им. Н.Э.Баумана
_________________________________________________________________
Утверждаю: | |
Большаков С.А. | "__"_____________2006 г. |
Курсовая работа по курсу Системное программирование
«Драйвер русификатора клавиатуры (переключение по выбранной клавише) »
Текст программы
(вид документа)
писчая бумага
(вид носителя)
11
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-53 | _____________________ |
Жулин А.В. | "__"_____________2006 г. |
Москва - 2006
________________________________________________________________
СОДЕРЖАНИЕ
1. Файл TRNS.COM Ошибка! Закладка не определена.
2. Файл UNLDTSR.exe 10
1. Файл TRNS.COM
Turbo Assembler Version 4.1 02/12/06 14:34:15 Page 1
trns.asm
1 0000 .model tiny
2 0000 code segment 'code'
3 assume CS:code, DS:code
4 org 100h
5 0100 start proc
6 0100 E9 01D2 jmp init
7 0103 00000000 old_2Fh dd 0
8 0107 00000000 old_09h dd 0
9 010B 01 vkl db 1
10 010C 00 caps db 0
11
12 ;Новый обработчик прерываний от клавиатуры
13
14 010D new_09h proc
15 010D 50 push AX
16 010E 53 push BX
17 010F 06 push ES
18 0110 1E push DS
19 0111 0E push CS
20 0112 1F pop DS
21
22 0113 B8 0040 mov AX, 40h ;40h-сегмент,где хранятся флаги сост-я клавы,кольц. +
23 буфер ввода
24 0116 8E C0 mov ES, AX
25 0118 E4 60 in AL, 60h ;записываем в AL состояние скен-код нажатой клавиши
26 011A 3C 2D cmp AL, 2Dh ;была нажата клавиша X?
27 011C 75 29 jne dalee
28 011E 26: 8A 26 0017 mov AH, ES:[17h] ;флаги клавиатуры
29 0123 80 E4 0F and AH, 00001111b
30 0126 80 FC 04 cmp AH, 00000100b ;был ли нажат ctrl?
31 0129 75 1C jne dalee
32 012B B0 01 mov AL, 1
33 012D 2A 06 010Br sub AL, vkl
34 0131 A2 010Br mov vkl, AL
35
36 0134 E4 61 in AL, 61h ;контроллер состояния клавиатуры
37 0136 0C 80 or AL, 10000000b ;пометим, что клавишу нажали
38 0138 E6 61 out 61h, AL
39 013A 24 7F and AL, 01111111b ;пометим, что клавишу отпустили
40 013C E6 61 out 61h, AL
41 013E B0 20 mov AL, 20h
42 0140 E6 20 out 20h, AL ;отправим в контроллер прерываний признак конца +
43 прерывания
44
45 0142 1F pop DS
46 0143 07 pop ES
47 0144 5B pop BX
48 0145 58 pop AX
49 0146 CF iret
50
51 0147 26: 8A 26 0017 dalee: mov AH, ES:[17h]
52 014C 80 E4 40 and AH, 01000000b ;CapsLock
53 014F 80 FC 00 cmp AH, 0
54 0152 74 05 je prod
55 0154 C6 06 010Cr 01 mov caps, 1
56 0159 9C prod: pushf
57 015A FF 1E 0107r call old_09h
58 015E 80 3E 010Br 00 cmp vkl, 0
59 0163 74 1C je _vih
60 0165 26: 8B 1E 001C mov BX, ES:[1Ch] ;адрес хвоста
61 016A 4B dec BX ;сместимся назад к последнему
62 016B 4B dec BX ;введённому символу
63 016C 83 FB 1E cmp BX, 1Eh ;не вышли ли мы за пределы буфера?
64 016F 73 03 jae go
65 0171 BB 003C mov BX, 3Ch ;хвост вышел за пределы буфера, значит последний введённый +
66 символ
67 ;находится в конце буфера
68
69 0174 26: 8B 07 go: mov AX, ES:[BX]
70 0177 3D 2146 cmp AX, 2146h ;F -> А
71 017A 75 08 jne go1
72 017C 26: C7 07 2180 mov word ptr ES:[BX], 2180h
73 0181 E9 0103 _vih: jmp vih
74 0184 3D 2166 go1: cmp AX, 2166h ;f -> а
75 0187 75 08 jne go2
76 0189 26: C7 07 21A0 mov word ptr ES:[BX], 21A0h
77 018E E9 00F6 jmp vih
78 0191 3D 333C go2: cmp AX, 333Ch ; < -> б
79 0194 75 17 jne go3
80 0196 80 3E 010Cr 00 cmp caps, 0
81 019B 74 08 je bol_B
82 019D 26: C7 07 33A1 mov word ptr ES:[BX], 33A1h
83 01A2 E9 00E2 jmp vih
84 01A5 26: C7 07 3381 bol_B: mov word ptr ES:[BX], 3381h
85 01AA E9 00DA jmp vih
86
87 01AD 3D 332C go3: cmp AX, 332Ch ; , -> б
88 01B0 75 0F jne go4
89 01B2 80 3E 010Cr 00 cmp caps, 0
90 01B7 75 EC jne bol_B
91 01B9 26: C7 07 33A1 mov word ptr ES:[BX], 33A1h ;б
92 01BE E9 00C6 jmp vih
93
94 01C1 3D 2044 go4: cmp AX, 2044h ;D->В
95 01C4 75 08 jne go5
96 01C6 26: C7 07 2082 mov word ptr ES:[BX], 2082h
97 01CB E9 00B9 jmp vih
98 01CE 3D 2064 go5: cmp AX, 2064h ;d->в
99 01D1 75 08 jne go6
100 01D3 26: C7 07 20A2 mov word ptr ES:[BX], 20A2h
101 01D8 E9 00AC jmp vih
102
103 01DB 3D 1655 go6: cmp AX, 1655h ;U->Г
104 01DE 75 08 jne go7
105 01E0 26: C7 07 1683 mov word ptr ES:[BX], 1683h
106 01E5 E9 009F jmp vih
107 01E8 3D 1675 go7: cmp AX, 1675h ;u->г
108 01EB 75 08 jne go8
109 01ED 26: C7 07 16A3 mov word ptr ES:[BX], 16A3h
110 01F2 E9 0092 jmp vih
111
112 01F5 3D 264C go8: cmp AX, 264Ch ;L->Д
113 01F8 75 08 jne go9
114 01FA 26: C7 07 2684 mov word ptr ES:[BX], 2684h
115 01FF E9 0085 jmp vih
116 0202 3D 266C go9: cmp AX, 266Ch ;l->д
117 0205 75 05 jne go10
118 0207 26: C7 07 26A4 mov word ptr ES:[BX], 26A4h
119 020C 3D 273A go10: cmp AX, 273Ah ; : -> Ж
120 020F 75 17 jne go11
121 0211 80 3E 010Cr 00 cmp caps, 0
122 0216 74 08 je bol_G
123 0218 26: C7 07 27A6 mov word ptr ES:[BX], 27A6h
124 021D EB 68 90 jmp vih
125 0220 26: C7 07 2786 bol_G: mov word ptr ES:[BX], 2786h
126 0225 EB 60 90 jmp vih
127
128 0228 3D 273B go11: cmp AX, 273Bh ; ; -> ж
129 022B 75 0F jne go12
130 022D 80 3E 010Cr 00 cmp caps, 0
131 0232 75 EC jne bol_G
132 0234 26: C7 07 27A6 mov word ptr ES:[BX], 27A6h
133 0239 EB 4C 90 jmp vih
134 023C 3D 1950 go12: cmp AX, 1950h ;P->З
135 023F 75 08 jne go13
136 0241 26: C7 07 1987 mov word ptr ES:[BX], 1987h
137 0246 EB 3F 90 jmp vih
138 0249 3D 1970 go13: cmp AX, 1970h ;p->з
139 024C 75 08 jne go14
140 024E 26: C7 07 19A7 mov word ptr ES:[BX], 19A7h
141 0253 EB 32 90 jmp vih
142
143 0256 3D 3042 go14: cmp AX, 3042h ;B->И
144 0259 75 08 jne go15
145 025B 26: C7 07 3088 mov word ptr ES:[BX], 3088h
146 0260 EB 25 90 jmp vih
147 0263 3D 3062 go15: cmp AX, 3062h ;b->и
148 0266 75 08 jne go16
149 0268 26: C7 07 30A8 mov word ptr ES:[BX], 30A8h
150 026D EB 18 90 jmp vih
151
152 0270 3D 1352 go16: cmp AX, 1352h ;R->К
153 0273 75 08 jne go17
154 0275 26: C7 07 138A mov word ptr ES:[BX], 138Ah
155 027A EB 0B 90 jmp vih
156 027D 3D 1372 go17: cmp AX, 1372h ;r->к
157 0280 75 05 jne vih
158 0282 26: C7 07 13AA mov word ptr ES:[BX], 13AAh
159
160 0287 C6 06 010Cr 00 vih: mov caps, 0
161 028C 1F pop DS
162 028D 07 pop ES
163 028E 5B pop BX
164 028F 58 pop AX
165 0290 new_09h endp
166
167 ;Новый обработчик прерывания 2Fh
168
169 0290 new_2Fh proc
170 0290 80 FC FF cmp AH, 0FFh ;наша функция?
171 0293 75 3B jne vihod ;нет - на старый обработчик
172 0295 3C 00 cmp AL, 0 ;подфункция проверки, загружен ли резидент в память?
173 0297 74 07 je install
174 0299 3C 01 cmp AL, 1 ;подфункция выгрузки из памяти?
175 029B 74 07 je uninstall
176 029D EB 31 90 jmp vihod ;нет - на старый обработчик
177
178 02A0 B8 5353 install: mov AX, 'SS' ;вернём SS, если резидент загружен в память
179 02A3 CF iret
180
181 02A4 1E uninstall: push DS
182 02A5 06 push ES
183 02A6 52 push DX
184
185 02A7 B4 25 mov AH, 25h ;восстановим 9-е прерывание
186 02A9 B0 09 mov AL, 09h
187 02AB 2E: C5 16 0107r lds DX, CS:old_09h
188 02B0 CD 21 int 21h
189
190 02B2 B4 25 mov AH, 25h ;восстановим прерывание 2Fh
191 02B4 B0 2F mov AL, 2Fh
192 02B6 2E: C5 16 0103r lds DX, CS:old_2Fh
193 02BB CD 21 int 21h
194
195 02BD 2E: 8E 06 002C mov ES, CS:2Ch ;загрузим в ES адрес окружения
196 02C2 B4 49 mov AH, 49h ;выгрузим из памяти окружение
197 02C4 CD 21 int 21h
198
199 02C6 0E push CS
200 02C7 07 pop ES ;в ES - адрес резидентной проги
201 02C8 B4 49 mov AH, 49h ;выгрузим из памяти резидент
202 02CA CD 21 int 21h
203 02CC 5A pop DX
204 02CD 07 pop ES
205 02CE 1F pop DS
206 02CF CF iret
207
208 02D0 2E: FF 2E 0103r vihod: jmp CS:old_2Fh ;вызов старого обработчика
209 02D5 new_2Fh endp
210
211 =CODE:02D5 end_res=$
212 02D5 start endp
213
214 ;Инициализация
215
216 02D5 init proc
217 02D5 E8 005A call param
218 02D8 E8 0000 call load_tsr
219 02DB init endp
220
221 ;Загрузчик резидента память
222
223 02DB load_tsr proc
224 02DB B8 FF00 mov AX, 0FF00h
225 02DE CD 2F int 2Fh ;проверка на наличие резидента в памяти
226 02E0 3D 5353 cmp AX, 'SS' ;если вернули АА - резидент в памяти
227 02E3 74 41 je installed
228 02E5 B4 35 mov AH, 35h ;получим адрес
229 02E7 B0 2F mov AL, 2Fh ;обработчика прерывания 2Fh
230 02E9 CD 21 int 21h
231
232 02EB 2E: 89 1E 0103r mov word ptr CS:old_2Fh, BX ;запишем смещение старого обработчика
233 02F0 2E: 8C 06 0105r mov word ptr CS:old_2Fh + 2, ES ;запишем сегмент
234
235 02F5 B4 25 mov AH, 25h ;установим новый адрес
236 02F7 B0 2F mov AL, 2Fh ;обработчика прерывания 2Fh
237 02F9 BA 0290r mov DX, offset new_2Fh
238 02FC CD 21 int 21h
239
240 02FE B4 35 mov AH, 35h ;получим адрес обработчика
241 0300 B0 09 mov AL, 09h ;9-го прерывания
242 0302 CD 21 int 21h
243
244 0304 2E: 89 1E 0107r mov word ptr CS:old_09h, BX
245 0309 2E: 8C 06 0109r mov word ptr CS:old_09h + 2, ES
246
247 030E B4 25 mov AH, 25h ;установим новый адрес
248 0310 B0 09 mov AL, 09h ;обработчика прерывания 09h
249 0312 BA 010Dr mov DX, offset new_09h
250 0315 CD 21 int 21h
251
252 0317 B4 09 mov AH, 09h
253 0319 BA 0394r mov DX, offset tsr_load
254 031C CD 21 int 21h
255
256 031E B8 3100 mov AX, 3100h ;выйти из программы и оставить в ОП её резидентную часть
257 0321 BA 002E mov DX, (end_res-start+10Fh)/16 ;размер резидента
258 0324 CD 21 int 21h
259
260 0326 B4 09 installed: mov AH, 09h
261 0328 BA 03AAr mov DX, offset tsr_error
262 032B CD 21 int 21h
263 032D B8 4C01 mov AX, 4C01h ;выйти из программы с кодом ошибки 1
264 0330 CD 21 int 21h
265 0332 load_tsr endp
266
267 ;Определение параметров запуска
268
269 0332 param proc
270 0332 06 push ES
271 0333 33 C9 xor CX, CX
272 0335 26: 8A 0E 0080 mov CL, ES:[80h]
273 033A 80 F9 00 cmp CL, 0
274 033D 74 47 je konec
275 033F BE 0081 mov SI, 81h
276
277 0342 26: 8A 04 prob: mov AL, ES:[SI]
278 0345 3C 20 cmp AL, ' '
279 0347 75 03 jne vih1
280 0349 46 inc SI
281 034A E2 F6 loop prob
282
283 034C 26: 8A 04 vih1: mov AL, ES:[SI]
284 034F 3C 00 cmp AL, 0
285 0351 74 33 je konec
286 0353 3C 2F cmp AL, '/'
287 0355 75 31 jne error_p
288 0357 46 inc SI
289 0358 FE C9 dec CL
290 035A 26: 8A 04 mov AL, ES:[SI]
291 035D 3C 3F cmp AL, '?'
292 035F 75 27 jne error_p
293 0361 46 inc SI
294 0362 FE C9 dec CL
295 0364 80 F9 00 cmp CL, 0
296 0367 74 00 je sprav
297
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.