Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
1

Вывод текста через каждые 10 секунд или по нажатию

06.04.2016, 09:03. Показов 2624. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте ребята!

Помогите советом, как осуществить такую штуку

"вывод текста через каждые 10 секунд или по нажатию",

повиснуть на int 1Ch и 09h, только как быть с временем, переменную взять или что?

код не нужен, сам напишу, посоветуйте.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2016, 09:03
Ответы с готовыми решениями:

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

Резидентная программа: вывод строки символов на экран каждые 45 секунд
Доброго времени суток. Дано задание, написать резидентную программу,которая вывод строку символов...

Изменение стиля текста в document.write через 10 секунд после загрузки сайта и изменяет цвет текста каждые 10 секунд
<style type="text/css"> .st1 { color: green; * * font: 20pt Arial; * * text-align: center; }...

Всплывающее окно через 30 секунд после загрузки страницы и затем каждые 30 секунд
Задача Нужно реализовать всплывающее окно через 30 секунд после загрузки страницы, показать его...

12
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,701
06.04.2016, 09:36 2
tahir_,
опрос таймера int 1Ah или int 15h
Assembler
1
2
3
4
5
6
7
8
9
10
;---получение значения счетчика и установка задержки
            MOV   AH,0   ;номер функции для "чтения"
            INT   1AH    ;получаем значение счетчика
            ADD   DX,91  ;добавляем 5 сек. к младшему слову 18,2*5=91
            MOV   BX,DX  ;запоминаем требуемое значение в BX
;---постоянная проверка значения счетчика времени суток BIOS
REPEAT:     INT   1AH    ;получаем значение счетчика
            CMP   DX,BX  ;сравниваем с искомым
            JNE   REPEAT ;если неравен, то повторяем снова
                         ;иначе, задержка окончена
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,933
06.04.2016, 09:37 3
В задании же не указано, что программа должна быть TSR. Если Все-таки TSR, то, да, повиснуть на прерываниях. Я бы сделал два счетчика, один на 182 тика (10 секунд) cnt1, второй - на 18 тиков (1 сек) cnt2. Изначально cnt1=182, cnt2=0. При входе в 1С проверять, cnt2=0? если нет, вывести сообщение, уменьшить на 1. Если да, стереть сообщение.
cnt1=cnt1-1 при каждом тике. Если cnt1 стал равен 0, вновь занести 182, и cnt2=18.
При нажатии клавиши сделать cnt2=18

В принципе, можно будет оптимизировать, чтобы каждый тик не выводить/стирать, но я бы это делал, когда основной каркас программы уже готов.
1
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
06.04.2016, 10:53  [ТС] 4
Mikl___, alexcoder, спасибо,
а можно из обработчика вызвать прерывание DOS int 21h ?
0
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,701
06.04.2016, 10:55 5
tahir_,
нет, нельзя. А чем тебя пример с задержкой не устраивает?
0
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
06.04.2016, 11:01  [ТС] 6
Mikl___, можно и так,
а обработчик от клавиатуры куда тогда - увеличиваем какую нибудъ переменную в обработчике, выходим из обработчика, и в том цикле который ты привел сделать проверку переменной и дальше разветвление по коду?
0
3406 / 1825 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
06.04.2016, 11:17 7
Цитата Сообщение от tahir_ Посмотреть сообщение
а можно из обработчика вызвать прерывание DOS int 21h
Его нельзя INT'ом вызывать, только CALL FAR'ом.
1
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,701
06.04.2016, 11:36 8
Лучший ответ Сообщение было отмечено tahir_ как решение

Решение

tahir_,
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
            MOV   AH,0   
            INT   1Ah   
            ADD   DX,182
            MOV   Timer,DX
REPEAT: mov ah,1
            int 16h
            jnz exit
            MOV   AH,0
            int   1Ah    ;получаем значение счетчика
            CMP   DX,Timer  ;сравниваем с искомым
            JNE   REPEAT
exit:
1
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
06.04.2016, 13:30  [ТС] 9
Спасибо парни, разобрался.
0
50 / 49 / 10
Регистрация: 24.01.2010
Сообщений: 225
06.04.2016, 17:44 10
всё можно, если знаешь как...

для начала - опиши те проблемы которые прейдут если позовёшь досовское прерывание.
далее ещё проще - решить их и вся не долга.

(круглый)
0
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
07.04.2016, 13:45  [ТС] 11
есть такой вопрос , после примера Mikl___, добавил обработку по клавишам, но не всегда работает с первого раза нажатие клавиш, т.е. иногда по два раза нажимать надо,
пробывал добавить очистку буфера
Assembler
1
2
3
4
5
6
7
8
9
10
klava proc
 mov ah,1
 int 16h
 jz klava_exit
 mov ah,0
 int 16h
 jmp klava
klava_exit:
 ret
endp
не помогает, и так
Assembler
1
2
3
4
5
6
7
8
 cli
 xor ax,ax
 mov es,ax
 mov al,byte ptr es:[41ah]
 mov byte ptr es:[41ch],al
 push ds
 pop es
 sti
0
Ушел с форума
Автор FAQ
16338 / 7659 / 1075
Регистрация: 11.11.2010
Сообщений: 13,701
07.04.2016, 15:09 12
tahir_,
для чего jz klava_exit если у меня jnz exit ? И после mov ah,0/int 16h твоя программа на задержку в 10 секунд реагировать не будет, а будет тупо ожидать нажатия на клавиатуру
2
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
07.04.2016, 21:32  [ТС] 13
Mikl___, ой , эт я в заблуждение ввел, вот целиковый код проги,
этот кода работает, только иногда клавиши ни с первого раза,
нужно ли очищать буфер клавиатуры после mov ah,01h int 16h ???

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
model small
 stack 100h
 
dataseg
  algoritm dd 0       ;рандом число
       min dd 1         ;минимальн. число для рандома
       max dd 5        ;максм.число для рандома
     timer dw 0         ;время 
codeseg
.386
start:
 mov ax,@data
 mov ds,ax
 mov es,ax
 
 mov ax,3
 int 10h
 
osnova:
 mov ah,0
 int 1ah
 add dx,182    ;18,2тик в секунду * 10 = 10 секунд
 mov [timer],dx  
 
repeat: 
 mov ah,01h
 int 16h
 
;если нажата была F1
 cmp ax,3b00h ;F1
 je f1
;если нажата была F2
 cmp ax,3c00h ;F2
 je f2
;если нажата была F3, выход в ДОС
 cmp ax,3d00h ;F3
 je exit 
 
 call klava
;читать часы (счетчик тиков),
 mov ah,0h
 int 1ah
 cmp dx,[timer]
 
;если прошло 10 секунд или более
 ja sec_10
;если  прошло менее 10 секунд
 jb repeat  ;на цикл
 
;прошло 10 секунд
sec_10:
;получим число рандом
  call random
;запишем число в квадрат 
call write_chislo
;приыгаем на основной цикл
 jmp osnova
 
;нажата была клава F1
f1:
 call klava
 inc [algoritm]       ;увеличиваем число
 call write_chislo  ;запишем число в квадрат 
 jmp osnova         ;приыгаем на основной цикл
 
;нажата была клава F2
f2:
; mov ax,0
; int 16h
 call klava
 call random
 call write_chislo
 jmp osnova
 
;нажата была клава F3, выход в дос
exit:
; mov ax,0
; int 16h
 call klava
 mov ax,4c00h
 int 21h
 
;procedure random
;получение рандом числа, взято в сети интернет
random proc
 push ecx edx ebx edi esi
 db 0Fh ;опкод команды rdtsc
 db 31h ;
 xchg esi,eax
 xchg edi,edx
 db 0Fh ;
 db 31h ;опкод команды rdtsc
 xor eax,edi
 xor edx,esi
 xor edx,edx
 mov ecx,[max]
 add ecx,1h
 sub ecx,[min]
 div ecx
 add edx,[min]
 mov eax,edx
 pop esi edi ebx edx ecx
 mov [algoritm],eax          ;рандомное число в квадрат
 ret
endp
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
пишем число
write_chislo proc
;проверим больше ли оно 5, если увеличивали клавишей F1, если больше то будет оно 1
 cmp [algoritm],5
 jbe write_chislo_1
 mov [algoritm],1
 
write_chislo_1: 
 mov eax,[algoritm]
 add eax,30h        ;чтоб символ был на экране прибавим 30h, смотрите таблицу ASCII
 
;запись в видеобуфер числа
 push 0B800h
 pop es
 mov bx,1680
 mov ah,7  
 mov word ptr es:[bx],ax
 push ds
 pop es
 ret              ;возврат
endp
 
;очистка буфера клавиатуры
klava proc
 mov ah,1
 int 16h
 jz klava_exit
 mov ah,0
 int 16h
 jmp klava
klava_exit:
 ret
endp
end start
Добавлено через 1 час 55 минут
сейчас помогло
Assembler
1
2
3
4
5
6
7
8
 cli
 xor ax,ax
 mov es,ax
 mov al,byte ptr es:[41ah]
 mov byte ptr es:[41ch],al
 push ds
 pop es
 sti
Добавлено через 3 часа 57 минут
все решил, вот окончательный вариант
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
;Модель small поддерживает один сегмент кода и один сегмент данных.
model small
 
;Стек - это структура данных, которая используется для временного,  хранения информации. в данном случаи он 256 байт.
 stack 100h
 
;начало сегмента данных
dataseg
  algoritm dd 0       ;рандом число
       min dd 1         ;минимальн. число для рандома
       max dd 5        ;максм.число для рандома
     timer dw 0         ;время 
 
     ;сегмент кода
codeseg
 
;директива что будем использовать инструкции 386 процессора 
.386
 
;метка начало кода
start:
; настройка сегментынх регистров на данные
 mov ax,@data
 mov ds,ax
 mov es,ax
 
;очишаем экран
 mov ax,3
 int 10h
 
;рисуем квадрат, прямой записью в видео буфер
 push 0B800h ;настройка сегмента на видеобуфер
 pop es             
 mov bx,1020  ;смещение в памяти, с которой начинаем рисовать
 mov cx,10      ;размер квадрата( вдоль столбца)
vid_2:
 push cx
 mov cx,20   ;размер квадрата( вдоль строки)
 mov al,219  ; символ для зарисовки
 mov ah,3     ;цвет символа
vid_1:
 mov word ptr es:[bx],ax ; помещаем ax в видеобуфер
 inc bx       ;смещение=смещение+1;
 inc bx
 loop vid_1     ;цикл пока CX>0,метка vid_1
 add bx,120   ;смещение в буфере для следующей строчки, рисуем квадрат
 pop cx            ;возвращаем cx
 loop vid_2     ;цикл пока CX>0,метка vid_2
 
 push ds  ;восстанавливаем регистр ds
 pop es
 
;начало основного цикла опроса нажатия клавиш и работа таймера  
osnova:
;читать часы (счетчик тиков),
;CX,DX = счетчик тиков с момента сброса. CX - старшая часть значения.
 mov ah,0
 int 1ah
 add dx,182    ;18,2тик в секунду * 10 = 10 секунд
 mov [timer],dx   ;переменная которая содержит время когда пройжет 10 секунд ожидания
 
;начало под-цикла опроса нажатия клавиш и работа задержки  
repeat: 
;Получить состояние клавиатуры
;AH - скан-код
;AL - ASCII код
 mov ax,0100h
 int 16h
 jz tik2 ;если не была нажата какая либо клавиша
 
;если нажата была F1
 cmp ax,3b00h ;F1
 je f1
;если нажата была F2
 cmp ax,3c00h ;F2
 je f2
;если нажата была F3, выход в ДОС
 cmp ax,3d00h ;F3
 je exit 
 
tik2:
;читать часы (счетчик тиков),
 mov ah,0h
 int 1ah
 cmp dx,[timer]
;если прошло 10 секунд или более
 ja sec_10
 
;если  прошло менее 10 секунд
 jb repeat  ;на цикл
 
;прошло 10 секунд
sec_10:
;получим число рандом
  call random
;запишем число в квадрат 
 call write_chislo
;приыгаем на основной цикл
 jmp osnova
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;нажата была клава F1
f1:
 call klava
 inc [algoritm]       ;увеличиваем число
 call write_chislo  ;запишем число в квадрат 
 jmp osnova         ;приыгаем на основной цикл
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;нажата была клава F2
f2:
 call klava
 call random
 call write_chislo
 jmp osnova
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;нажата была клава F3, выход в дос
exit:
 call klava
 mov ax,4c00h
 int 21h
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;procedure random
;получение рандом числа, взято в сети интернет
random proc
 push ecx edx ebx edi esi
 db 0Fh ;опкод команды rdtsc
 db 31h ;
 xchg esi,eax
 xchg edi,edx
 db 0Fh ;
 db 31h ;опкод команды rdtsc
 xor eax,edi
 xor edx,esi
 xor edx,edx
 mov ecx,[max]
 add ecx,1h
 sub ecx,[min]
 div ecx
 add edx,[min]
 mov eax,edx
 pop esi edi ebx edx ecx
 mov [algoritm],eax          ;рандомное число в квадрат
 ret
endp
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
пишем число внутрь квадрата
write_chislo proc
;проверим больше ли оно 5, если увеличивали клавишей F1, если больше то будет оно 1
 cmp [algoritm],5
 jbe write_chislo_1
 mov [algoritm],1
 
write_chislo_1: 
 mov eax,[algoritm]
 add eax,30h        ;чтоб символ был на экране прибавим 30h, смотрите таблицу ASCII
 
;запись в видеобуфер числа
 push 0B800h
 pop es
 mov bx,1680
 mov ah,7    ;;fon
 mov word ptr es:[bx],ax
 push ds
 pop es
 ret              ;возврат
endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;очистка буфера клавиатуры
klava proc
 cli ;запрещаем прерывания
 xor ax,ax 
 mov es,ax
 mov al,byte ptr es:[41ah] делаем чтоб указатель на конец буфера указывал на начало буфера
 mov byte ptr es:[41ch],al
 push ds
 pop es
 sti ;разрешаем прерывания
 ret
endp
 
end start
0
07.04.2016, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2016, 21:32
Помогаю со студенческими работами здесь

Автосохранение текста из мемо каждые 25 секунд
Доброго времени суток! Вопрос следующий, я открываю через блокнотик файл, подскажите , пожалуйста,...

Вывод каждые 10 секунд
Есть база данных которая постоянно пополняется как сделать вывод каждые 10 секунд Вот функции...

Реализовать отправку текста сервером клиенту каждые 5 секунд
Помогите пожалуйста, может у кого есть наброски Необходимо реализовать форменное приложение на c#,...

Сообщение через каждые 30 секунд
Ребят, помогите, пожалуйста, как сделать в программе, чтобы через каждые 30 секунд выдавался вопрос...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru