Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Нужна помощь


Автор: pechkin 9.3.2008, 21:37
Требуется написать программу для вывода на экран символов латинского алфавита с периодичностью 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

Автор: Wowa 10.3.2008, 03:52
Модератор: Название темы должно отражать ее суть!
 Правила форума: http://forum.vingrad.ru/index.php?act=boardrules

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)