Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10653
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3992
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 1762
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1549
Дата выхода:30.10.2013, 02:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:45 / 23
Вопросов / ответов:1 / 1

Консультация # 187592: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Здравствуйте, необходимо написать программу удовлетворяющую данному условию: Составить на языке Ассемблера программу инициализации БИС 8259А в соответствии с алгоритмом, приведенным на рисунке 2: режим приоритетов простой; сигнал прерывания IRQj воспринимается по фронту; адрес контроллера прерыва...


Консультация # 187592:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Здравствуйте, необходимо написать программу удовлетворяющую данному условию: Составить на языке Ассемблера программу инициализации БИС 8259А в соответствии с алгоритмом, приведенным на рисунке 2: режим приоритетов простой; сигнал прерывания IRQj воспринимается по фронту; адрес контроллера прерываний - 20H; новый базовый вектор для IRQ0 -A0Н. Вариант 19.
Нужно использовать 32-х разрядные API функции, 32-х разрядные регистры, предпочтительно использовать ассемблер MASM

Дата отправки: 27.10.2013, 01:33
Вопрос задал: Посетитель - 397588 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 397588!
Вот Вам переделанная программа, которая "по аналогии"
Полагаю, отличия найдете самостоятельно.
Будут вопросы, спрашивайте в мини-форуме.

Код :
	.model	small

	.data
old_kbd	dd	?
string	db	"Laboratornaja rabota #2"
str_len=$-string

	.stack	256

	.code  
bflag	db	0       	;флаг нажатой клавиши ESC      
main	proc			;главная процедура
	mov	ax, @data
	mov	ds, ax		;настройка сегмента данных

	CLI			;запрещаем все прерывания
;Перепрограммируем ведущий ПКП
	mov	cl, 0a0h	;процедура выполнения повторной инициализации
	call	reinit		;ведущего ПКП с базовым вектором 0a0h
                 
;Сохраним старый вектор                         
	mov	ax, 35a1h 
	int	21h                                                              
	mov	word ptr old_kbd, bx    ;сохраняем старый
	mov	word ptr old_kbd+2, es  ;базовый адрес

;Запишим в таблицу адрес нашего обработчика прерывания
	mov	ax, 25a1h
	mov	dx, offset new_kbd
	push	ds
	push	cs
	pop	ds		;ds=cs настроили ds на начало сегмента кода
	int	21h
	pop	ds		;вернем старое значение

;Запрет на уровне регистра маски всех прерываний кроме от клавиатуры
	mov	al, 11111101b
	out	21h, al
	STI

;Цикл ожидания нажатия клавиши ESC
m1:
	mov	al, cs:bflag
	or	al, al    
	jz	m1        
   
;восстанавливаем старый вектор
	CLI
	mov	ax, 25a1h
	push	ds
	lds	dx, old_kbd
	int	21h
	pop	ds

;Перепрограммируем ПКП в режиме по-умолчанию
	mov	cl, 08h
	call	reinit
	mov	al, 10111000b	;разрешены таймер, клавиатура, ведомый контроллер и НГМД
	out	21h, al
	STI

;Завершаем процедуру и передаем управление MS DOS
	mov	ax, 4c00h
	int	21h
main	endp

;Текст нового обработчика прерывания  от клавиатуры
new_kbd proc	far
	push	ax
	push	ds
	push	es
	push	di
	push	si
	push	cx
	in	al, 60h		;считываем из выходного порта контроллера

	push	ax
				; разрешим дальнейшую обработку клавиатуры
	in      al, 61h         ; читаем состояние клавиатуры
        or      al, 10000000b   ; взводим бит 7
        out     61h, al		; отправляем в порт
        and     al, 01111111b   ; сбрасываем обратно бит 7
        out     61h, al         ; отправляем в порт
        mov     al, 20h         ; сброс контроллера прерываний
        out     20h, al
	pop	ax

	cmp	al, 01h		;клавиатуры скан-код клавиши ESC
	jne	m2
	mov	cs:bflag, al	;пометим, что была нажата ESC
m2:
	test	al, 80h
	jnz	kbd_ret

	mov	ax, @data
	mov	ds, ax
	mov	cx, str_len 
	lea	si, string
m3:
	lodsb
	mov	ah, 0eh
	int	10h
	loop	m3
kbd_ret:
	pop	cx
	pop	si
	pop	di
	pop	es
	pop	ds
	pop	ax  
	iret
new_kbd	endp

;Процедура инициализации ведущего ПКП
;Базовый адрес в процедуру передается через CL
reinit	proc
	mov	al, 00010001b		;ICW1
	out	20h, al
	mov	al, cl
	out	21h, al
	mov	al, 00000100b		;ICW3
	out	21h, al
	mov	al, 00001101b		;ICW4
	out	21h, al
	ret
reinit	endp

	end	main

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 27.10.2013, 05:09
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное