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

Резидент обработки прерывания int 31h - формирование звукового сигнала заданной длительности и частоты

05.01.2011, 01:54. Показов 538. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать две программы вот их условия:
2. Составить резидентную программу обработки прерывания при подаче звукового сигнала. Вызов резидентной программы осуществить из фоновой программы с помощью программного прерывания int 31h. Установку программы в резиденте осуществить функцией 31h MS-DOS. Частоту и длительность звучания с клавиатуры, <Left Shift> - прекращение работы TSR-программы.

Кто может что посоветовать, может литературу, похожие программы, очень нужно сделать, скоро сессия!!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2011, 01:54
Ответы с готовыми решениями:

Резидент: Вывод таблицы векторов прерывания не используя int 21H
Нужно вывести на экран Ms DOs таблицу векторов прерывания НЕ используя int 21H! так что я предполагаю через int 10H.. уже неделю с этим...

Считывание частоты звукового сигнала
Думаю все знают, что с помощью Beep() можно воспроизводить звуковой сигнал из заданною частотою. Стоит обратная задача, можно ли как-то...

Вывод на динамик звукового сигнала с дискретным периодическим изменением частоты
Написать программу вывода на динамик звукового сигнала с дискретным периодическим изменением частоты

1
 Аватар для BiSoN2008
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 15
07.04.2011, 15:55  [ТС]
вот решение мое задачи может кому пригодится

Вот решение:
Первый сегмент кода:
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
prog    segment
    assume cs:prog,ds:prog
 
    org 100h
start:  jmp init
 
;*************************
 
port_b  equ 61h             ;адрес порта b
cmd_reg equ 43h             ;адрес командного регистра
chnl_2  equ 42h             ;адрес канала 2
 
old31h  dd ?                ;адрес предыдущего обработчика прерывания 31h
old09h  dd ?                ;адрес предыдущего обработчика прерывания 09h
 
txtpos  equ 0c1eh           ;координаты для вывода сообщения txt
txt db 'Programma vigrujena!'   ;'Программа выгружена!'
txtl    equ $-txt           ;длина сообщения txt1  
 
loaded  dw 12345            ;признак загрузки программы в память
;--------------------------------------------------------
 
NEW_INT proc far            ;обработчик прерывания INT31h
 
    push bx             ;сохраняем регистры в стеке
    push cx
    push dx
    push si
    push di
    push bp
    push ds
    push es
 
    push cs             ;загружаем регистр DS значением CS через стек
    pop ds
 
 
    mov dx,high(1190000)        ;вычисляем параметр задания частоты звука
    mov ax,low(1190000)
    div bx
    mov bx,ax
 
    mov ax,18           ;вычисляем параметр задания длительности звука
    mul bp
    mov bp,ax
 
    in al,port_b            ;разрешение канала 2 порта b микросхемы 8255
    or al,3
    out port_b,al
 
    mov al,10110110b        ;установка регистров ввода/вывода
    out cmd_reg,al
 
    mov ax,bx           ;засылка счетчика в задвижку
    out chnl_2,al
    mov al,ah
    out chnl_2,al
 
    mov ah,0            ;формируем длительность звука (задержкой)
    int 1ah
    add dx,bp
    mov bx,dx
delay:  int 1ah
    cmp dx,bx
    jne delay
 
    in al,port_b            ;выключаем звук
    and al,11111100b
    out port_b,al
 
exit:   pop es              ;восстанавливаем значения регистров из стека
    pop ds
    pop bp
    pop di
    pop si
    pop dx
    pop cx
    pop bx
 
    iret                ;выходим из обработчика прерывания INT 31h
NEW_INT endp
;--------------------------------------------------------
 
 
;********************************************************
new09h  proc far            ;обработчик прерывания INT09h
 
    pushf               ;сохраняем регистры в стеке
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push bp
    push ds
    push es
 
    push cs             ;загружаем регистры DS и ES значением CS через стек
    push cs
    pop ds
    pop es
 
    mov ah,2            ;если не нажат <Left Shift>, то переходим к выходу из обработчика
    int 16h
    and al,00000010b
    jz exit09
 
    mov bl,20h          ;выводим сообщение о выгрузке программы из памяти
    mov cx,txtl
    mov dx,txtpos
    mov bp,offset txt
    mov ah,0fh
    int 10h
    mov ah,13h
    mov al,0
    int 10h
 
    call unload         ;вызываем подпрограмму выгрузки программы из памяти
 
