2012-03-05 3 views
3

인터프리터에 문제가 있습니다. 09h 새 Isr 포인터를 변경했습니다. 윈도우에서 디버그하면 키를 누를 때마다 인터럽트가 발생합니다. 그러나 VMWare에서는 한 번만 트리거되는 것으로 보입니다. 나는 DOS 6.22에서 테스트했고 똑같은 일이 발생했다. 이 같은후킹 Int 09h 인터럽트

내 코드 조회 :

MyIsr:
pusha
pushf
;tell PIC that interrupt has finished
mov al,0x20
out 0x20,al
popf
popa
iret


내가 PS/2와 같은 동일한 명령을 보낼 수 있습니다 내가 USB 키보드를 사용하는 경우?

+2

시도는 IVT에서 이전 ISR 포인터를 저장합니다. CALL하기 전에 PUSHF를 기억하십시오 : 이전 포인터를 사용하여 (int-call을 시뮬레이트하기 위해) –

+0

USB 키보드를 사용하면 Ps/2와 같은 명령을 보낼 수 있습니까? –

답변

1

작성중인 코드의 전체보기를 게시하지 않았으므로 여기에는 여러 가지 문제가있을 수 있습니다. 성취하고자하는 바를 정확하게 설명해 주시겠습니까?

ISR이 호출되어 처리되지 않으면 아무 것도 할 수 없으므로이를 염두에 두십시오. 인터럽트 벡터 테이블에 ISR을 설치하는 방법과 관련된 문제 일 수 있습니다.

리얼 모드에서
  • , 당신은 INT의 21H, AH = 25H와 함께 할 DJGPP에서, 당신은 INT의 21H 기능을 사용하거나 C 함수를 사용하여 (중 하나 DPMI 기능을 사용할 필요가
  • 보호 모드에서
  • . 참조 DPMI documentation
  • 메모리가 "페이징 아웃"될 수 있으므로 PM에서 실행 중일 때 ISR의 메모리를 잠글 필요가 있습니다. ISR에 필요합니다 (실행시 실제로 "알지 못하기"때문에 ISR에 필요함).

ISR은 다음과 같아야합니다.

IRQ를 보내고 :;
newInt9: 

enter 0,0 
push eax 

in al, 60h 
mov [raw_key], al 

mov al, 20h 
out 20h, al 

pop eax 
leave 
iret  

당신이 그것을 덮어 쓰고 ISR에서 대신 ACK의를 호출하기 전에 ENDPROC

+0

글쎄, 내가 리얼 모드 MS-DOS 6.22에서 일하고 있어요. 내가 USB 키보드를 사용하고 있는데 레거시 지원이 활성화되어 있습니다. 내 원래 함수에서 스택 프레임을 입력하고 떠날 필요가 없습니다. 나는 PS/2 키보드로 agian을 테스트 할 것이고 나는 결과를 말할 것이다. –