Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Chingachguk @ 13.4.2004, 19:43)
Да, если хочешь звать его, надо делать pushf, call dword ptr Int_33_Real.



Ну у меня вроде так и есть ну типа сохраним флаги а потом ..... и тд.
Добавлено @ 19:49
Цитата(Nos @ 13.4.2004, 17:25)
Конкретнее пока не могу подсказать, но если я не ошибаюсь, то:
- сохраняем родной обрободчик
- заменяем его собственным
- после отработки своего, восстанавливаем родной
ты уверен, что твоя прога делает именно так?

Ну как тебе сказать уверен я или нет, я уверен что это так по моей логике тобишь на 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
Цитата(Serzh @ 14.4.2004, 13:01)
объясните мне кто нибудь, зачем менять int 33h...
когда я мышами страдал я этого не делал и все пахало...

А что ты делал ?? по конкретней ?, и как по другому что либо менять не касаясь int 33h ????

Автор: Serzh 15.4.2004, 01:41
Код
.model tiny
.code
org  100h

Begin:
jmp  Init;метка

Mouse_Ok:
push ds
push cs
pop  ds
mov  ah, 9h ;выводим строку на экран
mov  dx, offset Message_1
int  21h
pop  ds
retf;выход из обработчика - команда RETF

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

Init:
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

xor  ax, ax
int  16h

mov  ax, 000Ch
mov  cx, 0000h;удалить обрабочик
int  33h

int  20h

end  Begin

Автор: Pro_BD 15.4.2004, 10:06
to Serzh твой кодик неплох, он мне очень помог разобратся и исходя их этого,задам еще пару вопросов:



ак при условном переходе сказать что это праваяя кнопка мышки а это левая ????



Вот код:

Код

.model tiny
.code
org  100h


Begin:

mov ah,9h
mov dx,offset Mes_1
int 21h
mov ah,10h
int 16h
Label_1:
cmp  ???????????         ;   Что сдесь  надо написать, это левая кнопка
jz Init
cmp ????????????         ;  ?????????  , это правая копка
jz Intet
jmp Begin

Mes_1 db '    ?аЁўҐвбвўго, ­ ¦¬ЁвҐ Ї®¦ «г©бв  mouse1 Ё«Ё mouse2    $'

Mouse_Ok:
push ds
push cs
pop  ds
mov  ah,9h;выводим строку на экран
mov  dx,offset Message_1
int  21h
pop  ds
retf ;выход из обработчика - команда RETF

Message_1 db '   ‚л ­ ¦ «Ё «Ґўго Є­®ЇЄг ¬лиЁ    $'

Init:
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 ah,10h
int  16h

mov  ax,000Ch
mov  cx,0000h;удалить обрабочик
int  33h

jmp Label_1

;++++++++++++++++++++++++++++++++++++++++++++

Mouse_ok_B:

push ds
push cx
pop ds
mov ah,9h
mov dx,offset Messsa_1
int 21h
pop ds
retf

Messsa_1   db '   ‚л ­ ¦ «Ё Їа ўго Є­®ЇЄг ¬лиЁ      $'

Intet:
mov ax,0
int 33h

mov ax,1
int 33h

mov ax,000Ch
mov cx,0010h
mov dx,offset Mouse_ok_B
int 33h

mov ah,10h
int 16h

mov ax,000Ch
mov cx,0000h
int 33h
jmp Label_1



end  Begin

Автор: Serzh 15.4.2004, 10:34
Код
Label_1:
mov ax, 3
int 33h
cmp bl, 1; Что сдесь надо написать, это левая кнопка
jz Init
cmp bl, 2; ????????? , это правая копка
jz Intet
jmp Label_1

Автор: Jin X 15.4.2004, 17:25
Если нужно проверить только левую или только правую кнопку и не реагировать на нажатие обоих (а также левой+средней и т.п), то см. Serzh. Если же отдельно левая, отдельно правая (а нажатие обеих как левая), то cmp меняем на test.
Если и ещё вариант:
Код
mov ax,3
int 33h
and bl,3
cmp bl,1
je Левая
cmp bl,2
je Правая
реагирует только на левую или правую (нажатие обеих игнорирует, как и среднюю кнопку).

Автор: Chingachguk 15.4.2004, 17:40
Цитата

mov ax,3
int 33h
and bl,3
cmp bl,1
je Левая
cmp bl,2
je Правая


Ну можно и так:

Цитата

  mov ax,3
  int  33h
  test bl,1
  jnz  Левая
  test bl,2
  jnz  Правая


Или так:

Цитата

  mov ax,3
  int   33h
  shr  bl,1
  jc    Левая
  shr  bl,1
  jc    Правая


Или так:

Цитата

  mov ax,3
  int  33h
  and  bx,3
  shl  bx,1
  jmp  word ptr cs:@@ButtonsProcs[bx]

@@ButtonsProcs dw offset Exit, offset Left, offset Right


;)))

Автор: Pro_BD 16.4.2004, 11:32
Что то я все равно не доконца понял sad.gif((
Так как прога у меня все равно что то не запускается =((
Взгяните плз ...
Код

.model tiny
.code
org 100h


Begin:

mov ah,9h
mov dx,offset Mes_1
int 21h
Label_1:
mov ah,10h
int 16h
cmp al,27
jz Quit_P
mov ax,3
int 33h
cmp bl,1    ; ТАК ???
jnz Init
cmp bl,2
jnz Intet
jmp Begin

Mes_1 db ' Nagmi pogalyista   mouse1 ili mouse2 $'

Mouse_Ok:
push ds
push cs
pop ds
mov ah,9h
mov dx,offset Message_1
int 21h
pop ds
retf;выход из обработчика - команда RETF

Message_1 db ' Mouse1 $'

Init:
mov ax, 0;инициализация мышки
int 33h

mov ax,1
int 33h
mov ax,000Ch
mov cx,0002h
mov dx,offset Mouse_Ok
int 33h

mov ah,10h
int 16h

mov ax,000Ch
mov cx,0000h
int 33h
int 20
jmp Label_1


;++++++++++++++++++++++++++++++++++++++++++++

Mouse_ok_B:

push ds
push cs
pop ds
mov ah,9h
mov dx,offset Messsa_1
int 21h
pop ds
retf

Messsa_1 db '   mouse 2 $'

Intet:
mov ax,0
int 33h

mov ax,1
int 33h

mov ax,000Ch
mov cx,0010h
mov dx,offset Mouse_ok_B
int 33h

mov ah,10h
int 16h

mov ax,000Ch
mov cx,0000h
int 33h
int 20h
jmp Label_1

Quit_P:
mov ah,9h
mov dx,offset Mesa
int 21h
int 20h
Mesa db   '    Poka Poka     $'
end Begin



Автор: Serzh 16.4.2004, 11:56
не
Код
jmp Begin

а
Код
jmp Label_1

я уже писал это, но ты проигнорировал... sad.gif

Автор: Pro_BD 16.4.2004, 12:24
Я не проигнорировал просто упустил Извини !! hehe.gif
Я данный вопрос поместил на 5 разных форумах, и просто не у спеваю переварить все информацию полученную от людей smile.gif
Пусть будет так
Код

Begin:

mov ah,9h
mov dx,offset Mes_1
int 21h
Label_1:
mov ah,10h
int 16h

mov ax,3
int 33h
cmp bl,1
jnz Init
cmp bl,2
jnz Intet
cmp al,27
jz Quit_P
jmp Label_1


Все равно не работает =((((

Автор: Serzh 17.4.2004, 01:39
Код
Label_1:
mov ah,10h
int 16h
cmp al,27
jz Quit_P

mov ax,3
int 33h
cmp bl,1
je Init
cmp bl,2
je Intet
jmp Label_1

так попробуй... а что именно не работает? если только выход, то теперь должно работать.

Автор: Pro_BD 19.4.2004, 11:07
Всем Всем пасибо за помощь кто помогал разобратся мне с моей задачей, Прога заработала (я чуть от радости не прыгал ) к сожалению она не целиком написана мной (жалко, так бы вообще по патолку полез =))) ) ну одинм словом все ок.
Сейчас придумываю еще одну класную вещь =))) и по ней у меня у же скопилась (n) количество вопросов, щас посижу поломаю голову дня 2-3 и начну спрашивать надеюсь не кто не против =))
Вопросы буду задавать сдесь если вам уважаймые программисты не в лом отвичать на мои глупые вопросы, изредка посещайте этот топик, всем GL.

to \Serzh
Цитата

так попробуй... а что именно не работает? если только выход, то теперь должно работать.

Я не до конца понял что не работало но, ИМХО помойму ассемблер не может понять перходов
проверки (где нажата та или иная клавиша )
Код

Label_1:
mov ah,10h
int 16h
cmp al,27  ; сюда он доходил  !!!!!!
jz Quit_P

mov ax,3
int 33h
cmp bl,1        ;Сюды тоже доходил
je Init
cmp bl,2    ; а Вот сюды уже НЕТ !!!!!
je Intet
jmp Label_1

Но, один человек привел решение задачи немного по другому и оно мне понравилось как нельзя лучше вот код если кто хотел бы посмотреть
Код



          .model tiny
          .code
          org 100h
Begin:

          mov ah,9h
          mov dx,offset Mes_1
          int 21h

          mov ax, 0           int 33h


          mov ax,000Ch
          mov cx,000ah
          mov dx,offset Mouse_ok_B
          int 33h

          mov ah,10h
          int 16h
          mov ax,000Ch
          mov cx,0000h
          int 33h

          int 20h
Mes_1 db ' Åα¿óÑΓßΓóπε, ¡áª¼áΓÑ »«ªá½π⌐ßΓá mouse1 ¿½¿ mouse2 $'
Message_1 db ' Mouse1 $'
Message_2 db ' Mouse2 $'


Mouse_ok_B:
          push ds
          push cs
          pop ds

          mov dx,offset Message_2
          test bx,01h
          jnz R_Button
          mov dx,offset Message_1
R_Button:
          mov ah,9h
          int 21h
          pop ds
          retf
end Begin

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)