小编DrC*_*ore的帖子

程序集进入保护模式并跳回实模式

我正在组装一个玩具操作系统,从保护模式切换回实模式时遇到问题。我已成功切换到保护模式,称为将文本写入 [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)

assembly kernel nasm bootloader x86-16

6
推荐指数
1
解决办法
266
查看次数

基于寄存器值的汇编调用中断

我想在 NASM 中有一个中断,它调用的不是硬编码中断而是 int。在一个寄存器中。给你一个例子:

mov al, 0x10
int al    ; you can't do this for some reason
Run Code Online (Sandbox Code Playgroud)

因此,如果我将 0x10 存储在寄存器 al 中,那么我可以根据该寄存器中的内容调用中断。

有什么办法可以做到这一点吗?

x86 assembly interrupt

1
推荐指数
1
解决办法
334
查看次数

由于无效的堆栈指针,无法调用程序集页面错误处理程序

当我的页面错误处理程序中断被调用时(它应该挂起系统),在调用之前有一些变量被推送到堆栈中。我启用了虚拟内存,当我设置一个无效的堆栈指针(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)

x86 assembly kernel interrupt virtual-machine

1
推荐指数
1
解决办法
85
查看次数

标签 统计

assembly ×3

interrupt ×2

kernel ×2

x86 ×2

bootloader ×1

nasm ×1

virtual-machine ×1

x86-16 ×1