exit09: pop es              ;восстанавливаем значения регистров из стека
    pop ds
 
    pop bp
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    popf
 
    jmp cs:old09h           ;переходим к предыдущему обработчику прерывания INT 09h
 
new09h  endp
;********************************************************
 
 
;=======ПОДПРОГАММЫ============      ;РАЗДЕЛ ПОДПРОГРАММ
 
;-------UNLOAD-----------------     ;ПОДПРОГРАММА ВЫГРУЗКИ ПРОГРАММЫ ИЗ ПАМЯТИ
unload  proc near
    mov ax,3531h            ;получаем вектор прерывания 31h
    int 21h
 
    push ds             ;устанавливаем вектор прерывания 31h
    mov ax,2531h
    mov dx,word ptr es:[offset old31h]
    mov ds,word ptr es:[offset old31h+2]
    int 21h
    pop ds
 
    push ds             ;устанавливаем вектор прерывания 09h
    mov ax,2509h
    mov dx,word ptr es:[offset old09h]
    mov ds,word ptr es:[offset old09h+2]
    int 21h
    pop ds
 
    mov ah,49h          ;освобождаем блок памяти
    int 21h
 
    ret
unload  endp
;------------------------------
 
psize   equ ($-prog)/16+1       ;длина резидентной части программы
 
;-------INIT-------------------     ;ПОДПРОГРАММА ИНИЦИАЛИЗАЦИИ
init    proc near
    mov ah,9            ;выводим заголовок программы
    mov dx,offset msg1
    int 21h
 
    mov ax,3531h            ;получаем вектор прерывания 31h
    int 21h
    mov word ptr old31h,bx
    mov word ptr old31h+2,es
 
    mov ax,2531h            ;устанавливаем вектор прерывания 31h
    mov dx,offset NEW_INT
    int 21h
    ;--------------
 
    mov ax,3509h            ;получаем вектор прерывания 09h
    int 21h
    mov word ptr old09h,bx
    mov word ptr old09h+2,es
 
    mov ax,2509h            ;устанавливаем вектор прерывания 09h
    mov dx,offset new09h
    int 21h
    ;--------------
 
    mov ax,3100h            ;вызываем функцию DOS: завершить и оставить резидентной
    mov dx,psize
    int 21h
 
init    endp
;------------------------------
 
                    ;'ЗВУК INT 31h.'
                    ;'Резидентная программа загружена в память!'
msg1    db 13,10,13,10,'ZVUK - INT 31h.'
    db 13,10,'TSR programma zagrujena v pamyat!',13,10,'$'
 
prog    ends
    end start
Тут второй сегмент кода:
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
dosseg
.model small
.stack 1000h
.data
;*************************      ;РАЗДЕЛ КОНСТАНТ И ПЕРЕМЕННЫХ
 
                    ;'Программа INT 31h не загружена!'
txt1    db 13,10,10,'Programma INT 31h ne zagrujena!$'
 
                    ;'Введите частоту звука (100..30000Гц)'
txt2    db 13,10,10,'Vvedite chastotu zvuka (100..30000Hz): $'
 
                    ;'Введите длительность звука (1..99сек)'
txt3    db 13,10,10,'Vvedite dlitelnost zvuka (1..99sec): $'
 
                    ;'Неверное число!'
err1    db 13,10,10,'Nevernoe chislo!$'  
 
inpbuf  db 5+1              ;буфер для ввода числа
inpbuf2 db ?
inpbuf3 db 5+1 dup (?)
 
freq    dw ?                ;частота звука
durat   dw ?                ;длительность звука
;--------------------------------------------------------
 
