У меня маленькая проблемма написал программу, а она работает не коректно ( не так как надо )
вот код программы:
.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) , а так, ты облажался потому что ......
Заранее спасибо
18.04.04 13:44: Перенесено модератором из 'Сети, сокеты, протоколы' в Низкоуровневое программирование. — ХД
Здравствуйте, Pro_BD, Вы писали:
Привет
я правда лет пять уже не писал на асме под DOS, но попробую тебе помочь.
Вот как я понял код твоей программы:
.model tiny
.code
org 100h
Begin:
jmp Init ;метка
...
skip
...
Init:
mov ah,35h ;
mov al,33h ;
int 21h ; получаем вектор прерывания 33h
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
P_B>И если ко нить будет что небуть высказывать по поводу моей программы (я иммею в виду ошибки ) если можно то поконкретней изъесняйтесь. тоесть не так Например: Ты облажался в строке (6) , а так, ты облажался потому что
Мой тебе совет: заканчивай заниматься ерундой.
Посмотри на календарь, сейчас 2004 год
какой смысл писать проги под DOS на ассемблере ( или это в институтах заставляют? )
Начни изучать лучше C++.
P_B>P.S. Позор мне товарищи позор, написал прогу
Ты точно в этом уверен? Что ты сам ее написал?
во первых, для данной цели программа очень большая, можно было и поменьше.
во вторых, по играй с графическими режимами, в этом может быть проблема.
в третьих, создай пустой файл, возьми книжку по Ассму и вперед.... и с песней.
Здравствуйте, Pro_BD, Вы писали:
Сдается мне внутри обработчика вызывать инт33 никак нельзя это раз.
Во вторых неплохо бы такие проги оставлять резидентными потому как даже если все правильно написано после завершения программы этот блок может быть выделен другой (если ошибаюсь поправьте)
Соответственно попробую показать потенцальные ошибки.
P_B> У меня маленькая проблемма написал программу, а она работает не коректно ( не так как надо )
P_B>вот код программы:
P_B>P_B>.model tiny
P_B>.code
P_B>org 100h
P_B>Begin:
P_B> jmp Init ;метка
P_B> Int_33_proc proc ;наш обрабочик
P_B> pushf ;сохраним все =)
; Вообще мне кажется при входе в обрабочик железного прерывания надо делать pusha
P_B> push ds
P_B> push dx ;сохраним регистры
P_B> push es
P_B> push dx
P_B> mov ah,0Fh ; получим текущие состояние дисплея
P_B> int 10h
P_B> mov ax,0 ;инициализация мышки
P_B> int 33h
;!!! после выполнения этой команды управление передастся на Инт33прок несколько раз до срыва стека.
P_B> mov ax,1 ; покажем курсор
P_B> int 33h
;см выше
P_B> mov ax,000Ch ;установим обрабочик событий
P_B> mov cx,0002h ;нажатие левой кнопки mouse'a
P_B> mov dx,offset Mouse_Ok ; адрес нашего обрабочика
P_B> int 33h
P_B> mov ax,000Ch
P_B> mov cx,0000h ;удалить обрабочик
P_B> int 33h
;!!!! На входе в обработчик сохранены регистры - вернуть бы не плохо
P_B> iret ; выход
P_B>Mouse_Ok:
P_B> mov ax,3 ;определим состояние мышки
P_B> int 33h
P_B> mov ah,9h ;выводим строку на экран
P_B> mov dx,offset Message_1
P_B> int 21h
;Внутри прерываний сообщения лучше выводить функциями биос - это благоприятно скажется на повторной входимости
P_B> pop dx
P_B> pop es
P_B> retf ; выход из обработчика - команда RETF
;Ну так дело не пойдет - флаги остались на стеке
P_B> call dword ptr cs:[Int_33_Real]
; не вижу как сюда попадет управление?
P_B> pop dx
P_B> pop ds
P_B> iret ; Выходим из прерывания
P_B> Int_33_Real dd ? ;Переменная для хранения адреса "int 33h"
P_B> Message_1 db 'Вы нажали левую кнопку мышки$'
P_B> Int_33_proc endp
P_B>Init:
P_B> mov ah,35h ;Показывает адрес прерывания
P_B> mov al,33h ;Указывает номер прерывания
P_B> int 21h
P_B> mov word ptr [Int_33_Real],dx ;показываем куда мы это все сохроняли
P_B> mov word ptr [Int_33_Real]+2,ds
P_B> mov ah,25h ;Установим вектор прерывания
P_B> mov al,33h
P_B> mov dx,offset Int_33_proc
P_B> int 21h
P_B> popf
P_B> int 20h
P_B> end Begin
P_B>
P_B>Помогите мне разобратся в чем я мог ошибится
P_B>Что должна была делать программа:
P_B>1.Мы её запускаем.
P_B>2.При нажатие на левую кнопку мыши она должна была выводить сообщение что 'Нажата левая кнопка мыши $'
P_B>3.Все
P_B>а работает она так ( по крайне мере у меня оТна так работает ).
P_B>При её запуске в Дос навигаторе мышь исчезает(верней курсор невидать) , просто отключается (все нету её больше) где могла быть ошибка подскажите, я дня 3 сидел думал думал так не че не надумал решил обратится к вам.
P_B>P.S. Позор мне товарищи позор, написал прогу а не могу понять что к чему в ней =(((((
P_B>И если ко нить будет что небуть высказывать по поводу моей программы (я иммею в виду ошибки ) если можно то поконкретней изъесняйтесь. тоесть не так Например: Ты облажался в строке (6) , а так, ты облажался потому что ......
P_B>Заранее спасибо
Здравствуйте, Pro_BD, Вы писали:
P_B> У меня маленькая проблемма написал программу, а она работает не коректно ( не так как надо )
P_B>вот код программы:
P_B>P_B>.model tiny
P_B>.code
P_B>org 100h
P_B>Begin:
P_B> jmp Init ;метка
P_B> Int_33_proc proc ;наш обрабочик
P_B> pushf ;сохраним все =)
P_B> push ds
P_B> push dx ;сохраним регистры
P_B> push es
P_B> push dx
P_B> mov ah,0Fh ; получим текущие состояние дисплея
P_B> int 10h
P_B> mov ax,0 ;инициализация мышки
P_B> int 33h
P_B> mov ax,1 ; покажем курсор
P_B> int 33h
P_B> mov ax,000Ch ;установим обрабочик событий
P_B> mov cx,0002h ;нажатие левой кнопки mouse'a
P_B> mov dx,offset Mouse_Ok ; адрес нашего обрабочика
P_B> int 33h
P_B> mov ax,000Ch
P_B> mov cx,0000h ;удалить обрабочик
P_B> int 33h
P_B> iret ; выход
P_B>Mouse_Ok:
P_B> mov ax,3 ;определим состояние мышки
P_B> int 33h
P_B> mov ah,9h ;выводим строку на экран
P_B> mov dx,offset Message_1
P_B> int 21h
P_B> pop dx
P_B> pop es
P_B> retf ; выход из обработчика - команда RETF
P_B> call dword ptr cs:[Int_33_Real]
P_B> pop dx
P_B> pop ds
P_B> iret ; Выходим из прерывания
P_B> Int_33_Real dd ? ;Переменная для хранения адреса "int 33h"
P_B> Message_1 db 'Вы нажали левую кнопку мышки$'
P_B> Int_33_proc endp
P_B>Init:
P_B> mov ah,35h ;Показывает адрес прерывания
P_B> mov al,33h ;Указывает номер прерывания
P_B> int 21h
P_B> mov word ptr [Int_33_Real],dx ;показываем куда мы это все сохроняли
P_B> mov word ptr [Int_33_Real]+2,ds
P_B> mov ah,25h ;Установим вектор прерывания
P_B> mov al,33h
P_B> mov dx,offset Int_33_proc
P_B> int 21h
P_B> popf
P_B> int 20h Я думаю в этой строке int 20h надо заменить на int 27h
P_B> end Begin
P_B>
int 20h — выход из программы
int 27h — выход из программы но оставить ее резидентно
в вашей версии вы установили свой обработчик после чего вышли из программы и освободили память
которую занимал обработчик.
После загрузки следующей программы ваш обработчик сотрется, поведение машины не продсказуемо.