1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
| text segment 'code'
assume CS:text, DS:text
org 100h
.186
; определение конст нт
; описыв ем сегмент код
begin: jmp main; метк точки вход прогр ммы
cr=13 ; код возвр т к ретки
lf=10 ; код перевод строки
stdout=1 ; ст нд ртный дескриптор вывод
FIO db " ghjhg,cr,lf,cr,lf,\
"ZADANIE: perehvatyvat' preryvaniya ot sistemnogo taymera, umen'shat' ih chastotu putem perescheta i periodich
FIO_LEN = $ - FIO ; длин строки FIO
iITER_COUNT db 4 ; количество итер ций
icount_start db 6 ; р змер н ч льной п узы (icount_start * 0.056 сек)
icount_current db 0 ; счётчик ср б тыв ний т ймер
x0 dw 0 ; н ч льн я x-координ т для вывод изобр жений
y0 dw 80 ; н ч льн я y-координ т для вывод изобр жений
hspace dw 5 ; горизонт льный отступ м/у точк ми
vspace dw 30 ; вертик льный отступ между точк ми
; конст нты
flag_w = 25 ; ширин фл г России (в пикселях)
flag_h = 5 ; высот фл г России (в пикселях)
; сообщение о з вершении р боты прогр ммы
sEND db "Rabota programmi zakonchena. Vihod.",cr,lf,cr
iEND_len = $ - sEND ; вычисление длины сообщения (в б йт х
main proc near
; юўшёЄър ¤ъЁрэр : эрўрыю
mov AX, 0600h ; AH=06 (яЁюъЁєЄър)
; AL=00 (тхё№ ¤ъЁрэ)
mov BH, 61h ; эюЁьры№э√щ рЄЁшсєЄ (ўхЁэю/схы√щ)
mov CX, 0000h ; тхЁїэ ыхтр яючшЎш
mov DX, 184fh ; эшцэ яЁртр яючшЎш
int 10h
; иници лизируем гр фический режим : н ч ло
mov AH, 00 ; функция уст новки гр ф. режим
mov AL, 0dh ; уст н влив ем р зрешение 320х240
int 10h ; вызов BIOS
mov AH, 0bh ; уст н влив ем цвет фон
mov BH, 00 ;
mov BL, 00 ; чёрный цвет фон
int 10h ; вызов BIOS
; иници лизируем гр фический режим : конец
; выводим н экр н ФИО, группу и з д ние
mov CX, FIO_LEN ; з носим в CX кол-во выводимых н экр н символов
lea DX, FIO ; в DX з носим смещение дрес выводимой строки FIO
mov AH, 40h ; функция вывод н экр н
mov BX, stdout ; выводим в ст нд ртный дескриптор вывод (консоль)
int 21h ; вызов DOS
; уст н влив ем свой обр ботчик прерыв ний от т ймер в вектор 1ch
mov AH, 25h ; функция з грузки вектор прерыв ний
mov AL, 1ch ; тип вектор
lea DX, alarm ; смещение н шего обр ботчик прерыв ний
push DS ; сохр няем в стек DS
push CS ; з груж ем из стек в CS (CS := DS)
pop DS ; восст н влив ем DS
int 21h ; вызыв ем DOS
pop DS ; восст н влив ем DS
; уст н влив ем н ч льные состояния для счётчиков итер ций
mov AL, [icount_start]
mov [icount_current], AL
jmp alarm
; з вершени р боты прогр ммы
EXIT:
; выводим н экр н сообщение о з вершении р боты прогр ммы
mov CX, iEND_len; з носим в CX кол-во выводимых н экр н символов
lea DX, sEND ; в DX з носим смещение дрес выводимой строки sEND
mov AH, 40h ; функция вывод н экр н
mov BX, stdout ; выводим в ст нд ртный дескриптор вывод (консоль)
int 21h ; вызов DOS
; восст н влив ем вектор прерыв ний
push DS ; сохр няем в стек DS
mov DX, 0FF53h ; смещение обр ботчик BIOS
mov AX, 0F000h ; сегмент обр ботчик BIOS
mov DS, AX ; н строим DS
mov AX, 251Ch ; функция з полнения вектор
int 21h ; вызов DOS
pop DS ; восст н влив ем DS
; функция ожид ния н ж тия кл виши
mov AH, 08h ; 08 - функция ввод символ без эх
int 21h ; вызов DOS
; иници лизируем текстовый режим : н ч ло
mov AH, 00 ; иници лиз ция гр ф. режим
mov AL, 03h ; уст н влив ем ст нд ртный текстовый режим DOS
int 10h
; иници лизируем текстовый режим : конец
; выход из прогр ммы в DOS
mov AX, 4C00h ; выход в DOS
int 21h
; обтр ботчик прерыв ния ---------------------------------------
alarm:
; сохр няем в стеке все регистры, зн чения которых мы меняем
push AX
push BX
push ES
; вызов функции рисов ния точки
call POINT
dec DS:[icount_current] ; уменьшение счётчик н 1
cmp DS:[icount_current], 0 ; счётчик = 0 ?
jne retret ; если нет, то н метку retret
call FLAG ; ин че, рисуем фл г России
xor AX, AX ; очищ ем регистр AX
mov AL, 2 ; з носим в AX число 2
mul DS:[icount_start] ; увеличив ем н ч.счётчик в 2 р з
mov DS:[icount_start], AL ; сохр няем его в переменной icount_start
mov DS:[icount_current], AL ; icount_current := icount_start
mov AX, DS:[vspace] ; з носим в AX зн чение переменной vspace
add DS:[y0], AX ; приб вляем к y0 то, что в AX (vspace)
mov DS:[x0], 00 ; x0 := 0 (н чинем с новой строки)
cmp [iITER_COUNT], 0
je EXIT
; метк выход из обр ботчик прерыв ния
retret:
; восст н влив ем из стек все те регистры, которые сохр нили р нее
pop ES
pop BX
pop AX
iret ; выход из обр ботчик прерыв ния
; обтр ботчик прерыв ния ---------------------------------------
; функция отрисовки точки
POINT proc
; сохр няем в стеке все регистры, зн чения которых мы меняем
push AX
push BX
push CX
push DX
mov AH, 0ch ; 0ch - функция вывод н экр н точки
mov AL, 2 ; з д ём цвет точки (сиреневй)
mov CX, x0 ; уст н влив ем x-координ ту
mov DX, y0 ; уст н влив ем y-координ ту
int 10h ; вызов BIOS
; увеличив ем координ ту x н величину горизонт льного отступ hspace
mov AX, [hspace]
add [x0], AX
; восст н влив ем из стек все те регистры, которые сохр нили р нее
pop DX
pop CX
pop BX
ret ; выход из функции
POINT endp
; функция рисов ния прямоугольник уст новленного цвет
; CX - x, DX - y, AL - цвет, BH - высот , BL - длин
rect proc
; сохр няем в стеке все регистры, зн чения которых мы меняем
push di
push si
push bp
; вычисляем н ч льные и конечные координ ты прямоугольник
mov bp, ax ; bx := ax
xor ax, ax ; ax := 0
mov di, cx ; di := cx
mov al, bl ; al := bl
add di, ax ; di := di + ax
mov si, dx ; si := dx
mov al, bh ; al := bh
add si, ax ; si := si + ax
p1:
push bx ; сохр-м bx в стеке
mov bh, 00h ; bh := 0
mov ax, bp ; ax := bp | з носим цвет в AL
mov ah, 0ch ; в AH код 0ch - функ-ия вывод точки н экр н
int 10h ; вызов BIOS
pop bx ; восст н влив ем bx из стек
inc cx ; cx := cx + 1
cmp cx, di ; ср внив ем cx и di | достили конц линии ?
jne p1 ; если нет, то н метку p1
xor ax, ax ; ин че ax = 0
mov al, bl ; ax := bl
sub cx, ax ; cx := cx - ax
inc dx ; dx := dx + 1
cmp dx, si ; ср внив ем dx и si | вывели весь прямоугольник ?
jne p1 ; если нет, то н метку p1
; восст н влив ем из стек все те регистры, которые сохр нили р нее
pop bp
pop si
pop di
ret ; выход из функции
rect endp
; функция отрисовки фл г России
FLAG proc
; вычисляем н ч льные и конечные координ ты прямоугольник
push AX
push BX
push CX
push DX
; уст н влив ем высоту и ширину 3-х прямоугольников, из которых сотсоит фл г
mov BH, flag_h ; BH - высот
mov BL, flag_w ; BL - длин
mov AL, 3 ; AL - цвет (белый)
mov CX, [x0] ; уст н влив ем н ч льную x-координ ту
mov DX, [y0] ; уст н влив ем н ч льную y-координ ту
call rect ; рисуем первый (белый) прямоугольник
mov AL, 1 ; уст н влив ем сиреневый цвет (з неимением в п литре кр сного)
call rect ; рисуем второй ("кр сный") прямоугольник
mov AL, 2 ; ; уст н влив ем голубой цвет (з неимением в п литре кр сного)
call rect ; рисуем третий ("синий") прямоугольник
dec [iITER_COUNT] ; уменьш ем счётчик итер ций н 1
; восст н влив ем из стек все те регистры, которые сохр нили р нее
pop DX
pop CX
pop BX
pop AX
ret
FLAG endp
main endp
text ends
end begin ; точк вход прогр ммы |