Листинг (1071452)
Текст из файла
Московский государственный технический университет им. Н.Э.Баумана
_________________________________________________________________
Утверждаю: | |
Большаков С.А. | "__"_____________2014 г. |
Курсовая работа по курсу Системное программирование
«Резидентная программа (TSR)»
Листинг программы
(вид документа)
писчая бумага
(вид носителя)
16
(количество листов)
ИСПОЛНИТЕЛЬ: | |
студент группы ИУ5-42 | _____________________ |
Зайков С.А. | "__"_____________2014 г. |
Москва - 2014
________________________________________________________________
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 1
kurs1.asm
1 0000 .model tiny ; tiny модель памяти
2 .286 ; рассчитан на семейство 286 процессоров
3
4 0000 codeSegment SEGMENT 'code'
5
6 ASSUME CS:codeSegment, DS:codeSegment
7 ORG 100h ; для работы com-файла
8
9 0100 start:
10 0100 E9 028F jmp init ; начинаем работу с процедуры init
11
12 ; +
13
14 ================================
15 ; =============================================== Блок данных (переменных) +
16 =======================================================
17 ; +
18
19 ================================
20
21 ; +
22 --------------------------------------------------------------
23 -----
24 ; ---------------------------- Блок с различными сообщениями от TSR +
25 -----------------------------------
26 ; +
27 --------------------------------------------------------------
28 -----
29 0103 0A 0D 90 A5 A7 A8 A4+ msg_unload db 10, 13, 'Резидент выгружен', 10, 13, '$'
30 A5 AD E2 20 A2 EB A3+
31 E0 E3 A6 A5 AD 0A 0D+
32 24
33 0119 90 A5 A7 A8 A4 A5 AD+ msg_alreadyLoaded db 'Резидент уже в памяти$'
34 E2 20 E3 A6 A5 20 A2+
35 20 AF A0 AC EF E2 A8+
36 24
37
38 ; +
39 --------------------------------------------------------------
40 -----
41 ; ----------------------------- Здесь хранятся адреса на старые прерывания +
42 ----------------------------
43 ; +
44 --------------------------------------------------------------
45 -----
46 012F 0000 int2Fh_offset dw 0
47 0131 0000 int2Fh_segment dw 0
48
49 0133 0000 int09h_offset dw 0
50 0135 0000 int09h_segment dw 0
51
52 0137 0000 int1Ch_offset dw 0
53 0139 0000 int1Ch_segment dw 0
54
55 ; +
56 ------------------------------------------------------------------------------------------------
57 -----
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 2
kurs1.asm
58 ; ------------------------------Все для работы с таймером +
59 --------------------------------------------
60 ; +
61 --------------------------------------------------------------
62 -----
63 013B 87 A0 A9 AA AE A2 20+ tmr_msg db 'Зайков ИУ5-42 Вариант 9', 10, 13, '$'
64 88 93 35 2D 34 32 20+
65 82 A0 E0 A8 A0 AD E2+
66 20 39 0A 0D 24
67 0155 00 tmr_active db 0 ; 0 - таймер выключен, все остальное -
68 включен
69 0156 0000 tmr_time dw 0 ; время с момента старта +
70 таймера
71 =0043 tmr_key equ 43h ; Скан код F9, которая вызывает таймер
72 =1B58 tmr_timeAll equ 7000 ; количество миллисекунд таймера
73
74 ; +
75 --------------------------------------------------------------
76 -----
77 ; ----------------------------------Все для работы с курсивной +
78 буквой----------------------------------
79 ; +
80 --------------------------------------------------------------
81 -----
82 0158 00 kurs_active db 0 ; 0 - флаг выключен, иначе - включен
83 =003B kurs_key equ 3Bh ; Скан код F1
84 =0088 kurs_symbolIndex equ 88h ; буква, для замены
85
86 0159 00 kurs_symbolNew db 00000000b
87 015A 00 db 00000000b
88 015B 00 db 00000000b
89 015C 33 db 00110011b
90 015D 33 db 00110011b
91 015E 33 db 00110011b
92 015F 37 db 00110111b
93 0160 6F db 01101111b
94 0161 7B db 01111011b
95 0162 73 db 01110011b
96 0163 E6 db 11100110b
97 0164 C6 db 11000110b
98 0165 C6 db 11000110b
99 0166 00 db 00000000b
100 0167 00 db 00000000b
101 0168 00 db 00000000b
102
103 ; +
104 --------------------------------------------------------------
105 -----
106 ; -------------------------------------- Все для работы с руссификацией +
107 -------------------------------
108 ; +
109 --------------------------------------------------------------
110 -----
111 0169 00 russ_active db 0 ; 0 – флаг выключен, иначе - включен
112 =003C russ_key equ 3Ch ; Скан код F2
113
114 016A 25 2F 15 24 22 00 russ_scancode db 25h, 2Fh, 15h, 24h, 22h, 0 ; скан-код клавиш, для которых +
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 3
kurs1.asm
115 нужна руссификация. Ноль - конец последовательности
116 0170 8B 8C 8D 8E 8F russ_ascii db 8Bh, 8Ch, 8Dh, 8Eh, 8Fh ; ANSI +
117 клавиш
118
119 ; +
120 --------------------------------------------------------------
121 -----
122 ; ----------------------Все для работы с заменой/ограничением +
123 -------------------
124 ; +
125 --------------------------------------------------------------
126 -----
127 0175 00 ignore_active db 0 ; 0 - выключено, иначе - включено
128 =003D ignore_key equ 3Dh ;Скан код F3
129 0176 61 62 63 64 65 66 67+ ignore_table db 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', +
130 68 69 6A 6B 6C 6D 6E+ 0 ;игнорируемые значения
131 6F 70 71 72 73 74 75+
132 76 77 78 79 7A 41 42+
133 43 44 45 46 47 48 49+
134 4A 4B 4C 4D 4E 4F 50+
135 51 52 53 54 55 56 57+
136 58 59 5A 00
137
138 ; +
139
140 ================================
141 ; ============================================= Конец блока данных +
142
143 ; +
144
145 ================================
146
147
148
149
150 ; +
151 --------------------------------------------------------------
152 ----------
153 ; отменяет последний введенный символ, если он из ignore_table
154 ; +
155 --------------------------------------------------------------
156 ----------
157
158 01AB ignoreLetter PROC
159 01AB 50 push AX
160 01AC B8 0040 mov AX, 40h ; 40h- флаги состояния клавиатуры
161 01AF 8E C0 mov ES, AX
162 01B1 26: 8B 1E 001C mov BX, ES:[1Ch] ;адрес конца
163 01B6 83 EB 02 sub BX, 2 ; смотрим последний символ
164 01B9 83 FB 1E cmp BX, 1Eh ; выход за буфер?
165 01BC 73 03 jae il_1
166 01BE BB 003C mov BX, 3Ch ; вышел, значит последний введенный символ
167 01C1 il_1:
168
169 01C1 5A pop DX
170 01C2 26: 8B 07 mov AX, ES:[BX] ; в AX символ, DH = scan-код, DL = ASCII-код
171 01C5 3A E2 cmp AH, DL ; скан код пришедшего символа [DL] и скан-код последнего в +
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 4
kurs1.asm
172 буфере
173 01C7 75 1E jne il_exit ; не равны, значит выходим
174 01C9 B9 FFFF mov CX, 0FFFFh ; Обнулим CX
175 (FFFFh + 1 = 0)
176 01CC BA 0176r lea DX, ignore_table
177 01CF 53 push BX
178
179 01D0 il_nextLetter:
180 01D0 41 inc CX
181 01D1 8B DA mov BX, DX ; BX - адрес кода из ignore_table
182 01D3 03 D9 add BX, CX ; его сравниваем с пришедшим
183
184 01D5 80 3F 00 cmp byte ptr [BX], 0 ; если конец последовательности
185 01D8 74 0B je il_exitPop ; выходим
186
187 01DA 38 07 cmp byte ptr [BX], AL ; ASCII-код ignore_table не равен ASCII-коду+
188 в AL
189 01DC 75 F2 jne il_nextLetter ; переходим к последующему символу
190
191 01DE 5B pop BX
192 01DF 26: 89 1E 001C mov ES:[1Ch], BX ; блокируем ввод символа
193 01E4 C3 ret
194 01E5 il_exitPop:
195 01E5 5B pop BX
196 01E6 C3 ret
197 01E7 il_exit:
198 01E7 C3 ret
199 01E8 ignoreLetter ENDP
200
201 ; ---------------------------------------------------------------------------
202 ; Забирает
203 ; Скан-код клавиши в AL
204
205 ; Если нажат шифт и один из скан-кодов (russ_scancode), помещает в буфер ASCII код (russ_ascii)
206 ;то возвращает
207 ; AL = 0, если успешно, иначе - неудача
208 ; ---------------------------------------------------------------------------
209
210 01E8 russLetter PROC
211 01E8 50 push AX ; в AL будет скан-код, поэтому сохраним AX
212 01E9 B4 02 mov AH, 02h ; загрузим флаги клавиатуры
213 01EB CD 16 int 16h
214 01ED 24 03 and AL, 00000011b ; shift нажат?
215 01EF 3C 00 cmp AL, 0 ; если AL == 0, значит shift НЕ нажат
216 01F1 58 pop AX ; достаем AX
217 01F2 74 24 je rl_exitFail ; если AL = 0 - выходим
218
219 01F4 BA 016Ar lea DX, russ_scancode ; DX = адрес russ_scancode
220 01F7 B9 FFFF mov CX, 0FFFFh ; обнулим CX, +
221 (FFFFh + 1 = 0)
222
223 01FA rl_nextLetter:
224 01FA 41 inc CX
225 01FB 8B DA mov BX, DX ; в BX - адрес кода из russ_scancode
226 01FD 03 D9 add BX, CX ; сравниваем с пришедшим
227
228 01FF 80 3F 00 cmp byte ptr [BX], 0 ; последовательность завершена ->
Turbo Assembler Version 3.1 04/18/14 08:08:07 Page 5
kurs1.asm
229 0202 74 14 je rl_exitFail ; выходим
230
231 0204 38 07 cmp byte ptr [BX], AL ; если скан-код из russ_scancode не равен +
232 скан-коду в AL
233 0206 75 F2 jne rl_nextLetter ; переходим к следующему символу
234
235 0208 BB 0170r lea BX, russ_ascii ; BX = адрес russ_ascii
236 020B 03 D9 add BX, CX ; Добавляем ему число, равное количеству пройденных шагов, +
237 что бы перевести в соответствующий ASCII-код
238 020D 8A 07 mov AL, byte ptr [BX] ; AL = нужный ASCII-код
239
240 020F B4 05 mov AH, 05h ; добавление в буфер
241 0211 8A C8 mov CL, AL ; ASCII-код в буфер
242 0213 B5 00 mov CH, 0 ; scan-код добавляемого символа, но т.к. добавляем сразу +
243 ASCII, обнулим
244 0215 CD 16 int 16h ; помещаем в буфер. После вызова AL = 0 - успех, иначе AL = 1
245 0217 C3 ret ; выходим
246 0218 rl_exitFail:
247 0218 B0 02 mov AL, 2
248 021A C3 ret
249 021B russLetter ENDP
250
251 ; -----------------------------------------------------------------------------------
252 ; Прерывание 09h обрабатывает нажатие клавиши на клавиатуре
253 ; -----------------------------------------------------------------------------------
254
255 021B new_09h PROC
256 021B 50 push AX ; сохраним регистры
257 021C 53 push BX
258 021D 06 push ES
259 021E 1E push DS
260
261 021F 0E push CS ; DS = CS, т.к. данные
262 0220 1F pop DS ; в CS сегменте
263
264 0221 E4 60 in AL, 60h ; в AL скан-код нажатой клавиши
265
266 0223 3C 43 cmp AL, tmr_key ; нажата хотя бы одна из функциональных клавиш
267 0225 74 0F je new09h_goFarExit ; то выйдем. Обрабатывать "нажатие" будем, при пришествии +
268 сообщение об
269 0227 3C 3B cmp AL, kurs_key ; отпускании клавиши
270 0229 74 0B je new09h_goFarExit
271 022B 3C 3C cmp AL, russ_key
272 022D 74 07 je new09h_goFarExit
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.