Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Sanna

Обработчик прерываний от таймера. В чем ошибка кода?

26.12.2008, 08:00. Показов 2271. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Assembler
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               ; точк  вход  прогр ммы
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2008, 08:00
Ответы с готовыми решениями:

Обработчик прерываний таймера
Нужна помощь в написании проги на паскале в пределах операционной среды MS DOS разработать обработчик прерываний таймера,который...

Обработчик прерываний таймера
Нужно сделать обработчик прерываний таймера, который после установки каждые 10 секунд будет подавать звуковой сигнал и заставлять моргать...

Разработать обработчик прерываний таймера
разработать обработчик прерываний таймера,который после своей установки каждую секунду меняет показания цифровых часов, изображенного на...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.12.2008, 08:00
Помогаю со студенческими работами здесь

Обработчик прерываний от таймера (int 1Ch)
Привет всем! Помогите вспомнить, товарищ попросил помочь, уже позабыл, у меня есть обработчик прерывания 1Ch , можно в нем вызвать...

Программирование микроконтроллера - обработчик прерываний от таймера
Программирование на языке Си обработчика прерываний от таймера

Обработка прерываний таймера - выдавать звуковой сигнал каждую секунду
Пытаюсь написать программу, которая перехватывает прерывание таймера и выдает звуковой сигнал каждую секунду, но получаю ошибку...

Обработчик прерываний
Необходимо сделать так, чтобы каждое второе нажатие игнорировалось. Почему то этого не происходит. Помогите кто может, очень срочно надо ...

Перехватить прерывание ah=09h int 21h - изменить регистр символов
Задача: Перекрыть девятую функцию прерывания 21h таким образом, чтобы в выводимой строке маленькие буквы заменялись большими, а большие на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru