С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
29AHexNumber
0 / 0 / 0
Регистрация: 06.12.2009
Сообщений: 15
1

Вывод на экран системного времени прерыванием 4Ah прерывания

16.05.2011, 20:17. Просмотров 1369. Ответов 0
Метки нет (Все метки)

Разработать резидентную программу, выводящую на экран монитора (правый верхний угол) текущее время из КМОП – часов с интервалом в 1 сек. Каждый вывод времени вызывается активизацией прикладного обработчика от будильника new_4Ah. Вывод производится способом прямой записи в видеопамять.

Реализовал так:


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
Ideal
Model small
P386N
 
Codeseg
 
Org 100h
 
proc resident 
    jmp init
;данные резидентной части программы и место для перехватываемых
;векторов
 
clock   DB  2 DUP(20h,1Fh),":",1Fh  ;1Fh- белый по синему
    DB  2 DUP(20h,1Fh),":",1Fh,2 DUP(20h,1Fh)
clock_len   =   $-clock
locate  DW      160 ;Позиция точки вывода на экране
old_4Ah dd  0   ;ячейка для хранения системного вектора
mark    dw  4E11h   ;сигнатура программа
            
proc new_4Ah
; new_4Ah – собственно прикладной обработчик, который заменяет старый.
    
    pusha
    push ds
    push es
 
 
 
    mov ah, 02h
    int 1Ah
    push cx         ;сохраним время в стеке
    push dx
 
    mov al, ch          ;берем часы
    call convert        ;преобразуем в ASCII 
    mov [cs:clock], ah  ;пишем старшую цифру
    mov [cs:clock+2], al    ;и младшую
 
    mov al, cl      ;аналогично с минутами
    call convert
    mov [cs:clock+6], ah
    mov [cs:clock+8], al
 
    mov al, dh      ;И секундами
    call convert
    mov [cs:clock+12], ah
    mov [cs:clock+14], al
 
    ;вывод на экран
    mov cx, clock_len
    mov ax, 0B800h
    mov es,ax
    mov di, [cs:locate]
    mov si, offset clock
    cld
    rep movsb
    
 
 
 
end_:
 
    mov ah, 07h
    int 1Ah
    pop dx
    pop cx
    call AddSec
    mov ah, 06h
    int 1Ah
    pop es
    pop ds
    popa
    iret
 
endp new_4Ah
 
PROC convert    ;перевод из BCD-формата в ASCII 
 
        mov ah,al
        and al, 0Fh
        shr ah, 4
        or ax, 3030h
        ret
ENDP convert
 
PROC AddSec          ;процедура добавления 1ой секунды к времени
 
    mov al, dh
    call addtimepart
    mov dh, al
    jnc quit
 
    mov al, cl
    call addtimepart
    mov cl, al
    jnc quit
    
    mov al, ch
    call addtimepart
    mov ch, al
    
 
quit:
    ret
 
 
ENDP AddSec
 
 
PROC addtimepart    ;добавление единицы к секундам минутам или часам
 
    add al, 1
    daa
    cmp al, 60h
    jb done
 
    mov al, 0h
    stc
    jmp done1
 
done:   clc
done1:  ret
ENDP addtimepart
 
 
endp resident
 
proc init
 
 
    mov ax, 354Ah       ;получаем адресс старого обработчика
    int 21h                 
    mov ax, [word es:bx-2]  ;
    cmp ax, [cs:mark]       ;проверка на наличие в памяти уже одного резидента с помощью сигнатуры
    je installed        ;
;если сигнатура не обнаружена - продолжаем
    mov [word cs:old_4Ah], bx   
    mov [word cs:old_4Ah+2], es         
 
    mov ax, 254Ah       ;
    mov dx, offset new_4Ah  ;Установка своего вектора прерывания            
    int 21h         ;
    
 
        mov ah, 07h     ;отменяем старый будильник
        int 1Ah         ;
 
        mov ah, 02h     ;
        int 1Ah         ;получаем текущее время
 
        call AddSec     ;прибавляем секунду
 
        mov ah, 06h     ;заводим будильник
        int 1Ah         ;
 
    mov ah, 01h
    int 21h
            
 
        mov ah, 09h     ;
    mov dx, offset msg1 ;сообщение об установке резидента
    int 21h         ;
 
 
    mov es, [cs:2Ch] 
    mov ah, 49h
    int 21h
 
    lea dx, [init]      ; программа резидентна
    int 27h         ;
 
;резидент запущен второй раз: проверяем на наличие команды "-q"
;если команды нету - сообщаем о том, что резидент уже загружен
installed:
    cmp [word cs:82h], 'q-' 
    je remove
    
    ;нет, это повторный запуск
    mov ah, 09h     ;оповещаем о том, что резидент уже загружен
    mov dx, offset msg2     
    int 21h
    jmp exit        ;выход
;выгрузка резидента
remove: push ds
 
    mov ah, 07h
    int 1Ah
    
    mov ax, 254Ah
    lds dx, [dword es:old_4Ah]
    int 21h         ;восстановление вектора
    pop ds
 
    mov ah, 49h     ;выгрузка резидента из памяти 
    int 21h                 
    
    mov ah, 09h     ;оповещаем пользователя о выгрузке резидента из памяти
    mov dx, offset msg3     
    int 21h
 
exit:
    mov ax, 4c00h
    int 21h
endp init
msg1    db      "Timer installed$"
msg2    db  "Timer already installed. Use -q to remove it from memory$"
msg3    db  "Quit$"
 
 
end resident

По мне так все правильно, ошибки не вижу, но прерывание 4Ah не вызывается, в чем может быть проблема?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2011, 20:17
Ответы с готовыми решениями:

Вывод системного времени на экран
Доброго временисуток! Помогите пожалуйста написать следующую программку: По...

Вывод системного времени на экран по нажатию F3
Здравствуйте, необходимо создать программу, которая при нажатии на клавишу F3...

Вывод системного времени большими цифрами
Здравствуйте! Столкнулся с проблемой - не знаю как вывести на экран значения...

Вывод времени на экран. Не могу разобраться?
Есть готовая работающая программа, но никак не могу разобраться, как она...

Вывод сообщения на экран через равные промежутки времени
Как реализовать резидентную программу на ассемблере, задача которой в...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2011, 20:17

Каким прерыванием можно вывести на экран большую букву в графическом режиме?
Помогите, пожалуйста... Программирую на Ассемблере, встроенном в Паскаль....

Сравнение системного времени с введенным
Надо написать программу в которую вводится временной диапазон и если время с...

Чтение системного времени и перевод его в последовательность ascii
Помогите плиз Нужно выполнить чтение системного времени через функцию 2ch и...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru