Доброго времени суток.
Опишу задание в целом: Надо написать резидента, который копирует дамп памяти(параметр вводится через диалоговое окно) в файл(указан параметром в командной строке) на жесткий диск Походу надо сделать свои обработчики 21h и 09h прерываний.
В целом есть написанный код обработчиков и инициализирующей части, но при установке нового обработчика прерывание 21h возникает пролема: Код на который "ссылается" указатель не соответствует тому который введен в исходнике (как я понимаю проблема с выравниванием) Ниже приведен код функции initalize и int21_handler[code=asm]
| Код | initialize proc far ... @@Not_Resident: mov ax, 3509h ; Сохраняем адрес старого обработчика int 21h ; прерывания 09h в old_Int09h mov word ptr old_int09h, bx mov word ptr old_int09h+2, es
mov ax, 352Fh ; Сохраняем адрес старого обработчика int 21h ; прерывания 2Fh в old_Int2Fh mov word ptr old_int2Fh, bx mov word ptr old_int2Fh+2, es
mov ax, 3521h ; Сохраняем адрес старого обработчика int 21h ; прерывания 21h в old_Int21h mov word ptr old_int21h, bx mov word ptr old_int21h+2, es
mov ax, 2509h ; Устанавливаем новый обработчик mov dx, offset int09h_handler ; прерывания 09h int 21h mov ax, 252Fh ; Устанавливаем новый обработчик mov dx, offset int2Fh_handler ; прерывания 2Fh int 21h mov ax, 2521h ; Устанавливаем новый обработчик mov dx, offset int21h_handler ; прерывания 21h int 21h mov ah, 09h ; Выводим сообщение об успешном запуске mov dx, offset Loaded_OK int 21h mov dx, offset initialize ; Делаем программу резидентной int 27h
|
| Код | int21h_handler proc far pushf ; Сохранить регистр флагов cmp ah, 08h ; Если функция лежит в диапазоне 0Bh-0FFh jb @@int21h_active_setup ; то передаем управление старому обработчику прерывания cmp ah, 0FFh ; int 21h ja @@int21h_active_setup jmp dword ptr cs:old_int21h
@@int21h_active_setup: inc byte ptr int21h_active ; Устанавливаем флаг активности 21h прервыания call dword ptr cs:old_int21h ; Вызов старого обработчика (call) cmp byte ptr wait_call, 1 ; Если не установлен флаг отложенного вызова jne @@exit_int21h ; то выйти cmp byte ptr active_flag, 1 ; Если функция уже выполняется je @@exit_int21h ; то выйти inc byte ptr active_flag ; Установить флаг выполнения функции call Main ; выполнить функцию dec byte ptr active_flag ; Сбросить флаг выполнения функции dec byte ptr int21h_active ; Сброситьт флаг активности 21h прерывания @@exit_int21h: popf iret old_int21h dw ?,? int21h_handler endp
|
|