2017-03-14 12 views
1

나는 작은 OS를 직접 작성하고 있습니다. 인터럽트 벡터 테이블을 오버라이드하려면 0000의 물리적 주소를 변경해야한다는 온라인 기사를 많이 읽었습니다. 인터럽트 번호 * 4와 0000 : (인터럽트 번호 * 4) +2. 정확히 코드를 작성했지만 가상 시스템에서 실행하려고하면 아무 일도 일어나지 않습니다. 너희 중 누구도 지식을 공유하고 내가 뭘 잘못 생각하는지 말해 줄 수 있니?인터럽트 벡터 테이블을 무시합니다. 8086 아무 것도 발생하지 않습니다.

mov ax,0 
mov es,ax 
mov ax,cs ;; set ax to the current segment 
mov [es:01a6h], ax ;; change 0000:(interrupt number*4)+2 
mov ax,interrupt1 ;; set ax to the offset of the interrupt 
mov [es:01a4h], ax ;; change 0000:(interrupt number*4) 
int 69h 
jmp $ 

이 인터럽트는 다음과 같습니다 :

interrupt1: MOV ah,09h mov al,'c' ;;; its function is to write down the letter c in red mov bx,0004 MOV cx,1 int 10h iret

내가 사용하고 NASM과 오라클 가상 상자이 내 코드입니다. 내 계산에 자동으로

+0

'0x69 * 4 = 0x1a4' 사용할 수 없기 때문에 – Jester

+0

내가 이것을 알아 차리기 전에 이것이 코드라는 것을 알았습니다. 전에 고칠 수 있었고 도움이되지 못했습니다. –

+0

'org'가 올바르게 설정되어 있는지 확인하십시오. 전체 [mcve]를 게시하십시오. – Jester

답변

0

분명히, 당신은 STI를 사용하여 인터럽트 플래그 설정해야 인터럽트의 내부 인터럽트를 사용합니다.
+4

이것은 사실이 아닙니다. 화재가 발생하려면 외부 인터럽트를 _STI_로 외부 인터럽트를 켜야합니다. 소프트웨어 인터럽트를 시작하기 위해 인터럽트를 켜야 할 필요는 없다 (int 10h와 같은). –

+0

글쎄, sti 켜기 내 문제를 해결 그래서 모르겠어 .... –

+0

호기심에서 더 많은 질문에 코드입니다. 예를 들어 마스터 PIC가 인터럽트 0x68에 배치되도록 PIC를 재 매핑 한 적이 있습니까? 키보드를 누를 때마다 문자를 출력하기 위해'int 10h '를 사용하려고했다는 가정이있었습니다. –