Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переопределения вектора прерывания, в частности Int 23h 
:(
    Опции темы
Dr.Drunk
Дата 24.1.2004, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 12.1.2004
Где: Волжский

Репутация: нет
Всего: нет



Народ, помогите, кто знает. butbut.gif

Надо переопределить обработчик нажатия Ctrl-Break
делаю вот так:

.model small
.486
.data
str1 db "Нажмите Ctrl+Break",10,13,'$'
str2 db "Для выхода нажмите Esc",10,13,'$'
str3 db "Opss",10,13,'$'
x1 dw 0
.stack 100h
.code

...

mov ax, 2523h
mov dx, offset mes
int 21h

....

mov ax,0003h
int 10h

mov ah,09h
lea dx,str1
int 21h

mov ah,09h
lea dx,str2
int 21h

cmd_op:
mov ah, 10h
int 16h
cmp al,1bh
je cmd_ex
jmp cmd_op
cmd_ex:

...

mes proc
pusha

m1:
mov ah,09h
lea dx,str3
int 21h
mov ah, 0bh
int 21h
cmp al,0ffh
jne m1

popa
iret
endp

В результате на Win 2k и XP управление просто не передается процедуре mes
А в win9x генерит ошибку "Программа выполнила недопустимую инструкцию по адресу 0000:0056"

--------------------
_Theory_ is when you know everything but nothning works._Practice_ is when everything works but no one knows why._IN THIS PLACE_ we're combining theory and practice -nothing works and no one knows why!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 24.1.2004, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 2
Всего: 112



Проблема в том, что надо, чтобы адрес ППОП был в DS:DX, а у тебя в CS:DX...
Т.е. либо засунь в ds значение cs перед вызовом 25h, либо делай все в одном сегменте (модель tiny).
И еще: Ctrl-Break-прерывание - это 1Bh, а не 23h...
Вот тебе оба варианта:
Код
.model small

.486

.data

str1 db "Нажмите Ctrl+Break",10,13,'$'
str2 db "Для выхода нажмите Esc",10,13,'$'
str3 db "Opss",10,13,'$'
x1 dw 0

.stack 100h

.code

assume cs:@code,ds:@data

main proc far

mov ax, @data
mov ds, ax

push ds
push cs
pop ds
mov ax, 251Bh
lea dx, mes
int 21h
pop ds

mov ax,0003h
int 10h

mov ah,09h
lea dx,str1
int 21h

mov ah,09h
lea dx,str2
int 21h

cmd_op:
mov ah, 10h
int 16h
cmp al,1bh
je cmd_ex
jmp cmd_op
cmd_ex:
main endp

mes proc far
pusha
mov ax, @data
mov ds, ax
mov ah,09h
lea dx,str3
int 21h
popa
iret
mes endp

end main
Код
.model tiny

.486

.code

assume cs:@code,ds:@code

main proc far

mov ax, @code
mov ds, ax

mov ax, 251Bh
lea dx, mes
int 21h

mov ax,0003h
int 10h

mov ah,09h
lea dx,str1
int 21h

mov ah,09h
lea dx,str2
int 21h

cmd_op:
mov ah, 10h
int 16h
cmp al,1bh
je cmd_ex
jmp cmd_op
cmd_ex:
main endp

mes proc far
pusha
mov ax, @data
mov ds, ax
mov ah,09h
lea dx,str3
int 21h
popa
iret
mes endp

str1 db "Нажмите Ctrl+Break",10,13,'$'
str2 db "Для выхода нажмите Esc",10,13,'$'
str3 db "Opss",10,13,'$'
x1 dw 0

.stack 100h

end main



--------------------
С уважением, г-н Посол.
PM   Вверх
Serzh
Дата 26.1.2004, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 30.9.2003
Где: SPb

Репутация: нет
Всего: нет



а еще было бы не плохо запоминать старый обработчик Ctrl-Break.
не помню какая функция, но вроде 35h.
PM MAIL WWW ICQ   Вверх
Dr.Drunk
Дата 27.1.2004, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 12.1.2004
Где: Волжский

Репутация: нет
Всего: нет



Цитата(p0s0l @ 24.1.2004, 16:54)
Проблема в том, что надо, чтобы адрес ППОП был в DS:DX, а у тебя в CS:DX...
Т.е. либо засунь в ds значение cs перед вызовом 25h, либо делай все в одном сегменте (модель tiny).
И еще: Ctrl-Break-прерывание - это 1Bh, а не 23h...

Спасибо, что просветили, а то я всю голову сломал, самое обидное что уменя в доках было написано что обработчиком Ctrl-Break является именно 23h, это уже потом я нашел про 1Bh, но когда я его попытался переопределить то при запуске в режиме из под доси машина вешалась наглухо rolleyes.gif

Цитата(Serzh)
а еще было бы не плохо запоминать старый обработчик Ctrl-Break.
не помню какая функция, но вроде 35h.

по поводу запоминания старого обработчика, дело хорошое, но в той же справке написано, что процесс который запускает прогу, сам по ее завершению возвращает старый обработчик, но я пока не проверял данного утверждения wink.gif

Это сообщение отредактировал(а) Dr.Drunk - 27.1.2004, 07:55
--------------------
_Theory_ is when you know everything but nothning works._Practice_ is when everything works but no one knows why._IN THIS PLACE_ we're combining theory and practice -nothing works and no one knows why!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.