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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2008, 01:46   #1
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию Контроллер прерываний

Ведущий ПКП имеет два программно доступных регистра с адресами 20h и 21h. Ведомый ПКП имеет два программно доступных регистра с адресами А0h и А1h. Назначение обоих регистров в ведущем и ведомом ПКП аналогично.
Создал 2 программы чтения регистров irr и isr ведомого и ведущего ПКП.Программы работают,выводятся значения регистров.Соединил эти программы в одну,программа "виснет",не возвращается в DOS.Помогите,пож-та;в чем ошибка?

Листинги с коментариями:

Ведущий
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b ;устанавливаем 2 бит, чтобы
out 20h,ax; открыть доступ для чтения регистра isr
in ax,20h ; считываем содержимое регистра isr
call main

call NEWSTR

call clean
or ax,01b;тоже самое, только для регистра irr
out 20h,ax;
in ax,20h
call main

int 20h


;*******************процедуры**********************

;переход на новую строку
 NEWSTR proc
mov ah,02h
mov dl,13
int 21h
mov dl,10
int 21h 
ret
 NEWSTR endp


;процедура перевода в двоичную систему содержимого регистров и вывода на экран
 main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1 ;сдвиг,если CF=1,то переход на метку m2(печатаем "1"),иначе m3 (печатаем "0")

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

;процедура очистки регистров
clean proc 
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin

ведомый ПКП,тоже самое, только порт уже 160(0Ah)
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

call clean
or ax,10b
out 0A0h,ax ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax ;irr
in ax,0A0h
call main

int 20h




write proc
mov ah,09h
int 21h
ret
 write endp

  NEWSTR proc
   mov ah,02h
 mov dl,13
  int 21h
   mov dl,10
 int 21h 
 ret
 NEWSTR endp

 main proc

mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc 
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin
собственно "зависающая программа" с теми же процедурами,все тоже самое
Код:
cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:
;************************** ведущий ****************************
call clean
or ax,10b
out 20h,ax   ;isr
in ax,20h
call main

call NEWSTR

call clean
or ax,01b
out 20h,ax   ;irr
in ax,20h
call main


;************************** ведомый ****************************

call NEWSTR
call clean
or ax,10b
out 0A0h,ax   ;isr
in ax,0A0h
call main

call NEWSTR

call clean
or ax,01b
out 0A0h,ax   ;irr
in ax,0A0h
call main

int 20h
;*************************** процедуры**************************



  write proc
   mov ah,09h
   int 21h
   ret
  write endp

  NEWSTR proc
   mov ah,02h
  mov dl,13
  int 21h
 mov dl,10
 int 21h 
  ret
  NEWSTR endp

  main proc
 
mov bx,ax
mov cx,16
mov bx,10
xor dx,dx
m1:
clc
rol bx,1

jc m2

jmp m3

m2:

mov dx,'1'
mov ah,02h
int 21h


loop m1


m3:
mov ah,02h
mov dx,'0'
int 21h

loop m1

main endp

clean proc 
xor ax,ax
xor bx,bx
xor dx,dx
clean endp


cseg ends
end begin

Последний раз редактировалось smileman; 15.11.2008 в 17:05.
smileman вне форума Ответить с цитированием
Старый 15.11.2008, 20:54   #2
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

Все ошибку нашел,
теперь вопрос о регистре масок прерываний.
здесь я вроде бы замаскировал IRQ14-контроллер накопителя на гибких дисках.
Вот сама программа:
Код:
 cseg segment
assume cs:cseg, ss:cseg, ds:cseg, es:cseg
org 100h

begin:

xor ax,ax

in al,0A1h
or al,10b
out 0A1h,al


ret 
cseg ends

end begin
Что должно вообще происходить?

Последний раз редактировалось smileman; 15.11.2008 в 22:04.
smileman вне форума Ответить с цитированием
Старый 16.11.2008, 00:07   #3
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

IRQ14 это жесткий диск (ведомый контроллер) если не ошибаюсь, а гибкий IRQ6 (ведущий)....
Я так понимаю вам нужно объяснение самого процесса обработчика прерываний?
Надо бы избавиться от привычки ставить многоточие.....

Последний раз редактировалось Min; 16.11.2008 в 00:13.
Min вне форума Ответить с цитированием
Старый 16.11.2008, 00:59   #4
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Min Посмотреть сообщение
IRQ14 это жесткий диск (ведомый контроллер) если не ошибаюсь, а гибкий IRQ6 (ведущий)....
Совершенно верно.

Цитата:
Я так понимаю вам нужно объяснение самого процесса обработчика прерываний?
мне необходимо знать,что должно происходить,если замаскировать(запретить)IRQ14
smileman вне форума Ответить с цитированием
Старый 16.11.2008, 04:21   #5
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

если из-под винды, то ничего....... просто в текущем сеансе MS-DOS будет заблокирован винт (а возможно винда и вовсе не позволит этого делать)..... только вышеприведенный код, если не ошибаюсь блокирует не IRQ14, а IRQ9..... за IRQ14 отвечает 6 бит (если считать с 0) регистра.
Надо бы избавиться от привычки ставить многоточие.....

Последний раз редактировалось Min; 16.11.2008 в 04:32.
Min вне форума Ответить с цитированием
Старый 16.11.2008, 10:15   #6
smileman
Пользователь
 
Аватар для smileman
 
Регистрация: 09.06.2008
Сообщений: 60
По умолчанию

да-да,слегка запутался)
запускал из-под dos,винда блокирует(или попросту защищенный режим).
Вот irq14:
Код:
xor ax,ax
in al,0A1h
or al,01000000b
out 0A1h,al
однако так и происходит "ничегонеделание".Просто выходит в dos.Помоему что-то должно происходить с дискетником,при запросе в ком строке a: должно что-то выводится,типа "не работает дисковод".Кстати,попробовал заблокировать клавиатуру,сработало-клавиатура не работает,а вот это IRQ14 ни черта не работает!

Последний раз редактировалось smileman; 16.11.2008 в 10:32.
smileman вне форума Ответить с цитированием
Старый 16.11.2008, 14:23   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

опмоему вы окончательно запутались..... ваш код блокирует не дисковод, а жесткий диск.... причем тут диск A не понимаю
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контроллер Simply-Art Компьютерное железо 0 24.05.2008 05:07
Список функций прерываний Arhe Помощь студентам 5 22.02.2008 01:05
Для кадого ли устройства есть свой контроллер? Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 21.06.2007 20:42