Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 18.12.2016, 03:40   #1
LowGree
Новичок
 
Регистрация: 18.12.2016
Сообщений: 4
Репутация: 10
По умолчанию Прерывание от таймера

Пытаюсь написать программу, которая перехватывает прерывание таймера и выдает звуковой сигнал каждую секунду, но не получается вызвать звуковой сигнал
Код:

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 43h,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,3        
                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

LowGree вне форума   Ответить с цитированием
Старый 18.12.2016, 12:11   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 844
Репутация: 602
По умолчанию

Цитата:
Сообщение от LowGree Посмотреть сообщение
не получается вызвать звуковой сигнал
Попробуй пикнуть бипером так:
Код:

Sound    proc
     push ax 
     mov  al,7
     int  29h
     pop  ax
     ret
Sound    endp

__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 18.12.2016, 12:55   #3
LowGree
Новичок
 
Регистрация: 18.12.2016
Сообщений: 4
Репутация: 10
По умолчанию

Написал, но результат не изменился, звука так и нет. Делаю на ноуте, win XP, как я понял порты 42h, 43h, 61h на нем отсутствуют, поэтому наверно первичный вариант не работает, может можно в нем как-нибудь заменить порты?

Последний раз редактировалось LowGree; 18.12.2016 в 13:18.
LowGree вне форума   Ответить с цитированием
Старый 18.12.2016, 13:57   #4
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 844
Репутация: 602
По умолчанию

Цитата:
Сообщение от LowGree Посмотреть сообщение
Делаю на ноуте
А у него есть вообще спикер?
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 18.12.2016, 14:00   #5
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 844
Репутация: 602
По умолчанию

Порт(61h) давно перекочевал в системную логику, хотя может эмулироваться
__________________
Нашедшего выход - затаптывают первым..
R71MT вне форума   Ответить с цитированием
Старый 18.12.2016, 14:35   #6
LowGree
Новичок
 
Регистрация: 18.12.2016
Сообщений: 4
Репутация: 10
По умолчанию

Да, есть и звук на максимум поставлен
LowGree вне форума   Ответить с цитированием
Старый 18.12.2016, 14:37   #7
LowGree
Новичок
 
Регистрация: 18.12.2016
Сообщений: 4
Репутация: 10
По умолчанию

Мне удалось вызвать два звуковых сигнала другой программой, но я не уверен, что они были вызваны работой программы, а не возникшей ошибкой
Код:

.286
.model tiny
.code
org 100h
start: 
    mov ax,3
    int 10h
    mov ah,9
    ;mov dx,offset string1
    int 21h
a0: mov ah,1
    int 16h
    jnz exit
    mov ah,0 
    int 1Ah
    mov bx, dx
    add bx, 18 
a1:  
                int 1Ah
                in al, 61h
                or al, 10000011b
                out 61h, al
                and al, 01111111b
                out 61h,al
                
                mov al, 10100110b
                out 43h,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        
    jmp a0
exit:   retn
;string db ?,?,':',?,?,':',?,?,0Dh,'$'
;string1 db '$'
end start

LowGree вне форума   Ответить с цитированием
Старый 19.12.2016, 13:48   #8
7in
(aka Jin X)
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Адрес: Самара
Сообщений: 159
Репутация: 64
По умолчанию

Попробуйте для начала вообще звук воспроизвести без перехвата прерывания.
Код:

.model tiny
.code
.startup

	mov	ax,500
	call	Sound

	mov	ah,86h
	mov	cx,15
	int	15h

	call	NoSound
		
	int	20h

Sound   proc    near
        xchg    bx,ax        ; Частота
        mov     dx,12h       ; (DX,AX)=1193181
        cmp     bx,dx        ; Если Bx <= 18Гц, то выход
        jbe     Done         ; Чтобы избежать переполнения
        in      al,61h       ; Порт РВ
        or      al,3         ; Установить биты 0-1
        out     61h,al
        mov     al,10110110b ; Управляющее слово таймера: канал 2, режим 3, двоичное слово
        out     43h,al       ; Вывод в регистр режима
        mov     ax,34DDh
        div     bx           ; AX=(DX:AX)/BX
        out     42h,al       ; Младший байт счетчика
        mov     al,ah
        out     42h,al       ; Старший байт счетчика
Done:   ret
Sound   endp

;─────────────────────────────────────────────────;

; Процедура NoSound: выключение звука
NoSound proc    near
        in      al,61h    ; Порт РВ
        and     al,not 3  ; Сброс битов 0-1
        out     61h,al
        ret
NoSound endp

end

7in вне форума   Ответить с цитированием
Старый 19.12.2016, 13:59   #9
7in
(aka Jin X)
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Адрес: Самара
Сообщений: 159
Репутация: 64
По умолчанию

Глянул прогу краем глаза:
1. зачем выводить 7-й бит (ошибка чётности) в порт 61h?
2. функции DOS (в частности, от 1 до 0Ch) крайне не рекомендуется использовать в TSR (по крайней мере, без проверки InDOS-флага), используйте лучше xor ah,ah/int 16h (вместо ah=6/int 21h)
3. собственно, перехвата прерывания я здесь вообще не вижу...
7in вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывание от таймера Maksimall89 Общие вопросы C/C++ 8 06.10.2012 11:22
прерывание от таймера 08h Hacker19_90 Assembler 5 20.12.2011 01:07
прерывание Ирида Assembler 2 27.10.2011 04:36
Прерывание VKorablev Паскаль 5 15.04.2011 21:12
прерывание в Си Misha_M. Помощь студентам 2 04.02.2010 21:11




04:57.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru