Требуется написать программу для вывода на экран символов латинского алфавита с периодичностью 1 символ в секунду. Таймер настроить на частоту 100Гц.
Макрокоманда инициализации таймера:
| Код | TaimIni MACRO freq,vector ;инициализация таймера канала 0 ;на заданную частоту (freq) с указанием ;адреса программы обслуживания прерывания ;(формальный параметр - vector) mov al,0 ;очистка масок прерываний out 21h,al ; cli ;запретить прерывания(очистить разряд I флагового регистра) push ds ;сохранить регистры push es ; mov ah,35h ;сохраняем старый вектор прерываний с номером 8 mov al,08h ;IRQ8 в отведенных для этого ячейках int 21h ; mov [oldip8],bx ;адрес смещения программы обслуживания mov [oldcs8],es ;адрес кодового сегмента mov dx,offset vector;устанавливаем новый пользовательский mov ax,seg vector ;вектор прерывания с указанием mov ds,ax ;на нашу программу обслуживания mov ah,25h ; mov al,08h ; int 21h ; mov al,00110110b ;перепрограммирование нулевого канала out 43h,al ;таймера на частоту, равную 1,19Мгц mov ax,freq ;деленную на введенный коэффициент out 40h,al ;запись младшего байта делителя в регистр данных mov al,ah ; out 40h,al ;вывод старшего байта делителя pop es ;восстановить регистры pop ds ;ES,DS sti ;разрешить прерывания процессору(установить флаг FI) ENDM
ExitInt MACRO arg ;Выход из программы с применением Таймера cli ;запретить прерывания (FI=0)на время mov al,00110110b;пограммирования нулевого канала out 43h,al ;таймера на стандартную ;частоту прерываний(18,2 Гц) sub ax,ax ;в счетчик таймера заносится 0 out 40h,al ;и выполняется деление mov al,ah ;1193180:65536=18,2Гц out 40h,al ; push ds ;сохpанить регистры на вpемя push es ;восстановления mov dx,[oldip8] ;восстановление системного вектора mov ax,[oldcs8] ;прерывания IRQ8 mov ds,ax ;используя функцию 25h прерывания mov ah,25h ;21H DOS mov al,08h ;эдесь указывается номер прерывания int 21h ;(для таймера - это 8) pop es ;восстановить использованные pop ds ;регистры mov al,0 ;очистка масок прерываний out 21h,al ;по регистру 21 контроллера прерываний sti ;разрешение прерываний jmp arg ;goto_0 ;на главное меню ENDM
|
|