| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Народ помогите разобратся |
| Автор: Pro_BD 13.4.2004, 14:16 |
| У меня маленькая проблемма написал программу, а она работает не коректно ( не так как надо ) вот код программы: .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) , а ты облажался потому что ...... Заранее спасибо |
| Автор: Akina 13.4.2004, 16:05 |
| ё-моё... вызывать прерывание из обработчика этого прерывания... сильно... |
| Автор: Nos 13.4.2004, 17:25 |
| Конкретнее пока не могу подсказать, но если я не ошибаюсь, то: - сохраняем родной обрободчик - заменяем его собственным - после отработки своего, восстанавливаем родной ты уверен, что твоя прога делает именно так? |
| Автор: Chingachguk 13.4.2004, 19:43 | ||
Да, если хочешь звать его, надо делать pushf, call dword ptr Int_33_Real. |
| Автор: Pro_BD 13.4.2004, 19:46 | ||||
Ну у меня вроде так и есть ну типа сохраним флаги а потом ..... и тд. Добавлено @ 19:49
Ну как тебе сказать уверен я или нет, я уверен что это так по моей логике тобишь на 90% Остальные 10% это мое не знание поэтому может быть и ошибка. |
| Автор: Chingachguk 13.4.2004, 20:45 |
| Нет, я не говорю про сохранение флагов. Ты используешь ФУНКЦИЮ прерывания int 33h - установить обработчик события. Когда ты это делаешь, ты должен указать, при наступлении какого именно события тебя нужно вызвать. Про это посмотри подробнее в описании к этой функции. Процедура должна быть типа far а не прерывание. Типа того: jmp Install MyMouse proc pusha push ds ; Здесь код твой ; смотри регистры, которые тебе даст при вызове обработчик int 33h pop ds popa retf MyMouse endp Install: ; Установить обработчик события ; Чего-то ждать, например - клавиши ; Деинсталлировать обработчик ; Завершить программу Если же ты хочешь сделать программу РЕЗИДЕНТНОЙ, те такой, что работает будучи ОСТАВШЕЙСЯ В ПАМЯТИ, то код будет несколько иным: jmp Install MyMouse proc pusha push ds ; Здесь код твой ; смотри регистры, которые тебе даст при вызове обработчик int 33h pop ds popa retf MyMouse endp Install: ; Установить обработчик события ; Завершить процесс, оставшись резидентом - смотри вызовы int 27h или int 31h. |
| Автор: Jin X 13.4.2004, 22:41 |
| Ответ см. http://forum.sources.ru/index.php?showtopic=51252 ;) |
| Автор: Serzh 14.4.2004, 13:01 |
| объясните мне кто нибудь, зачем менять int 33h... когда я мышами страдал я этого не делал и все пахало... |
| Автор: Pro_BD 14.4.2004, 14:24 | ||
А что ты делал ?? по конкретней ?, и как по другому что либо менять не касаясь int 33h ???? |
| Автор: Serzh 15.4.2004, 01:41 | ||
|
| Автор: Pro_BD 15.4.2004, 10:06 | ||
| to Serzh твой кодик неплох, он мне очень помог разобратся и исходя их этого,задам еще пару вопросов: ак при условном переходе сказать что это праваяя кнопка мышки а это левая ???? Вот код:
|
| Автор: Serzh 15.4.2004, 10:34 | ||
|
| Автор: Jin X 15.4.2004, 17:25 | ||
| Если нужно проверить только левую или только правую кнопку и не реагировать на нажатие обоих (а также левой+средней и т.п), то см. Serzh. Если же отдельно левая, отдельно правая (а нажатие обеих как левая), то cmp меняем на test. Если и ещё вариант:
|
| Автор: Chingachguk 15.4.2004, 17:40 | ||||||||
Ну можно и так:
Или так:
Или так:
;))) |
| Автор: Pro_BD 16.4.2004, 11:32 | ||
| Что то я все равно не доконца понял Так как прога у меня все равно что то не запускается =(( Взгяните плз ...
|
| Автор: Serzh 16.4.2004, 11:56 | ||||
не
а
я уже писал это, но ты проигнорировал... |
| Автор: Pro_BD 16.4.2004, 12:24 | ||
| Я не проигнорировал просто упустил Извини !! Я данный вопрос поместил на 5 разных форумах, и просто не у спеваю переварить все информацию полученную от людей Пусть будет так
Все равно не работает =(((( |
| Автор: Serzh 17.4.2004, 01:39 | ||
так попробуй... а что именно не работает? если только выход, то теперь должно работать. |
| Автор: Pro_BD 19.4.2004, 11:07 | ||||||
| Всем Всем пасибо за помощь кто помогал разобратся мне с моей задачей, Прога заработала (я чуть от радости не прыгал ) к сожалению она не целиком написана мной (жалко, так бы вообще по патолку полез =))) ) ну одинм словом все ок. Сейчас придумываю еще одну класную вещь =))) и по ней у меня у же скопилась (n) количество вопросов, щас посижу поломаю голову дня 2-3 и начну спрашивать надеюсь не кто не против =)) Вопросы буду задавать сдесь если вам уважаймые программисты не в лом отвичать на мои глупые вопросы, изредка посещайте этот топик, всем GL. to \Serzh
Я не до конца понял что не работало но, ИМХО помойму ассемблер не может понять перходов проверки (где нажата та или иная клавиша )
Но, один человек привел решение задачи немного по другому и оно мне понравилось как нельзя лучше вот код если кто хотел бы посмотреть
|