Нужна помощь HELP !!!!!!!!!!

  • Автор темы Pro_BD
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

Pro_BD

#1
У меня маленькая проблемма написал программу, а она работает не коректно ( не так как надо )

вот код программы:
.model tiny
.code
org 100h

Begin:
jmp Init ;метка
Int_33_proc proc ;наш обрабочик


pushf ;сохраним все =)

push ds

push dx ;сохраним регистры

push es

push dx

mov ah,0Fh ; получим текущие состояние дисплея

int 10h

mov ax,0 ;инициализация мышки

int 33h

mov ax,1 ; покажем курсор

int 33h

mov ax,000Ch ;установим обрабочик событий

mov cx,0002h ;нажатие левой кнопки mouse'a

mov dx,offset Mouse_Ok ; адрес нашего обрабочика

int 33h

mov ax,000Ch

mov cx,0000h ;удалить обрабочик

int 33h

iret ; выход

Mouse_Ok:
mov ax,3 ;определим состояние мышки

int 33h

mov ah,9h ;выводим строку на экран

mov dx,offset Message_1

int 21h

pop dx

pop es

retf ; выход из обработчика - команда RETF



call dword ptr cs:[Int_33_Real]

pop dx

pop ds

iret ; Выходим из прерывания

Int_33_Real dd ? ;Переменная для хранения адреса "int 33h"

Message_1 db 'Вы нажали левую кнопку мышки$'

Int_33_proc endp

Init:

mov ah,35h ;Показывает адрес прерывания

mov al,33h ;Указывает номер прерывания

int 21h

mov word ptr [Int_33_Real],dx ;показываем куда мы это все сохроняли
mov word ptr [Int_33_Real]+2,ds

mov ah,25h ;Установим вектор прерывания

mov al,33h

mov dx,offset Int_33_proc

int 21h

popf

int 20h

end Begin



Помогите мне разобратся в чем я мог ошибится
Что должна была делать программа:
1.Мы её запускаем.
2.При нажатие на левую кнопку мыши она должна была выводить сообщение что 'Нажата левая кнопка мыши $'
3.Все


а работает она так ( по крайне мере у меня оТна так работает ).
При её запуске в Дос навигаторе мышь исчезает(верней курсор невидать) , просто отключается (все нету её больше) где могла быть ошибка подскажите, я дня 3 сидел думал думал так не че не надумал решил обратится к вам.


P.S. Позор мне товарищи позор, написал прогу а не могу понять что к чему в ней =(((((

И если ко нить будет что небуть высказывать по поводу моей программы (я иммею в виду ошибки ) если можно то поконкретней изъесняйтесь. тоесть не так Например: Ты облажался в строке (6) , а так, ты облажался потому что ......

Заранее спасибо
 
?

????

#2
pushf ;сохраним все =)
pushf - сохранение регистра флагов, pusha - сохрание всех регистров
mov ax,000Ch ;установим обрабочик событий
mov cx,0002h ;нажатие левой кнопки mouse'a
mov dx,offset Mouse_Ok ; адрес нашего обрабочика
int 33h
адрес надо устанавливать es:Dx - ты уверен, что es указывает туда, куда надо? ты его сам нигде не устанавливаешь

mov ax,000Ch
mov cx,0000h ;удалить обрабочик
int 33h
iret ; выход
а это что делает? т.е. ты установил обработчик и сразу его убираешь?

call dword ptr cs:[Int_33_Real]
а на эту строку имхо управление вообще не передаётся. т.е. "старый" обработчик вообще никогда не вызывается

mov ah,9h ;выводим строку на экран
mov dx,offset Message_1
int 21h
на сколько я помню, в обработчики нельзя (или не желательно) использовать функции int 21h ниже 30h (или что-то типа того). попробуй выводить записывая в видеоозу или используя int 10h

ссори если где-то "сморозил" - давно не писал на асме, да и времени не много на "разбор твоих полётов".

Удачи ;)
 
P

Pro_BD

#3
<!--QuoteBegin-????+14:04:2004, 00:53 -->
<span class="vbquote">(???? @ 14:04:2004, 00:53 )</span><!--QuoteEBegin-->1.pushf - сохранение регистра флагов, pusha - сохрание всех регистров
mov ax,000Ch ;установим обрабочик событий
mov cx,0002h ;нажатие левой кнопки mouse'a
mov dx,offset Mouse_Ok ; адрес нашего обрабочика
int 33h
2.адрес надо устанавливать es:Dx - ты уверен, что es указывает туда, куда надо? ты его сам нигде не устанавливаешь

mov ax,000Ch
mov cx,0000h ;удалить обрабочик
int 33h
iret ; выход
3.а это что делает? т.е. ты установил обработчик и сразу его убираешь?


4.а на эту строку имхо управление вообще не передаётся. т.е. "старый" обработчик вообще никогда не вызывается

mov ah,9h ;выводим строку на экран
mov dx,offset Message_1
int 21h
5.на сколько я помню, в обработчики нельзя (или не желательно) использовать функции int 21h ниже 30h (или что-то типа того). попробуй выводить записывая в видеоозу или используя int 10h

ссори если где-то "сморозил" - давно не писал на асме, да и времени не много на "разбор твоих полётов".

Удачи :) [/quote]
1.Хорошо вот мы сохранили все регистры, далее
2.Насчет адреса не уверен, сейчас по сижу покопаюсь
3.Да я устанавливаю оброботчик а потом его удаляю,но между cre и del есть команда которая показывает нам адрес нашего обрабочика так что по идеи все должно быть ок.
4.Гм имхо я даже не знаю что сказать....
5.Незнаю не когда о таком не слышал а насчте 10h попробую
Насчет разбора моих полетов, спасибо хоть что взгянул, ты хоть единствинный кто ответил ....
Если еще будут какиенить мысли насчет кода поделись со мной ок.
 
G

Guest

#4
Привет всем я не знаю может и не в той теме пишу, но тогда может вы скажите где мне могут помочь. Вопрос у меня такой у меня есть программа для снятия защиты с файлов 4ds можно ли её переделать, так, чтобы она была с другим дизайном. (ЭТО МНЕ ПО ЗАРЕЗ НУЖНО)
 
G

Guest

#6
Неплохо было бы узнать как это сделать (на каком языке написана незнаю)
 
A

Arush

#8
Проблема в следующей строчке:
:)
INT 20H: завершить программу.
Тебе-же насколько я понимаю нужно оставить ее резидентной в памяти, а это или инт27 или 31-я функция 21-го прерывания - завершиться и остаться резидентным -- KEEP.
:)
 
Статус
Закрыто для дальнейших ответов.