Assembly 实模式,中断向量替换崩溃
我试图了解更多关于系统如何在上面所有漂亮的图形下真正工作的信息。因此,我目前正在使用BIOS启动时加载的512字节内存,我想目前还不能称之为引导加载程序。无论如何,我正在替换一个中断向量,但它有问题。更换interupt 09h(键盘)后,其功能正常,按键时输出“内存混乱”。但是什么也没有。之后每次按键都不起任何作用。我不知道系统是否崩溃,或者我的处理程序是否丢失了一些内容,下面是代码:Assembly 实模式,中断向量替换崩溃,assembly,x86,bootloader,interrupt-handling,Assembly,X86,Bootloader,Interrupt Handling,我试图了解更多关于系统如何在上面所有漂亮的图形下真正工作的信息。因此,我目前正在使用BIOS启动时加载的512字节内存,我想目前还不能称之为引导加载程序。无论如何,我正在替换一个中断向量,但它有问题。更换interupt 09h(键盘)后,其功能正常,按键时输出“内存混乱”。但是什么也没有。之后每次按键都不起任何作用。我不知道系统是否崩溃,或者我的处理程序是否丢失了一些内容,下面是代码: jmp start times 100 db 0 ; Cleared space for stack st
jmp start
times 100 db 0 ; Cleared space for stack
start:
xor ax, ax
mov ax, start
sub ax, 80
mov sp, ax
mov al, 0x09 ; Interupt number
mov bl, 4
mul bl
mov bx, ax
xor ax, ax
mov es, ax
mov [es:bx], word prints ; My interupt handler
add bx, 2
mov [es:bx], word 0x00
bloader:
jmp bloader
prints:
cli
push ax
push bx
push si
mov si, msg ; Message to print
mov bl, 0x07
mov bh, 0x00
printnb:
lodsb ; Grab byte from message
cmp al, 0 ; End of message
je printf
mov ah, 0x0E
int 0x10 ; Print byte
jmp printnb
printf:
mov al, 0x20
out 0x20, al ; Inform interupt controller interupt has been handled
pop si
pop bx
pop ax
sti
iret ; Interupt return
msg db "Memory messing",0
times 510 - ($ - $$) db 0
dw 0xAA55
这只是一个猜测,但问题可能是您正在从int 9h处理程序调用int 10h。尝试直接写入屏幕内存(只需在0b800h:0处增加字节,并检查屏幕左上角的字符)。如果每次按键都递增,那么就不应该从int 9h调用int 10h。我已经很久没有处理键盘中断了,但我认为您缺少的是处理键盘硬件,这样它就可以清除中断条件并准备生成另一个中断 比如:
in al, 60h ; Read input buffer
可能就这么多了
如果有机会的话,我会看看我在编写键盘驱动程序时是否有旧的笔记或代码。我的猜测(我从未编写过键盘中断处理程序)是,您还需要与键盘硬件对话,以检索击键(否则键盘将不知道何时生成下一个中断).我发现了另一个问题。如果我们使用两条单独的mov指令为ISR设置一个新的中断向量,则可能在这两条mov指令之间发生中断,然后它从中断向量中获取地址,其中一部分是旧位置,另一部分是ISR的新位置。但是在这个位置上没有ISR,没有中断结束指令,也没有iret指令 为了防止此类不良事件,我们必须在这些移动指令周围放置cli和sti,以设置新的中断向量
cli
mov [es:bx], word prints ; My interupt handler
mov [es:bx+2], word 0x00
sti
德克这把它修好了。非常感谢。