2017-03-14 46 views
1

我正在建立一个小型操作系统作为我自己的一个挑战。我在网上阅读了很多文章,说要覆盖中断向量表,您需要更改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和Oracle虚拟框。

+0

'×69×4 = 0x1a4'禁用。 – Jester

+0

注意到这是我得到之前的代码,我之前修复过它并没有帮助 –

+0

确保您的'org'设置正确。发布完整[mcve]。 – Jester

回答

0

显然使用中断您需要打开使用STI中断标志中断里面,因为它是在我的计算器自动

+4

这是不真实的。您需要使用_STI_打开外部中断才能触发外部中断。您不需要打开中断来启动软件中断(如“int 10h”)。 –

+0

好吧,打开sti解决了我的问题,所以我不知道.... –

+0

出于好奇,有更多的问题中的代码。例如,您是否碰巧重新映射了PIC,使主PIC位于中断0x68?我的假设是,你有和你打算每次按下键盘时使用'int 10h'来打印一个字符? –