; ; Mad Mouse ; Автор этого ужасно стремного кода: Sourcerer, 23.04.2010 ; popovpa (29.05.2012) ; 1. Изменение логики работы программы. ; 2. Добавлено "перескакивание" сверху и низу :) ; 3. Оптимизация кода. ; use32 ; транслятор, использующий 32-х разрядные команды org 0x0 ; базовый адрес кода, всегда 0x0 db 'MENUET01' ; 1. идентификатор исполняемого файла (8 байт) dd 0x01 ; 2. версия формата заголовка исполняемого файла dd START ; 3. адрес, на который система передаёт управление ; после загрузки приложения в память dd I_END ; 4. размер приложения dd 0x100000 ; 5. объём необходимой приложению памяти ; можно обращаться к памяти в диапазоне от 0x0 ; до значения, определённого здесь dd 0x100000 ; 6. вершина стека в диапазоне памяти, указанном выше dd 0x0 ; 7. указатель на строку с параметрами. ; если после запуска неравно нулю, приложение было ; запущено с параметрами из командной строки dd 0x0 ; 8. указатель на строку, в которую записан путь, ; откуда запущено приложение ;--------------------------------------------------------------------- ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- ;--------------------------------------------------------------------- START: ;адрес начала программы mov eax,14 ;функция 14 - получить размер экрана int 0x40 mov ebx,eax shl ebx,16 shr ebx,16 mov edi,ebx ;сохраним у shr eax,16 ;сдвигаем eax вправо на 16 - получаем x mov esi,eax ;сохраним x ;--------------------------------------------------------------------- ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- ;--------------------------------------------------------------------- still: ;организуем паузу в 100 мс mov eax,5 ;функция 5 - пауза, в ebx время в мс mov ebx,1 ;задержка 100 мс int 0x40 ;получаем координаты курсора mov eax,37 ;функция 37 - работа с мышью xor ebx,ebx ;подфукция 0 - координаты мыши ;относительно экрана int 0x40 mov ebx,eax ;запоминаем координаты shr eax,16 ;теперь у нас только x. нужен и y mov ecx,eax ;запоминаем x shl ebx,16 ;сдвинем влео на 16 shr ebx,16 ;сдвинемв право на 16, у нас есть у ;------------------------------------------------------------------------------ ;в esi и edi координаты размера экрана X и Y соответсвенно ;в ecx и ebx координаты курсора X и Y соответвенно ;------------------------------------------------------------------------------ ;сравнение координат x test ecx,ecx ;равна 0? jz left_border ;переход к обработке у левого края cmp ecx,esi ;равна ширине экрана? jz right_border ;переходим к обработке у правого края ;сравнение координат y test ebx,ebx ;равна 0? jz top_border ;если да значит курсор вверху cmp ebx,edi ;равна высоте экрана? jz bottom_border ;переход к обработке у нижнего края jmp still ;иначе ничего делать не нужно left_border: mov edx,esi ;в edx имеем ширину экрана dec edx ;уменьшим на 1 shl edx,16 ;теперь edx=(x-1)*65536 add edx,ebx ;а теперь edx=(x-1)*65536+y mov eax,18 ;функция 18: установить настройки мыши mov ebx,19 ;подфункция 19 mov ecx,4 ;подподфункция 4: установить положение ;курсора int 0x40 jmp still ;отдыхаем right_border: ;курсор у правого края xor edx,edx inc edx ;edx=1 shl edx,16 ;edx = 1*65536 add edx,ebx ;edx=1*65536+y mov eax,18 ;функция 18: установить настройки мыши mov ebx,19 ;подфункция 19 mov ecx,4 ;подподфункция 4: установить положение ;курсора int 0x40 jmp still ;отдыхаем top_border: ;курсор у верхнего края mov edx,ecx ;Х координата курсора shl edx,16 ;теперь edx=(x)*65536 add edx,edi ;а теперь edx=(x)*65536+y dec edx ;а теперь edx=(x)*65536+(у-1) mov eax,18 ;функция 18: установить настройки мыши mov ebx,19 ;подфункция 19 mov ecx,4 ;подподфункция 4: установить положение ;курсора int 0x40 jmp still ;и отдыхаем bottom_border: ;курсор у нижнего края mov edx,ecx ;edx=ecx x координата курсора shl edx,16 ;edx = х*65536 ;у координата равна 0 mov eax,18 ;функция 18: установить настройки мыши mov ebx,19 ;подфункция 19 mov ecx,4 ;подподфункция 4: установить положение ;курсора int 0x40 jmp still ;и отдыхаем I_END: ; метка конца программы