IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

> Перехват и обработка аппаратного прерывания, Подскажите почему не работает программа?
Neon6868
сообщение 11.04.2008 23:25
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Написать на ассемблере IBM PC программу перехвата заданного аппаратного прерывания. Программа должна перехватить прерывание и продемонстрировать обработку перехваченного прерывания выводом заданного набора символов на экран прямым доступом к видеопамяти.

При этом:
• Номер прерывания – 08h
• Способ перехвата – прямым доступом к вектору прерывания
• Способ отображения – инверсия атрибутов символов всего экрана

Программа не работает, ничего не происходит после запуска! Подскажите плиз почему?

Программа:
 model small
stack 100h
.286
.data
save dw 0
cveta db 0001b,0010b,0011b,0100b,0101b,0110b,0111b,1000b,1001b,1010b,1011b,1100b,1101b,11
10b,1111b
.code
my_proc proc
pusha
mov ax,0B800h
mov es,ax
mov di,0
mov cx,2000
m1:
mov ax,es:[di]
and ah,11110000b
cmp bx,15
jbe m2
mov bx,0
m2:
add ah,cveta[bx]
mov es:[di],ax
add di,2
loop m1
popa
pop es
pop ds
pushf
call cs:[save]
iret
my_proc endp
start:
mov ax,@data
mov ds,ax
push ds
mov ax,0
mov es,ax
push es
cli
mov ah,35h
mov al,09h
int 21h
mov ax,es:[bx]
mov word ptr cs:[save],ax
mov ax,es:[bx+2]
mov word ptr cs:[save+2],ax
mov ah,25h
mov al,09h
mov dx,offset my_proc
mov ax,cs
mov ds,ax
int 21h
sti
cli
mov ah,25h
mov dx,word ptr cs:[save]
mov ds,word ptr cs:[save+2]
int 21h
sti
mov ax,4C00h
int 21h
end start


Сообщение отредактировано: Neon6868 - 11.04.2008 23:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
andriano
сообщение 12.04.2008 9:59
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


1. Размещеть программу без комментариев IMHO дурной тон. Я, например, уже лет 10 не пользовался Ассемблером под DOS и, естественно, не помню наизусть номера функций DOS. Поэтому без комментариев могу только догадываться, что делает программа. Кроме того, если бы ты откомментировал, а потом сам прочитал собственные комментарии, вероятно, ты бы сам и обнаружил ошибку, не прибегая к посторонней помощи.

2. Твоя программа трижды вызывает функцию DOS. Насколько я понимаю, это:
- запрос текущего (старого) вектора прерывания,
- установка нового,
- восстановление старого.
Так вот, когда именно должен сработать твой обработчик прерывания, если ты сразу после установки нового заменяешь его обратно на старый?
Да, ты заменяешь обработчик и затем возвращаешь старый, но за это время не успевает случиться ни одного прерывания.
Я по номеру не мог вспомнить, какое прерывание ты переопределяешь, но если это прерывание от таймера, то между sti и cli можно вставить временную задержку. Если от клавиатуры, то ожидание нажатия на клавишу и т.п.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Neon6868
сообщение 12.04.2008 16:54
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Цитата(andriano @ 12.04.2008 10:59) *

2. Твоя программа трижды вызывает функцию DOS. Насколько я понимаю, это:
- запрос текущего (старого) вектора прерывания,
- установка нового,
- восстановление старого.


Все именно так и есть! smile.gif

У меня прерывание клавиатуры, я сделал как ты написал, но почему то все равно не работает. mega_chok.gif Подскажи плиз почему?

 model small
stack 100h
.286
.data
save dw 0
cveta db 0001b,0010b,0011b,0100b,0101b,0110b,0111b,1000b,1001b,1010b,1011b,1100b,1101b,11
10b,1111b
.code
my_proc proc
pusha
push ds
push es
mov ax, @data
mov ds, ax
mov ax,0B800h
mov es,ax
mov di,0
mov cx,2000
m1:
mov ax,es:[di]
and ah,11110000b
cmp bx,15
jbe m2
mov bx,0
m2:
add ah,cveta[bx]
mov es:[di],ax
add di,2
loop m1
pop es
pop ds
popa
pushf
call dword ptr cs:[save]
iret
my_proc endp
start:
mov ax,@data
mov ds,ax
mov ax,0
mov es,ax
mov ah,35h
mov al,09h
int 21h
mov word ptr cs:[save],bx
mov word ptr cs:[save+2],es
mov ah,25h
mov al,09h
mov dx,offset my_proc
mov ax,cs
mov ds,ax
int 21h

xor ax,ax
int 16h

mov ah,25h
mov dx,word ptr cs:[save]
mov ds,word ptr cs:[save+2]
int 21h
mov ax,4C00h
int 21h
end start


Сообщение отредактировано: Neon6868 - 12.04.2008 16:55
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 14:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"