Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 08.03.2016
Сообщений: 9
TASM

Обработка прерываний таймера - выдавать звуковой сигнал каждую секунду

17.12.2016, 23:32. Показов 7282. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь написать программу, которая перехватывает прерывание таймера и выдает звуковой сигнал каждую секунду, но получаю ошибку "temp.exe is not recognized as internal or external command" и не знаю, что не так с программой
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
Макроопределение задержки;
dely    macro time              ;(1)
        local zd,c1,cikl,ii,ii1 ;(2) описываем все метки, используемые в макроопределении
        push cx                 ;(3) помещаем в стек используемые в макроопределении 
        push bx                 ;(4) регистры
        push bp                 ;(5)
        push ax                 ;(6)
        push dx                 ;(7)
        mov cx,time             ;(8) задаём количество повторений цикла задержки zd – 
zd:     push cx                 ;(9) задержка в цикле 18.2 секунды
        mov bp,0                ;(10)
        mov bx,1                ;(11)
cikl:   
        inc BP                  ;(12)
        mov ah,00h              ;(13)       
        int 1Ah                 ;(14)
        cmp BP,1                ;(15)
        je ii                   ;(16) переходим на метку ii на первой итерации цикла
        jmp ii1                 ;(17) на следующих итерациях переходим на метку ii1
ii:     add bx,dx               ;(18) формируем значение на единицу больше, чем в 
ii1:                            ;(19) регистре dx
        cmp bx,dx               ;(20) если значение в регистре dx изменилось(сравниваем 
        jne cikl                ;(21) значение в dx с сформированным в строке 18 
        pop cx                  ;(22) значением в регистре bx, которое на единицу больше, 
        loop zd                 ;(23)на единицу больше значение в dx станет через 18.2 сек)
        pop cx                  ;(24) если нет, то новая итерация циклаесли да, конец 
        pop bx                  ;(25) макрокоманды задержки
        pop bp                  ;(26)
        pop ax                  ;(27)
        pop dx                  ;(28)
        endm                    ;(29)
Text      segment 'code'                    
      assume CS:text,DS:data
                                
Sound1   proc                  
                int 1Ah
                in al, 61h
                or al, 10000011b
                out 61h, al
                and al, 01111111b
                out 61h,al
                
                mov al, 10100110b
                out 40h,al
                ;mov al,22
                ;out 42h, al
               
                push es
                mov ax, 040h
                mov es,ax
                mov al,es:[017h]                                
                xor al, 64
                mov es:[017h],al
                mov al,es:[018h]
                or al, 64
                mov es:[018h], al
                
                pop es
                
               mov al, 20h
                out 20h,al                
          ret                   
Sound1   endp                  
                                
Zadergka   proc                 
                mov bp,1        
mig:                            
                call sound1   
                dely 18               
                inc bp          
                cmp bp,3        
                je  changS  
                mov ah,06h      
                mov dl,0ffh     
                int 21h          
                cmp al,44h      
                jne mig         
                jmp ex                 
changS:      
                mov bp,1        
                jmp mig         
ex:                             
          ret                   
Zadergka   endp                    
                                
Main            proc                        
                mov AX,data                 
            mov DS,AX                     
            int 21h           
main            endp            
text            ends            
 
stk             segment stack 'stack'
                dw 128 dup (0)  
stk             ends            
        end main
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2016, 23:32
Ответы с готовыми решениями:

Сделать так, чтобы каждую секунду в TextBox попадало значение таймера
Помагите реализовать такой код! Запущен таймер! Я хочу чтобы каждую секунду в TextBox попадала значение таймера!

Перевод процессора в защищённый режим и обработка прерываний от таймера
Всем доброго времени суток. Дали лабу: Перевести процессор в защищённый режим и обработать прерывания от таймера. С переводом вроде как...

При помощи таймера каждую секунду число a увеличивать, пока оно не станет равным числу b
Здравствуйте, помогите реализовать метод для таймера. С формы считываются 2 целочисленных числа, число а и число b (a<b). Нужно, что...

7
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
18.12.2016, 00:23
Вы полный код привели? У меня компилятор выдаёт другое сообщение об ошибке - символ data не определён, нет сегмента данных.
0
0 / 0 / 0
Регистрация: 08.03.2016
Сообщений: 9
18.12.2016, 00:50  [ТС]
Полный, data забыл убрать с кода, который переделывал, поэтому видно выводил ошибку, сейчас просит только нажать клавишу для продолжения, а звукового сигнала нет
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
dely    macro time              
        local zd,c1,cikl,ii,ii1 
        push cx                 
        push bx                 
        push bp                                
        push dx                 
        mov cx,time             
zd:     push cx                 
        mov bp,0                
        mov bx,1                
cikl:   
        inc BP                  
        mov ah,00h                     
        int 1Ah                 
        cmp BP,1                
        je ii                   
        jmp ii1                 
ii:     add bx,dx                
ii1:                            
        cmp bx,dx                
        jne cikl                 
        pop cx                   
        loop zd                 
        pop cx                   
        pop bx                  
        pop bp                                    
        pop dx                  
        endm                    
Text      segment 'code'                    
      assume CS:text
                                
Sound1   proc                  
                int 1Ah
                in al, 61h
                or al, 10000011b
                out 61h, al
                and al, 01111111b
                out 61h,al
                
                mov al, 10100110b
                out 40h,al
                ;mov al,22
                ;out 42h, al
               
                push es
                mov ax, 040h
                mov es,ax
                mov al,es:[017h]                                
                xor al, 64
                mov es:[017h],al
                mov al,es:[018h]
                or al, 64
                mov es:[018h], al
                
                pop es
                
               mov al, 20h
                out 20h,al                
          ret                   
Sound1   endp                  
                                
Zadergka   proc                 
                mov bp,1        
mig:                            
                call sound1   
                dely 18               
                inc bp          
                cmp bp,3        
                je  changS  
                mov ah,06h      
                mov dl,0ffh     
                int 21h          
                cmp al,44h      
                jne mig         
                jmp ex                 
changS:      
                mov bp,1        
                jmp mig         
ex:                             
          ret                   
Zadergka   endp                    
                                
Main            proc                                           
            int 21h           
main            endp            
text            ends            
          
 
stk             segment stack 'stack'
                dw 128 dup (0)  
stk             ends            
        end main
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
18.12.2016, 01:03
Так у вас программа состоит из строк 83-85.
0
0 / 0 / 0
Регистрация: 08.03.2016
Сообщений: 9
18.12.2016, 01:47  [ТС]
Исправил, начало запускаться и заканчивать работу при нажатии f10, но звук не идет
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
dely    macro time              
        local zd,c1,cikl,ii,ii1 
        push cx   
        push es              
        push bx                 
        push bp                                
        push dx                 
        mov cx,time             
zd:     push cx                 
        mov bp,0                
        mov bx,1                
cikl:   
        inc BP                  
        mov ah,00h                     
        int 1Ah                 
        cmp BP,1                
        je ii                   
        jmp ii1                 
ii:     add bx,dx                
ii1:                            
        cmp bx,dx                
        jne cikl                 
        pop cx                   
        loop zd                 
        pop cx 
        pop es                  
        pop bx                  
        pop bp                                    
        pop dx                  
        endm                    
Text      segment 'code'                    
      assume CS:text,DS:data
                                
Sound1   proc                  
                int 1Ah
                in al, 61h
                or al, 10000011b
                out 61h, al
                and al, 01111111b
                out 61h,al
                
                mov al, 10100110b
                out 40h,al
                ;mov al,22
                ;out 42h, al
               
                push es
                mov ax, 040h
                mov es,ax
                mov al,es:[017h]                                
                xor al, 64
                mov es:[017h],al
                mov al,es:[018h]
                or al, 64
                mov es:[018h], al
                
                pop es
                
               mov al, 20h
                out 20h,al                
          ret                 
Sound1   endp                  
                                
Zadergka   proc                 
                mov bp,1        
mig:                            
                call Sound1   
                dely 18               
                inc bp          
                cmp bp,1        
                je  changS  
                mov ah,06h      
                mov dl,0ffh     
                int 21h          
                cmp al,44h      
                jne mig         
                jmp ex                 
changS:      
                mov bp,1        
                jmp mig         
ex:                             
          ret                   
Zadergka   endp                    
                                
Main            proc   
                ; int 21h
                 call Zadergka           
 
                                 
    mov ax,4C00h    
    int 21h         
main            endp            
text            ends            
  data            segment         
data            ends            
        
 
stk             segment stack 'stack'
                dw 128 dup (0)  
stk             ends            
        end main
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
18.12.2016, 19:02
Смотрите. Поискав по форуму и книгам, нашёл и протестировал код
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
;Эта процедура заставляет динамик ПЭВМ издать тон заданной
;частоты и заданной длительности
;Перед вызовом загрузите частоту в регистр DI (от 21 до 65535 Гц),
;а длительность (в сотых долях секунды) - в регистр BX (от 0 до 65535).
;Значения всех регистров сохраняются.
;Источник:
;Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера.
;на странице 237-238.
SOUND_Sc PROC
    PUSH    AX      ; сохранение регистров
    PUSH    BX
    PUSH    CX
    PUSH    DX
    PUSH    DI
    MOV     AL, 0B6H    ; Задание режима таймера
    OUT     43H,    AL
    MOV DX, 14H ; Делитель времени =
    MOV     AX, 4F38H   ; 1331000/часота
    DIV     DI
    OUT     42H,    AL  ; Записать младший байт счетчика таймера 2
    MOV     AL, AH
    OUT     42H,    AL  ; Записать старший байт счетчика таймера 2
    IN      AL, 61H ; Считать текущую установку порта B
    MOV     AH, AL  ;  и сохранить её в регистре AH
    OR      AL, 3   ; Включить динамик
    OUT     61H,    AL
