Нужна помощь по ассемблеру...
May. 7th, 2005 11:33 am![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Я пишу программу-резидент... Но она постоянно выдаёт сообщение о том, что выполнена недопустимая инструкция... Помогите найти ошибку....
Я думаю ошибки где-то в процедурах обработки прерываний от таймера (Int1Ch_proc) и обработки 21-ого прерывания.... Помогите найти ошибку...
Вот процедуры из моей программы -
Int_21h_proc proc far
test cs:[MyFlags],bActivityFlag
jnz Go_21h
pushf
or cs:[MyFlags],bActivityFlag
cmp ax,9889h ;Проверка на повторную загрузку
jne Goo_21h
xchg ah,al ;Если мы уже в перехватывает прерывание, то
popf
and cs:[MyFlags], (not bActivityFlag)
iret ;меняем регистры
Goo_21h:
popf
and cs:[MyFlags], (not bActivityFlag)
jmp dword ptr cs:[Int_21h_vect] ;передаем управление
;оригинальному обработчику 21h
Go_21h:
jmp dword ptr cs:[Int_21h_vect] ;передаем управление
;оригинальному обработчику 21h
Int_21h_vect dd ? ;адрес оригинального абработчика
Int_21h_proc endp
Int_1Ch_proc proc far
pushf
call dword ptr cs:[Int_1Ch_vect] ;вызов оригинального обработчика
test cs:[MyFlags],bActivityFlag ;проверим флаг активизации резидента
jz Not_active
iret ;активирован выходим
Not_active:
test cs:[MyFlags],bCallFlag ;проверим флаг вызова резидента
jnz callVideo
or cs:[MyFlags],bActivityFlag ;установим флаг активации резидента
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
call MyResident ;вызываем резидентную процедуру
and cs:[MyFlags], (not bActivityFlag) ; сбросим флаг активации
iret ;выходим
CallVideo:
or cs:[MyFlags],bActivityFlag ;установим флаг активации резидента
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
call Smena_Stranici ;вызываем резидентную процедуру
and cs:[MyFlags], (not bCallFlag) ; сбросить флаг вызова
and cs:[MyFlags], (not bActivityFlag) ; сбросим флаг активации
iret ;выходим
Int_1Ch_vect dd ? ;адрес оригинального абработчика
Int_1Ch_proc endp
Int_10h_proc proc far
pushf
or cs:[MyFlags],b10hFlag ;Устанавливаем флаг VideoBios
test cs:[MyFlags],bActivityFlag ;проверяем флаг активации резидента
jz No_Active
cmp ah,05h
jne No_Active
mov ax,0501h
and cs:[MyFlags],(not b10hFlag)
No_Active:
popf
call dword ptr cs:[Int_10h_vect] ;вызов оригинального обработчика
Int_10h_vect dd ? ;адрес оригинального абработчика
Int_10h_proc endp
Int_09h_proc proc far
pushf
test cs:[MyFlags],bActivityFlag ;проверим флаг активации резидента
jnz Exit_09h ;если активирован - выходим из обработчика
pusha ;Сохраним регистры в стеке...
in al,60h ;Получим СКАН-КОД нажатой клавиши.
mov ah,al
and al,7fh ;al - чистый скан-код без признака нажатия
cmp al,03h ; 2?
jnz Exit_09h
in al, 61h ;посылаем подтверждение контроллеру
push ax ;клавиатуры
or al, 80h
out 61h,al
pop ax
out 61h,al
or cs:[MyFlags], bCallFlag ;установим флаг вызова
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
popa
popf
iret
Exit_09h:
popf
jmp dword ptr cs:[Int_09h_vect] ;вызов оригинального обработчика
Int_09h_vect dd ? ;адрес оригинального абработчика
Int_09h_proc endp
Smena_Stranici proc
pushf
or cs:[MyFlags],b10hFlag ;Устанавливаем флаг VideoBios
test cs:[MyFlags],bActivityFlag ;проверяем флаг активации резидента
jz No_Activee
mov ax,0500h
and cs:[MyFlags],(not b10hFlag)
No_Activee:
popf
call dword ptr cs:[Int_10h_vect] ;вызов оригинального обработчика
ret
Smena_Stranici endp
MyResident proc
pusha
push es
push ds
push 0b800h
pop ds
push 0b900h
pop es
xor si,si
mov cx,2000
Next_sym:
mov di,si
lodsw
cmp al,' '
je Next_byte
;mov ah,0fh
mov al,1
stosw
Next_byte:
loop Next_sym
pop ds
pop es
popa
ret
MyResident endp
Я думаю ошибки где-то в процедурах обработки прерываний от таймера (Int1Ch_proc) и обработки 21-ого прерывания.... Помогите найти ошибку...
Вот процедуры из моей программы -
Int_21h_proc proc far
test cs:[MyFlags],bActivityFlag
jnz Go_21h
pushf
or cs:[MyFlags],bActivityFlag
cmp ax,9889h ;Проверка на повторную загрузку
jne Goo_21h
xchg ah,al ;Если мы уже в перехватывает прерывание, то
popf
and cs:[MyFlags], (not bActivityFlag)
iret ;меняем регистры
Goo_21h:
popf
and cs:[MyFlags], (not bActivityFlag)
jmp dword ptr cs:[Int_21h_vect] ;передаем управление
;оригинальному обработчику 21h
Go_21h:
jmp dword ptr cs:[Int_21h_vect] ;передаем управление
;оригинальному обработчику 21h
Int_21h_vect dd ? ;адрес оригинального абработчика
Int_21h_proc endp
Int_1Ch_proc proc far
pushf
call dword ptr cs:[Int_1Ch_vect] ;вызов оригинального обработчика
test cs:[MyFlags],bActivityFlag ;проверим флаг активизации резидента
jz Not_active
iret ;активирован выходим
Not_active:
test cs:[MyFlags],bCallFlag ;проверим флаг вызова резидента
jnz callVideo
or cs:[MyFlags],bActivityFlag ;установим флаг активации резидента
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
call MyResident ;вызываем резидентную процедуру
and cs:[MyFlags], (not bActivityFlag) ; сбросим флаг активации
iret ;выходим
CallVideo:
or cs:[MyFlags],bActivityFlag ;установим флаг активации резидента
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
call Smena_Stranici ;вызываем резидентную процедуру
and cs:[MyFlags], (not bCallFlag) ; сбросить флаг вызова
and cs:[MyFlags], (not bActivityFlag) ; сбросим флаг активации
iret ;выходим
Int_1Ch_vect dd ? ;адрес оригинального абработчика
Int_1Ch_proc endp
Int_10h_proc proc far
pushf
or cs:[MyFlags],b10hFlag ;Устанавливаем флаг VideoBios
test cs:[MyFlags],bActivityFlag ;проверяем флаг активации резидента
jz No_Active
cmp ah,05h
jne No_Active
mov ax,0501h
and cs:[MyFlags],(not b10hFlag)
No_Active:
popf
call dword ptr cs:[Int_10h_vect] ;вызов оригинального обработчика
Int_10h_vect dd ? ;адрес оригинального абработчика
Int_10h_proc endp
Int_09h_proc proc far
pushf
test cs:[MyFlags],bActivityFlag ;проверим флаг активации резидента
jnz Exit_09h ;если активирован - выходим из обработчика
pusha ;Сохраним регистры в стеке...
in al,60h ;Получим СКАН-КОД нажатой клавиши.
mov ah,al
and al,7fh ;al - чистый скан-код без признака нажатия
cmp al,03h ; 2?
jnz Exit_09h
in al, 61h ;посылаем подтверждение контроллеру
push ax ;клавиатуры
or al, 80h
out 61h,al
pop ax
out 61h,al
or cs:[MyFlags], bCallFlag ;установим флаг вызова
mov al, 20h ;сбросим контроллер прерываний
out 20h, al
popa
popf
iret
Exit_09h:
popf
jmp dword ptr cs:[Int_09h_vect] ;вызов оригинального обработчика
Int_09h_vect dd ? ;адрес оригинального абработчика
Int_09h_proc endp
Smena_Stranici proc
pushf
or cs:[MyFlags],b10hFlag ;Устанавливаем флаг VideoBios
test cs:[MyFlags],bActivityFlag ;проверяем флаг активации резидента
jz No_Activee
mov ax,0500h
and cs:[MyFlags],(not b10hFlag)
No_Activee:
popf
call dword ptr cs:[Int_10h_vect] ;вызов оригинального обработчика
ret
Smena_Stranici endp
MyResident proc
pusha
push es
push ds
push 0b800h
pop ds
push 0b900h
pop es
xor si,si
mov cx,2000
Next_sym:
mov di,si
lodsw
cmp al,' '
je Next_byte
;mov ah,0fh
mov al,1
stosw
Next_byte:
loop Next_sym
pop ds
pop es
popa
ret
MyResident endp
no subject
Date: 2005-05-09 04:57 pm (UTC)