Обработка прерываний таймера - Assembler

Узнай цену своей работы

Формулировка задачи:

Пытаюсь написать программу, которая перехватывает прерывание таймера и выдает звуковой сигнал каждую секунду, но получаю ошибку "temp.exe is not recognized as internal or external command" и не знаю, что не так с программой
Макроопределение задержки;
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

Решение задачи: «Обработка прерываний таймера»

textual
Листинг программы
.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

Объяснение кода листинга программы

Код написан на ассемблере для ПК IBM PC и XT. Программа позволяет динамику компьютера издавать звук заданной частоты и длительности. Процедура SOUND выполняет следующие действия:

  1. Сохраняет регистры.
  2. Задает режим таймера.
  3. Устанавливает делитель времени.
  4. Записывает младший и старший байты счетчика таймера 2.
  5. Считывает текущую установку порта B и сохраняет её в регистре AH.
  6. Включает динамик.
  7. Начинает ожидание в цикле, пока не исчерпается счетчик длительности.
  8. Восстанавливает исходную установку порта B.
  9. Восстанавливает регистры. Процедура main выполняет следующие действия:
  10. Устанавливает сегмент данных на 500.
  11. Устанавливает сегмент стека на 500.
  12. Запускает процедуру Sound.
  13. Передает в регистры DX и BX значение 500.
  14. Вызывает процедуру Sound.
  15. Передает в регистр AX значение 4C00H.
  16. Вызывает функцию interrupt 21H. Список действий:
  17. Задание режима таймера.
  18. Установка делителя времени.
  19. Включение динамика.
  20. Ожидание в цикле, пока не исчерпается счетчик длительности.
  21. Восстановление исходной установки порта B.
  22. Восстановление регистров.
  23. Передача в регистры DX и BX значения 500.
  24. Вызов процедуры Sound.
  25. Передача в регистр AX значения 4C00H.
  26. Вызов функции interrupt 21H.

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы