OS专题-开始编写32位打印函数

OS专题-开始编写32位打印函数

弄了这么长时间的16位实模式,现在我们要开始使用32位模式了,它们的主要差别在于32位模式允许我们使用32位寄存器和内存寻址、受保护的内存、虚拟内存和其他优势,但是我们会丢失 BIOS 提供的中断向量表,并且我们需要编写GDT。

全局描述表(GDT Global Descriptor Table):在保护模式下一个重要的数据结构。

现在我们开始操作VGA显存,因为之前的ISR已经不能使用,我们只能从显存入手,VGA显存的地址是从0xb8000开始的,它也存在一种文本模式,这样我们就可以避免直接像素了。访问$80 * 25$网格上的字符的工时如下:

$$
address = 0xb8000 + 2 * (row * 80 + col)
$$

每个字符占两个字节(一个是ASCII码值,一个是颜色配置),我们来写一下对应的打印函数,在lib文件夹中新建32_print.asm,代码如下:

[bits 32] ; 开启32位保护模式

; 常量定义,定义了VGA在内存中的起始位置
VIDEO_MEMORY equ 0xb8000
WHITE_ON_BLACK equ 0x0f ; 每个字符的颜色常量

print_string_pm:
    pusha
    mov edx, VIDEO_MEMORY

print_string_pm_loop:
    mov al, [ebx] ; [ebx] 是字符串输出地址
    mov ah, WHITE_ON_BLACK

    cmp al, 0 ; 判断字符串结尾\0
    je print_string_pm_done

    mov [edx], ax ; 在显存中存储字符+属性
    add ebx, 1 ; 下一个字符
    add edx, 2 ; 下一个显存位置

    jmp print_string_pm_loop

print_string_pm_done:
    popa
    ret

现在先理解就好,因为我们还没有编写GDT并真正进入保护模式,所以暂时无法运行查看效果。


OS专题-开始编写32位打印函数
https://blog.cikaros.top/doc/44b6e221.html
作者
Cikaros
发布于
2022年9月23日
许可协议