我正在组装一个玩具操作系统,从保护模式切换回实模式时遇到问题。我已成功切换到保护模式,称为将文本写入 [0xb8000] 视频内存的内核,返回给调用者并(可能)切换回实模式。我正在尝试从实模式使用 bios 中断,因此我不必编写自己的设备驱动程序。
然而,在切换回实模式后似乎不会执行中断。它们不会像在保护模式下那样使系统崩溃,所以我想我是在实模式下。
minrep.asm(引导加载程序)
boot.header:
[BITS 16]
[ORG 0x7c00]
mov ax, cs
mov ds, ax
xor ax, ax
mov ds, ax
cli
mov ss, ax
mov sp, 0x7c00
sti
call main
jmp $
disk.read_sectors:
reset:
xor ax,ax
int 0x13
jc reset
floppy:
xor bx,bx
mov ah,0x2
mov al, [esp+6]
mov cx,[esp+4]
mov dh,0x0
mov dl, 0x80
mov bx, ds
mov es, bx
mov bx, [esp+2]
int 0x13
jc error
mov ax, 0
ret
error:
mov ax, 1 …Run Code Online (Sandbox Code Playgroud) 我想在 NASM 中有一个中断,它调用的不是硬编码中断而是 int。在一个寄存器中。给你一个例子:
mov al, 0x10
int al ; you can't do this for some reason
Run Code Online (Sandbox Code Playgroud)
因此,如果我将 0x10 存储在寄存器 al 中,那么我可以根据该寄存器中的内容调用中断。
有什么办法可以做到这一点吗?
当我的页面错误处理程序中断被调用时(它应该挂起系统),在调用之前有一些变量被推送到堆栈中。我启用了虚拟内存,当我设置一个无效的堆栈指针(esp)并且 int14 处理程序被调用时,它会立即导致另一个页面错误等等。我应该如何解决这种情况?
我的 int14 代码:
isr14:
; interrupt handler for isr14
jmp $
iretd
Run Code Online (Sandbox Code Playgroud)
导致它中断的代码:
mov esp, 0x1000 ; 0x1000 is not mapped in the VM directory
push dword 'A'
jmp $
Run Code Online (Sandbox Code Playgroud)
我的 IDT 表的部分:
irq14:
dw isr14
dw 0x0008
db 0x00
db 10101110b
dw 0x0000
irq15:
........
Run Code Online (Sandbox Code Playgroud)