@@Wait:
    MOV     CX, 2801
@@SPKR_ON:
    LOOP    @@SPKR_ON   ; Выждать 10 мс
    DEC     BX      ; Счетчик длительности исчерпан
    JNZ     @@Wait      ;  Нет. Продолжение звучания
    MOV     AL, AH  ;  Да. Восстановить исходную установку порта.
    OUT     61H,    AL
    POP DI      ; восстановление регистров
    POP DX
    POP     CX
    POP     BX
    POP     AX
    RET             ; И выйти из процедуры
SOUND_Sc   ENDP
У меня Win7x64, программы для DOS запускаю через DOSBox. В настройках DOSBox стоит перенаправление системного динамика на звуковую карту в хост-машине.
Этот код из книги - работает, издаёт звук (на входе di=500, bx=500) ~1секунду (для моего компа).

Как я понимаю, у вас проблема в том, что нет звука. Попробуйте добиться получения звука на колонки звуковой карты.
Проверьте мой код. А потом можно двигаться дальше.
Вот проверочный код
Кликните здесь для просмотра всего текста
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
.model small
.stack 100h
 
.code
 
;Эта процедура заставляет динамик ПЭВМ издать тон заданной
;частоты и заданной длительности
;Перед вызовом загрузите частоту в регистр DI (от 21 до 65535 Гц),
;а длительность (в сотых долях секунды) - в регистр BX (от 0 до 65535).
;Значения всех регистров сохраняются.
;Источник:
;Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера.
;на странице 237-238.
SOUND   PROC
        PUSH    AX              ; сохранение регистров
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    DI
        MOV     AL,     0B6H    ; Задание режима таймера
        OUT     43H,    AL
        MOV     DX,     14H     ; Делитель времени =
        MOV     AX,     4F38H   ; 1331000/часота
        DIV     DI
        OUT     42H,    AL      ; Записать младший байт счетчика таймера 2
        MOV     AL,     AH
        OUT     42H,    AL      ; Записать старший байт счетчика таймера 2
        IN      AL,     61H     ; Считать текущую установку порта B
        MOV     AH,     AL      ;  и сохранить её в регистре AH
        OR      AL,     3       ; Включить динамик
        OUT     61H,    AL
@@Wait:
        MOV     CX,     2801
@@SPKR_ON:
        LOOP    @@SPKR_ON       ; Выждать 10 мс
        DEC     BX              ; Счетчик длительности исчерпан
        JNZ     @@Wait          ;  Нет. Продолжение звучания
        MOV     AL,     AH      ;  Да. Восстановить исходную установку порта.
        OUT     61H,    AL
        POP     DI              ; восстановление регистров
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        RET                     ; И выйти из процедуры
SOUND   ENDP
 
main    proc
 
;        mov     ax,     @data
;        mov     ds,     ax
 
        mov     di,     500
        mov     bx,     500
        call    Sound
 
 
        mov     ax,     4c00h
        int     21h
 
main    endp
 
end     main


После появления звука, нужно будет изменить подпрограмму, чтобы длительность звучания не зависела от скорости процессора, а опиралась на таймер.
0
0 / 0 / 0
Регистрация: 08.03.2016
Сообщений: 9
18.12.2016, 21:23  [ТС]
Не получилось, выводит просьбу нажать клавишу для продолжения и никакого звука. Делаю на ноуте, win XP, как я понял порты 42h, 43h, 61h на нем отсутствуют, можно как-нибудь их заменить?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8644 / 4479 / 1669
Регистрация: 01.02.2015
Сообщений: 13,883
Записей в блоге: 11
18.12.2016, 21:38
Эти порты эмулируются. Они не обязательно должны присутствовать.
В dosbox.conf у меня есть строки
[speaker]
# pcspeaker: Enable PC-Speaker emulation.
# pcrate: Sample rate of the PC-Speaker sound generation.
# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.
# Possible values: auto, on, off.
# tandyrate: Sample rate of the Tandy 3-Voice generation.
# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).

pcspeaker=true
pcrate=44100
tandy=auto
tandyrate=44100
disney=true
Добавлено через 1 минуту
Запускайте через DOSBox.

Добавлено через 2 минуты
Эти порты не могут отсутствовать, т.к. звук - побочное явление для таймера ви53. Основное - тактирование устройств.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2016, 21:38
Помогаю со студенческими работами здесь

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

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

Обработчик аппаратных прерываний от таймера
Дали задание: Создать программу обработчика аппаратных прерываний от таймера. В обработчике предусмотреть чтения состояния регистра...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru