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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2011, 20:27   #1
Teor
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 46
По умолчанию Подмена прерывания клавиатуры

Здраствуйте. Возникла некая проблема (возможно не проблема, а вопрос). Есть следующая программа:
Код:
.model small
.stack 100h
.data
mess db '1 - Очистка',13,10
     db '2 - Вывод сообщения',13,10
     db '3 - Ввод сообщения без подмены',13,10
     db '4 - Ввод сообщения с подменой',13,10
     db '5 - Выход','$'
smes dw 0
segm dw 0
sc db 0
message db 19,?,19 dup (?),'$'
.code
new_int proc far //новое прерывание, которое просто вызывает старое
cli
pushf
;mov ax,@data
;mov es,ax
;mov si,offset smes
;call dword ptr es:[si]
call dword ptr cs:[smes]
sti
iret
new_int endp
clear proc // процедура очистки консоли
push bp
mov bp,sp
mov ah,6
mov al,0
mov bx,[bp+8]
mov dx,[bp+6]
mov cx,[bp+4]
int 10h
pop bp
ret 6
clear endp
poscurs proc //процедура позиционирования курсора
push bp
mov bp,sp
mov ah,2
mov bh,0
mov dx,[bp+4]
int 10h
pop bp
ret 2
poscurs endp
WriteMess proc // вывод сообщения с помощью 9 функции 21 прерывания
push bp
mov bp,sp
mov ah,9
mov dx,[bp+4]
int 21h
pop bp
ret 2
WriteMess endp
InString proc // ввод сообщения с помощью функции 0ah 21 прерывания
push bp
mov bp,sp
mov ah,0ah
mov dx,[bp+4]
int 21h
pop bp
ret 2
InString endp
start:
mov ax,@data
mov ds,ax
mov dl,0
mov dh,1
push dx
call poscurs
lea dx,mess
push dx
call WriteMess //вывели меню
@on:
mov ah,8 
int 21h //ждем нажатия
cmp al,49 //анализируем цифру
jne @n1 
mov bh,00000111b // 1 - очистка консоли
mov bl,0
push bx
mov dh,24
mov dl,79
push dx
mov ch,0
mov cl,40
push cx
call clear
jmp @on
@n1:
cmp al,50
jne @n2
mov dh,3 // 2 - вывод сообщения
mov dl,45
push dx
call poscurs
lea dx,message
add dx,2
push dx
call WriteMess
jmp @on
@n2:
cmp al,51
jne @n3
mov dh,3 //ввод сообщения
mov dl,45
push dx
call poscurs
lea dx,message
push dx
call InString
lea si,message
mov dx,si
add dl,ds:[si][1]
inc dx
inc dx
mov si,dx
mov byte ptr ds:[si],'$'
jmp @on
@n3:
cmp al,52
jne @n4
mov dh,3 // подмена и ввод
mov dl,45
push dx
call poscurs
cli
mov ax,0
mov es,ax
mov si,9
shl si,2
mov dx,es:[si]
mov bx,es:[si+2]
mov segm,bx
mov smes,dx
mov ax,seg new_int
lea dx,new_int
mov es:[si],dx
mov es:[si+2],ax
sti
lea dx,message
push dx
call InString
lea si,message
mov dx,si
add dl,ds:[si][1]
inc dx
inc dx
mov si,dx
mov byte ptr ds:[si],'$'
cli
mov ax,0
mov es,ax
mov dx,smes
mov bx,segm
mov si,24h
mov es:[si],dx
mov es:[si+2],bx
sti
jmp @on
@n4:
cmp al,53
je @n5
jmp @on
@n5:
mov ah,4ch
int 21h
end start
Программа работает следующим образом: сначала выводиться меню, потом нажимая 1,2,3,4,5 можно выполнять разные действия согласно меню. При нажатии на 4 происходит подмена 9-ого прерывания (т.е. прерывания клавиатуры) и необходимо ввести сообщение, после которого прерывание обратно подменяется на старое. Вопрос в следующем: почему при использовании такого кода
Код:
mov ax,@data
mov es,ax
mov si,offset smes
call dword ptr es:[si]
вызова старого прерывания, оно работает нестабильно - постоянно при различном вводе символов вылетают какие-то ошибки, после которого это все закрывается. Под досом, просто виснет. Но если использовать такой код:
Код:
call dword ptr cs:[smes]
вызова старого прерывания, то ошибок практически нет. Ведь адресс, на который происходит ссылка, один и тот же. В чем причина? (Программа написана на tasm)
Teor вне форума Ответить с цитированием
Старый 28.02.2011, 00:09   #2
Teor
Пользователь
 
Регистрация: 20.12.2008
Сообщений: 46
По умолчанию

Вопрос больше не актуален. Оказалось, что обработчик прерывания клавиатуры очень хитрая штука и он использует данные регистров ds и es в каком-то участке кода. В результате их изменение перед вызовом и приводило к куче ошибок.
Teor вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TASM. Перепрограммирование DOS прерывания клавиатуры Dimon12345 Помощь студентам 1 03.12.2010 18:04
Подмена прерывания 09h JeyKip Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 14.10.2010 23:10
Обработчик прерывания Клавиатуры paska Паскаль, Turbo Pascal, PascalABC.NET 2 04.07.2010 19:35
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01
Подмена IP ? KAKTYC PHP 2 28.10.2008 00:14