Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 18:47   #1
Patifonka
Новичок
Джуниор
 
Регистрация: 11.12.2011
Сообщений: 1
Вопрос Программа перехвата прерываний от системного таймера(Assembler)

Задание: программа перехватывает прерывания от системного таймера и переодически(через 1 секунду) выводит строку на экран. После вывода 6 строк программа завершается.
__________________________________
Что-то строки не выводятся вовсе,а какие-то кракозябины сплошные. Помогите пожалуйста разобраться, исправить

Код:
text		segment	‘code’
assume	cs:text, ds:text
org	100h	
main proc
;Заполнение вектора 1Ch адресом своего обработчика прерываний от таймера
mov	AH, 25h                 ;Функция загрузки вектора
mov	AL, 1Ch		        ;Тип вектора
lea	DX,alarm		;Смещение своего обработчика
push	CS			;отправление CS в DS
pop	DS			; DS: DХ -> alarm
int	21h			
;Остановка программы, чтобы пронаблюдать работу таймера
;(Остановка программы до нажатия клавиши)
		mov	AH, 01h		;Функция ввода символа
		int	21h		;с клавиатуры
; Завершение программмы. Сначала восстанавливается содержимое вектора 1Ch. 
push	DS			;Сохранение DS
mov	DX, 0FF53h		;Смещение обработчика BIOS
mov	AX, 0F000h		;Сегмент обработчика BIOS
mov	DS, AX		        ;Настройка DS
mov	AX,251Ch		;Функция заполнения вектора
int 21h			
pop DS			;Восстановление DS
;Завершение программы обычным образом

main endp
;Свой обработчик прерываний от таймера
alarm:	push	AX			;Сохранение 
		push	BX			; всех
                push	DX			; используемых
		push	ES			;регистров
;Регистр DS приходит из программы BIOS
;Поэтому адресуется через  СS
		dec	CS:count		;Декремент счетчика времени
		cmp	CS:count,0		;Отсчитали 18 прерываний?
		je	output		;Да,на вывод строки
		jmp short retret		;Нет,на выход
output:	      dec	CS:nmb		;Декремент счетчика строк
		cmp	CS:nmb,0		;Все строки выведены?
		je	retret			;Да,на выход
		mov	AH, 40h
		mov	BX,2
		mov	DX,offset tst   ; DS:DX - адрес строки
        	mov	CX, tst_length  ; CX - длина строки
        	int	21h
       
retret:		pop	ES			;Восстановка
                pop	DX			;всех		
                pop	BX			;
		pop	AX			;регистров
		iret				;Выход из обработчика
tst		db	‘Текстовая строка $’		 
tst_length = $-tst             			 ; длина строки = текущий адрес
                                        	; минус адрес начала строки
nmb		db	6+1			;Число выводимых строк+1
count		dw	18			;Счетчик времени (1с)
text		ends
end		main
Patifonka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Частота системного таймера EugenK Общие вопросы C/C++ 1 20.09.2011 14:34
Как из обработчика прерываний от таймера вызвать int 21h ? ccccfr Операционные системы общие вопросы 1 21.03.2011 01:13
Отключение перехвата прерываний интегрированной средой Delphi Марина2300 Помощь студентам 1 30.04.2010 23:37
Обрабочик прерываний от таймера С++ AleksIv Помощь студентам 0 19.04.2010 18:36
Обращение к COM-порту из обработчика системного таймера (приложение WinForm) mdrake Общие вопросы .NET 4 18.06.2008 09:36