.code
    mov ax,@data            ;загружаем адрес сегмента данных
    mov ds,ax
 
    mov ax,3531h            ;получаем вектор прерывания 31h
    int 21h
 
    mov ax,es:[bx-2]        ;проверяем наличие программы в памяти по признаку
    cmp ax,12345
    je m1               ;если программа загружена, то переходим далее
 
    mov dx,offset txt1      ;иначе - выходим из программы
    call tprint
    jmp exit
    ;-------------
 
m1: mov di,offset txt2      ;выдаем запрос на ввод частоты звука
    call input
    cmp bx,100          ;если введено недопустимое значение, то
    jb m2               ;переходим к повтору ввода
    cmp bx,30000            ;иначе - переходим далее
    jbe m3
 
m2: mov dx,offset err1
    call tprint
    jmp m1
 
m3: mov freq,bx         ;сохраняем частоту звука
 
    mov inpbuf,2+1          ;корректируем количество символов для ввода длительности звука
m4: mov di,offset txt3      ;выдаем запрос на ввод длительности звука
    call input          ;если введено недопустимое значение, то
    cmp bx,1            ;переходим к повтору ввода
    jae m5              ;иначе - переходим далее
 
    mov dx,offset err1
    call tprint
    jmp m4
 
m5: mov durat,bx            ;сохраняем длительность звука
 
    mov bx,freq         ;загружаем частоту звука
    mov bp,durat            ;загружаем длительность звука
    int 31h             ;вызов функции через INT 31h
 
exit:   mov ah,4ch          ;завершаем программу
    int 21h
;--------------------------------------------------------
 
;=======ПОДПРОГАММЫ===========
 
;-------INPUT-----------------      ;ПОДПРОГРАММА ВВОДА ЧИСЛА
                    ;при выходе:
                    ;BX - введенное число
 
input   proc near
inp4:   mov dx,di           ;выводим приглашение
    call tprint
 
    mov ah,0ah          ;ожидаем ввод строки в буфер
    mov dx,offset inpbuf
    int 21h
    cmp byte ptr inpbuf2,0      ;если ввели не пустую строку, то переходим далее
    jne inp1
 
inp2:   mov dx,offset err1      ;иначе, выводим сообщение об ошибке
    call tprint         ;и переходим к повтору ввода числа
    jmp inp4
 
inp1:   mov bx,0            ;обнуляем результат перевода строки символов в число
    mov ch,0            ;загружаем длину введенной строки
    mov cl,inpbuf2
 
    mov si,offset inpbuf3       ;загружаем адрес буфера введенных символов
 
inp3:   mov ax,10           ;умножаем текущее значение результата на 10
    mul bx
    mov bx,ax
 
    mov al,[si]         ;загружаем очередной символ из буфера
    sub al,'0'          ;если введен некорректный символ, то переходим к выводу сообщения об ошибке
    cmp al,9
    ja inp2
 
    mov ah,0            ;прибавляем полученное число к содержимому результата
    add bx,ax
 
    inc si              ;переходим к следующему символу в буфере
    loop inp3           ;повторяем цикл для всех введенных символов
 
    ret
input   endp
;-----------------------------  
 
 
;-------TPRINT----------------      ;ПОДПРОГРАММА ПЕЧАТИ ТЕКСТОВОЙ СТРОКИ
                    ;при входе:
                    ;DX - начальный адрес текста
tprint  proc near
    mov ah,9h           ;выводим строку
    int 21h
 
    ret
tprint  endp
;-----------------------------
 
end
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.04.2011, 15:55
Помогаю со студенческими работами здесь

Определить параметры фильтра для обработки звукового сигнала
Я тут вот диплом пишу, одна из задач, это определить параметры фильтра для обработки звукового сигнала У меня есть 5-6 записей (массив...

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

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

Получение информации о частоте и длительности из звукового файла.
Нужно получить информацию ТОЛЬКО о частотах и длительностях звукового файла. Откуда такую инфу проще достать? Мне кажется, что из PCM или...

Различие частоты сигнала и частоты его АКФ
Здравствуйте. Я думал, что если взять обычный синусоидальный сигнал, найти его АКФ, то частота не должна измениться (частота исходного...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru