вообщем...надо поменять поменять их местами и остаться резидентом при этом =/ помогите пожайлуста, а то лабу надо до вторника сдать =/ мне б теории по этому хотябы... хотя, если напишете полностью код, буду очень признателен...тем более мне кажется, что такой исходник у многих есть )
я вот что-т нашёл =/ но оно не пашет Code (Text): .model tiny ; данные, код, стек находятся в одном сегменте .code ; сегмент кода, данных, стека org 2Ch ; смешение от начала программы, где хранится EnvSeg dw ? ; адрес копии окружения DOS org 100h ; выделение памяти для COM-программы start: jmp main ; точка входа в программу - переход на Main hw_reset9: retf ; подпрограмма аппаратного сброса для 9h Int9_Handler proc far ; начало нового обработчика прерывания Int 9h jmp short body_int9h ; переход к основному блоку обработчика oldint9h dd ? ; здесь будет записан адрес старого обработчика dw 424Bh ; сигнатура ISP (по AMIS) db 00h ; это дополнительный обработчик аппаратного ; прерывания jmp hw_reset9 ; подпрограмма аппаратного сброса db 7 dup (0) ; зарезервировано под ISP-блок body_int9h: ; основной блок обработчика in al, 60h ; в AL значение из порта 60h (скан-код клавиши) cmp al, 1Ch ; если это скан-код клавиши Enter je write_Enter ; то перейти к обработчику write_Enter cmp al, 01h ; иначе, если это скан-код клавиши Esc je write_Esc ; то перейти к обработчику write_Esc jmp dword ptr cs:oldint9h ; иначе перейти на старый обработчик write_Enter: ; обработка нажатия клавиши Enter mov ah, 5 ; функция, которая помещает символ в буфер ; клавиатуры mov cl, 1Bh ; ASCII-код клавиши Esc mov ch, 0 ; скан-код клавиши (0 => он не нужен) int 16h ; поместить символ в буфер клавиатуры jmp continue_int ; завершить обработчик write_Esc: ; обработка нажатия клавиши Esc mov ah, 5 ; функция, которая помещает символ в буфер ; клавиатуры mov cl, 0Dh ; ASCII-код клавиши Enter mov ch, 0 ; скан-код клавиши (0 => он не нужен) int 16h ; поместить символ в буфер клавиатуры continue_int: ; завершение обработчика (сброс клавиатуры) in al, 61h ; сохранить состояние клавиатуры в AL push ax ; сохранить AX в стеке or al, 80h ; 7-й бит равен 1 (заблокировать клавиатуру) out 61h, al ; установить новое состояние клавиатуры pop ax ; восстановить значение AX из стека out 61h, al ; разблокировать клавиатуру (т.к. 7-й бит в AL - 0) mov al, 20h ; сообщить контролеру прерываний, что обработка out 20h, al ; прерывания завершилась iret ; восстановить флаги и выйти из обработчика Int9_Handler endp ; конец обработчика hw_reset2D: retf ; подпрограмма аппаратного сброса для 2Dh Int2D_Handler proc far ; начало нового обработчика прерывания 2Dh jmp short body_int2D ; переход к основному блоку обработчика oldint2Dh dd ? ; здесь будет записан адрес старого обработчика dw 424Bh ; сигнатура ISP (по AMIS) db 00h ; это обработчик программного прерывания jmp hw_reset2D ; подпрограмма аппаратного сброса db 7 dup (0) ; зарезервировано под ISP-блок body_int2D: ; основной блок обработчика db 80h, 0FCh ; код команды CMP AH prog_id db ? ; второй аргумент команды CMP, т.е. ID программы je it_my_prog ; если результат сравнения отрицателен jmp dword ptr cs:oldint2Dh ; то перейти на старый обработчик it_my_prog: ; если положителен, то перейти в эту часть программы cmp al, 01h ; функции 01 и выше jae int2D_no_sup ; не поддерживаются, т.е. доступна только функция 00 mov al, 0FFh ; результат обработки FF, т.е. такой ID занят mov cx, 0100h ; обработчик должен вернуть версию программы – 1.0. push cs pop dx ; поместить в DX адрес сегмента кода программы mov di, offset AMIS_sign ; и описание программы по спецификации AMIS iret ; а потом выйти из обработчика int2D_no_sup: mov al, 00h ; результат 00, т.е. функция не поддерживается iret ; выход из обработчика Int2D_Handler endp ; конец обработчика AMIS_sign db "***PM***" ; 8 байт - имя автора по спецификации AMIS db "Replace " ; 8 байт – название программы db "Replace Enter and Esc button",0 ; описание программы (<= 64 байта) SetMyInt proc near ; процедура установки новых обработчиков для ; прерываний 9h и 2Dh push es ; сохранить значение ES в стеке mov ax, 3509h ; функция, возвращающая адрес обработчика 9h в ; ES:BX int 21h ; получить адрес mov word ptr oldint9h, bx ; записать смешение в oldint9h mov word ptr oldint9h+2, es ; записать сегмент в oldint9h mov ax, 352Dh ; функция, возвращающая адрес обработчика 2Dh в ; ES:BX int 21h ; получить адрес mov word ptr oldint2Dh, bx ; записать смешение в oldint2Dh mov word ptr oldint2Dh+2, es ; записать сегмент в oldint2Dh pop es ; восстановить значение ES mov ax, 2509h ; функция установки нового обработчика 9h mov dx, offset Int9_Handler ; адрес обработчика в DX int 21h ; установить обработчик mov ax, 252Dh ; функция установки нового обработчика 9h mov dx, offset Int2D_Handler ; адрес обработчика в DX int 21h ; установить обработчик ret ; выход из процедуры SetMyInt endp ; конец процедуры Main proc near ; главная процедура mov ax, cs ; поместить значение CS в AX mov ds, ax ; поместить значение AX в DS mov ah, 9h ; функция вывода строки mov dx, offset Himes ; в DX адрес строки приветствия int 21h ; вывести строку mov ah, -1 ; поиск ID начать с FF (-1) more: mov al, 00h ; функция проверки наличия программы в памяти int 2Dh ; проверить AH cmp al, 00h ; если идентификатор AH не свободен jne not_free ; то перейти на метку not_free mov byte ptr prog_id, ah ; иначе запомнить текущий ID jmp short next_id ; и проверить следующий not_free: mov es, dx ; проверить наш ли это обработчик mov si, offset AMIS_sign mov cx, 16 repe cmpsb ; при помощи побайтового сравнении сигнатур jcxz already_loaded ; если сравнение прошло удачно, т.е. CX = 0, то это ; наш обработчик => выйти next_id: dec ah ; уменьшить AH на 1 jnz more ; если не достигнут 0, то продолжить поиск free_found: cmp byte ptr prog_id, 0 ; если не найден свободный ID, то je no_more ; выйти call SetMyInt ; иначе установить новые обработчики mov ah, 9h ; функция вывода строки о загрузке программы mov dx, offset ProgLoadMsg ; в DX адрес строки int 21h ; вывести строку mov ah, 1h ; функция ожидания нажатия клавиши int 21h mov ah, 49h ; функция, освобождающая окружение DOS mov es, word ptr EnvSeg ; в ES адрес окружения int 21h ; освободить окружение mov dx, offset SetMyInt ; последний байт резидентной части программы в DX int 27h ; выйти и остаться резидентом already_loaded: mov ah, 9h ; функция вывода строки mov dx, offset AlreadyMsg ; в DX адрес строки int 21h ; вывести строку ret ; обычное завершение COM-программы no_more: mov ah, 9h ; функция вывода строки mov dx, offset NoMoreMsg ; в DX адрес строки int 21h ; вывести строку ret ; обычное завершение COM-программы Himes db "This program replace Enter and Esc key on your keyboard...", 0Dh, 0Ah,'$' ProgLoadMsg db "Program loaded to memory. Press any key to continue...", '$' AlreadyMsg db "Error. Program already loaded...",'$' NoMoreMsg db "Error. No free ID for you program...",'$' pop ds Main endp ; конец главной процедуры end start ; установка точки входа в программу