Обработка прерываний таймера - 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 выполняет следующие действия:
- Сохраняет регистры.
- Задает режим таймера.
- Устанавливает делитель времени.
- Записывает младший и старший байты счетчика таймера 2.
- Считывает текущую установку порта B и сохраняет её в регистре AH.
- Включает динамик.
- Начинает ожидание в цикле, пока не исчерпается счетчик длительности.
- Восстанавливает исходную установку порта B.
- Восстанавливает регистры. Процедура main выполняет следующие действия:
- Устанавливает сегмент данных на 500.
- Устанавливает сегмент стека на 500.
- Запускает процедуру Sound.
- Передает в регистры DX и BX значение 500.
- Вызывает процедуру Sound.
- Передает в регистр AX значение 4C00H.
- Вызывает функцию interrupt 21H. Список действий:
- Задание режима таймера.
- Установка делителя времени.
- Включение динамика.
- Ожидание в цикле, пока не исчерпается счетчик длительности.
- Восстановление исходной установки порта B.
- Восстановление регистров.
- Передача в регистры DX и BX значения 500.
- Вызов процедуры Sound.
- Передача в регистр AX значения 4C00H.
- Вызов функции interrupt 21H.