Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Lexa44
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 31
1

Нужно сделать чтобы сигнал сам выключался через 15 секунд

06.02.2014, 19:51. Просмотров 803. Ответов 4
Метки нет (Все метки)

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

Добавлено через 38 минут
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
.286
.model small
.stack  100h
.data
    TIME        db  '00:00:00',13,10,10,'$'
    msg1    db  'PROGRAMM < ALARM >',13,10,'ESC exit',13,10,'$'
    msg2    db  'PLEASE ENTER ALARM TIME :$'
    msg3    db  13,10,'WAIT$'
    count   db  0   ;счетчик введенных цифр
    pos     dw  0   ;позиция курсора
    TIMER   dw  0   ;переменная заданного времени
.code
org 100h
start:
    mov ax,@data
    mov ds,ax
 
    mov ax,3        ;очистить экран
    int 10h
    
    call    GETTIME ;вызвать процедуру взятия текущего времени
    
    lea dx,TIME
    mov ah,09h
    int 21h     ;вывести время на экран
    
    lea dx,msg1
    mov ah,09h
    int 21h     ;вывод сообщений
    
    lea dx,msg2
    mov ah,09h
    int 21h
    
    mov ah,01   ;
    mov cx,2000h    ;ch=столбец cl-строка
    int 10h     ;убрать курсор (что бы не мерцал)
    ;цикл вывода времени и ввода таймера
L1:
    mov ah,03
    int 10h     ;взять текущее положение курсора
    mov pos,dx  ;сохранить позицию курсора
    
    mov dx,0        ;строка и столбец =0
    mov ah,02
    int 10h     ;установить курсор на начало 
    
    call    GETTIME ;взять текущее время
    lea dx,TIME
    mov ah,09h
    int 21h     ;вывести время 
    
    mov dx,pos  ;dx=сохраненная позиция курсора
    mov ah,02
    int 10h     ;установить курсор на прежнюю позицию
 
    mov ah,06h
    mov dl,-1       ;= 0ffH запрос ввода со стандартного ввода
    int 21h     ;считать нажатую клавишу в al
    jz  L1
    cmp al,27   ;если esp 
    je  exit        ;на выход
    cmp count,4 ;сравнить счетчик ввода
    jae L1      ;если больше 4 то таймер введен
    inc count   ;счетчик +1
    mov dl,al       ;поместить в dl нажатый символ
    mov ah,02h  
    int 21h     ;вывести на экран символ
    
    mov ax,TIMER    ;поместить текущее значение таймера
    rol ax,4        ;сдвиг влево на 4 бита
    sub dl,'0'      ;преобразовать символ в цифру
    or  al,dl       ;добавить к al
    mov TIMER,ax    ;сохранить в переменную
    cmp count,2 ;сравнить счетчик с введеными 2 символами
    jne next        ;продолжить если не равно
    mov dl,':'      ;вывести разделитель
    mov ah,02h
    int 21h     ;вывод символа ':'
next:   
    cmp [count],4   
    je  setalarm    ;если введены 4 символа установить таймер
    jmp L1      ;иначе продолжать цикл ввода и вывода времени
setalarm:   
    lea dx,msg3 ;вывести wait
    mov ah,9
    int 21h
    ;замена вектора  прерывания 4Ah на процедуру ALARM
    push    ds              ;сохраняем сегмент данных
    mov ax,seg ALARM        ;AX=сегмент процедуры 
    mov ds,ax           ;поместить  в DS
    mov dx,offset ALARM ;берем смещение процедуры
    mov al,4Ah          ;номер изменяемого вектора
    mov ah,25h          ;функция изменения вектора
    int 21h             ;поменять вектор
    pop ds              ;восстанавитьсегмент данных
    
    ;установить сигнал часов
    ;В указанное время вызывается пользовательская программа 
    ;по вектору прерывания INT 4aH
    xor dx,dx           ;DH    = секунды в коде BCD
    mov cx,TIMER            ;CH,CL = часы,минуты в коде BCD
    mov ah,06h          
    int 1Ah             ;установить сигнал часов
    inc [count]         ;увеличить счетчик 
    jmp L1              ;перейти в начало цикла
    
    
exit:
    mov ax,4c00h            ;завершить программу
    int 21h
 
;взятие времени
GETTIME proc 
    mov ah,02h
    int 1Ah             ;взять время ch=часы cl=минуты в формате BCD
    push    cx              ;сохранить в стек
    lea si,TIME         ;адрес переменной
    mov cl,ch               ;в ch и сl часы
    and cx,0FF0h            ;преобразовать в неупакованное BCD 
    ror cl,4                ;сдвиг младшей цифры часа на 4 вправо
    add cx,'00'         ;преобразовать в ASCII символы
    mov word ptr [si],cx        ;записать в переменную
    
    pop cx              ;восстановить cx из стека
    mov ch,cl               ;в ch и сl минуты
    and cx,0FF0h
    ror cl,4
    add cx,'00'         ;преобразовать в ASCII
    mov word ptr [si+3],cx  ;сохранить на место минут в time
    
    mov dl,dh           ;в dh и dl секунды
    and dx,0FF0h
    ror dl,4
    add dx,'00'
    mov word ptr [si+6],dx  ;сохранить в time на место секунд
    ret
GETTIME endp
 
;сигнал
ALARM proc far              ;FAR-дальний вызов
    mov  cx,10000 
beep:
    in  al,61h          ;получим значение порта 61h в al
    or  al,3                ;инициализируем динамик и подаем ток в порт 61h
    out 61h,al
    mov dx,50000            ;внутренний цикл задержка
    dec dx              ;отнимать от dx
    jnz $-1             ;перейти на dec dx
    and al,0FCh         ;выключить динамик
    out 61h,al          ;в порт 61h
    loop    beep
    iret            ;возврат из аппаратного прерывания
ALARM endp
 
end start
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 19:51
Ответы с готовыми решениями:

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

Как сделать, чтоб при отключении электроэнергии в сети и переводе энергии на аккумулятор, сервер сам выключался не аварийно
Сервер windows 2008 r2 подключен к ИБП как сделать, чтоб при отключении электроэнергии в сети и...

Как сделать чтобы кнопка появлялась через 10 секунд?
Я пишу сайт, и мне надо чтобы при открытии сайта через несколько секунд выскакивала кнопка(это...

Нужно сделать перенаправление страницы через n секунд
Как перенаправить на другую страницу я знаю(header(refresh)), но в данной задаче нужно показывать в...

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

4
Мотороллер
433 / 244 / 43
Регистрация: 05.08.2013
Сообщений: 1,666
Завершенные тесты: 1
07.02.2014, 10:05 2
чужой код как темный лес. для отсчета 15ти секунд нужно поставить прерывание на вектор 1Ch и там отлавливать кол-во тиков
Assembler
1
2
3
4
5
6
7
8
9
int_1C:
inc count
cmp count, 18.2*15
jae stop
iret
stop:
;bla bla bla
iret
count dw 0
0
Mikl___
Автор FAQ
14539 / 6685 / 701
Регистрация: 11.11.2010
Сообщений: 12,018
07.02.2014, 19:37 3
Lexa44,
  1. можно использовать функцию 6 прерывания 1Ah и установить "будильник" на 15 секунд и запрограммировать вектор 4Ah прерывания на "mov al,0FCh/out 61h,al/iret" - отключение динамика
  2. можно через прерывание 1Аh получить текущее время, а затем по этому же прерыванию сверяясь с часами реального времени выждать 15 секунд и отключить динамик
  3. можно читать время CMOS из ячейки 0:[46Сh] или через порт 70h
  4. зная частоту компьютера вычислить задержку через команду RDTSC
0
Lexa44
0 / 0 / 0
Регистрация: 23.12.2013
Сообщений: 31
07.02.2014, 19:55  [ТС] 4
Как все сложно(
0
AFP
649 / 336 / 37
Регистрация: 04.04.2012
Сообщений: 887
07.02.2014, 19:58 5
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Получился СОМ – файл. Ваша программа у меня не работала.
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
;DOS, TASM, COM-файл
;
;Компиляция СОМ-файла:
;tasm.exe /m filename.asm
;tlink.exe /t /x filename.obj
;Выход: filename.com
;
.model tiny
.code
.386
ORG 100h
START:
;часы будут выводиться в видеопамять
;ES на буфер в видеопамяти
    push 0B800h
    pop es
 
    mov ax,3        ;очистить экран
    int 10h
    
    call GETTIME    ;вызвать процедуру взятия текущего времени
    
    lea dx,TIME
    mov ah,09h
    int 21h     ;вывести время на экран
    
    lea dx,msg1
    mov ah,09h
    int 21h     ;вывод сообщений
    
    lea dx,msg2
    mov ah,09h
    int 21h
    
    mov ah,01
    mov cx,2000h    ;ch=столбец cl-строка
    int 10h     ;убрать курсор (что бы не мерцал)
 
;получить с клавиатуры вребя будильника
L2:
    mov ah,06h
    mov dl,-1       ;= 0ffH запрос ввода со стандартного ввода
    int 21h     ;считать нажатую клавишу в al
    jz short L2
    cmp al,27       ;если esp 
    je short exit   ;на выход
    cmp [count],4   ;сравнить счетчик ввода
    jae short L2    ;если больше 4 то таймер введен
    inc [count]     ;счетчик +1
    mov dl,al       ;поместить в dl нажатый символ
    mov ah,02h
    int 21h     ;вывести на экран символ
    
    mov ax,[TIMER]  ;поместить текущее значение таймера
    rol ax,4        ;сдвиг влево на 4 бита
    sub dl,'0'      ;преобразовать символ в цифру
    or  al,dl       ;добавить к al
    mov [TIMER],ax  ;сохранить в переменную
    cmp [count],2   ;сравнить счетчик с введеными 2 символами
    jne short next  ;продолжить если не равно
    mov dl,':'      ;вывести разделитель
    mov ah,02h
    int 21h     ;вывод символа ':'
next:   
    cmp [count],4   
    je  short setalarm  ;если введены 4 символа установить таймер
    jmp short L2    ;иначе продолжать цикл ввода и вывода времени
setalarm:   
    lea dx,msg3     ;вывести wait
    mov ah,9
    int 21h
    ;замена вектора  прерывания 4Ah на процедуру ALARM
    mov dx,offset ALARM ;берем смещение процедуры
    mov al,4Ah      ;номер изменяемого вектора
    mov ah,25h      ;функция изменения вектора
    int 21h     ;поменять вектор
 
    ;установить сигнал часов
    ;В указанное время вызывается пользовательская программа 
    ;по вектору прерывания INT 4aH
    xor dx,dx       ;DH    = секунды в коде BCD
    mov cx,[TIMER]  ;CH,CL = часы,минуты в коде BCD
    mov ah,06h          
    int 1Ah     ;установить сигнал часов
 
L1:
    call GETTIME    ;взять текущее время и вывести его на экран
 
;проверка нажатой клавиши
    mov ah,06h
    mov dl,-1       ;= 0ffH запрос ввода со стандартного ввода
    int 21h     ;считать нажатую клавишу в al
    jz short L1
    cmp al,27       ;если esp 
    je short exit   ;на выход
 
    jmp short L1    ;перейти в начало цикла
 
exit:
    mov ah,7    ;отключить будильник
    int 1Ah
 
    ret     ;выход из программы
 
;взятие времени
GETTIME proc
push si         ;сохранить адрес строки времени для вывода
    mov ah,02h
    int 1Ah     ;взять время ch=часы cl=минуты в формате BCD
    push cx     ;сохранить в стек
    lea si,TIME     ;адрес переменной
    mov cl,ch       ;в ch и сl часы
    and cx,0FF0h    ;преобразовать в неупакованное BCD 
    ror cl,4        ;сдвиг младшей цифры часа на 4 вправо
    add cx,'00'     ;преобразовать в ASCII символы
    mov word ptr [si],cx;записать в переменную
    
    pop cx      ;восстановить cx из стека
    mov ch,cl       ;в ch и сl минуты
    and cx,0FF0h
    ror cl,4
    add cx,'00'     ;преобразовать в ASCII
    mov word ptr [si+3],cx;сохранить на место минут в time
    
    mov dl,dh       ;в dh и dl секунды
    and dx,0FF0h
    ror dl,4
    add dx,'00'
    mov word ptr [si+6],dx;сохранить в time на место секунд
pop si
;Вывод времени на экран
    lea si,TIME ;строка
    mov di,0    ;позиция на экране
    mov ah,7    ;цвет символа и фона
m1:
    lodsb       ;прочитать символ из строки
    cmp al,13
    jz short m2
    stosw       ;записать символ и цвет на экран
    jmp short m1
m2:
    ret
GETTIME endp
 
;сигнал
ALARM proc
pusha
     cli
     mov al,10110110b
     mov dx,43h
     out dx,al
     mov ax,8E8h;10CFh;96Fh   ;нота Си-493,88Гц
     dec dx
     out dx,al
     mov al,ah
     out dx,al     
     add dx,1Fh
     in al,dx       ;включить динамик
     or  al,11b
     out dx,al
     sti
;-----------------------
push dx
    mov ah,0
    int 1Ah
    add dx,18*15 ;18*3 задержка примерно на 3 секунды
    adc cx,0
    mov di,dx
    mov si,cx
DELAY:
    int 1Ah
    cmp cx,si
    ja  short EndDELAY
    cmp dx,di
    jb  short DELAY
EndDELAY:
pop dx
;---------------------------
     cli     
     in al,dx       ;выключить динамик
     and al,11111100b
     out dx,al
     sti
popa
    iret        ;возврат из аппаратного прерывания
ALARM endp
 
;-----------------------------------------------------------------
    TIME        db  '00:00:00',13,10,10,'$'
    msg1    db  'PROGRAMM < ALARM >',13,10,'ESC - exit',13,10,'$'
    msg2    db  'PLEASE ENTER ALARM TIME: $'
    msg3    db  13,10,'WAIT$'
    count   db  0   ;счетчик введенных цифр
    TIMER   dw  0   ;переменная заданного времени
;-------------------------------------------------------------------
 
    end start
0
07.02.2014, 19:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 19:58

Как сделать, чтобы картинка и надпись поменялись через 50 секунд
сразу хочу сказать, что using System.Threading; мне не нужен а нужно чтобы появилась картинка и...

Нужно, чтобы он запускал видео на ютубе и через 18 секунд проводить смену ip любым способом
Помогите со скриптом: нужно, чтобы он запускал видео на ютубе и через 18 секунд проводить смену ip...

Как сделать так, чтобы компьютер выключался каждое воскресенье?
Задача: чтобы каждое воскресенье компьютер выключался. И так каждое воскресенье. Каждое....


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

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

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