Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 重写中断向量表8086不会发生任何事情_Assembly_Operating System_Nasm_Interrupt_X86 16 - Fatal编程技术网

Assembly 重写中断向量表8086不会发生任何事情

Assembly 重写中断向量表8086不会发生任何事情,assembly,operating-system,nasm,interrupt,x86-16,Assembly,Operating System,Nasm,Interrupt,X86 16,我正在构建一个小型操作系统,这是对我自己的一个挑战。我在网上读到很多文章,说要覆盖中断向量表,需要更改0000的物理地址:中断号*4和0000:(中断号*4)+2。 我写下了一段代码,但当试图在虚拟机上运行它时,什么也没发生。你们中有谁能分享他们的知识,告诉我我错在哪里吗?这是我的代码: mov ax,0 mov es,ax mov ax,cs ;; set ax to the current segment mov [es:01a6h], ax ;; change 0000:(interrup

我正在构建一个小型操作系统,这是对我自己的一个挑战。我在网上读到很多文章,说要覆盖中断向量表,需要更改0000的物理地址:中断号*4和0000:(中断号*4)+2。 我写下了一段代码,但当试图在虚拟机上运行它时,什么也没发生。你们中有谁能分享他们的知识,告诉我我错在哪里吗?这是我的代码:

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 $
这是中断:

中断1:
MOV啊,09h
mov al,'c';;;它的作用是用红色写下字母c
mov bx,0004
MOV cx,1
int 10h
iret



我正在使用nasm和Oracle Virtual box。

显然要在中断内部使用中断,您需要使用sti打开中断标志,因为它会自动禁用。

显然要在中断内部使用中断,您需要使用sti打开中断标志,因为它在我的计算器中被自动禁用。请注意,这是我得到它之前的代码,我以前确实修复过它,但它无法帮助确保您的
组织设置正确。发一篇完整的文章。@Jester你能详细说明一下吗?我根本没用过org,因为我的操作系统的引导加载程序将它加载到ram的下一部分并跳转到它。我想我在这里中了大奖,我能从另一个中断中调用一个中断吗?
0x69*4=0x1a4
在我的计算器中。注意到这是我得到它之前的代码,我以前确实修复过它,但它无法确保您的
org
设置正确。发一篇完整的文章。@Jester你能详细说明一下吗?我根本没用过org,因为我的操作系统的引导加载程序会将它加载到ram的下一部分,然后跳转到它。我想我在这里中了头奖,我能从另一个中断中调用一个中断吗?这是不真实的。您需要使用STI打开外部中断以触发外部中断。您不需要打开中断来启动软件中断(如
int10h
)。出于好奇,问题中还有更多的代码。例如,您是否碰巧重新映射了PIC,以便将主PIC放置在中断0x68处?我的假设是,您曾经并且打算在每次按下键盘时使用
int10h
打印一个字符?我实际上是在构建自己的小型操作系统,我使用软件中断作为内核…这是不真实的。您需要使用STI打开外部中断以触发外部中断。您不需要打开中断来启动软件中断(如
int10h
)。出于好奇,问题中还有更多的代码。例如,您是否碰巧重新映射了PIC,以便将主PIC放置在中断0x68处?我的假设是,你有并且打算在每次按下键盘时使用
int10h
打印一个字符?我实际上是在构建自己的小型操作系统,我使用软件中断作为内核。。。