如何在32位nasm组件中更改VGA



我试图在此处更改此代码中的VGA。人们说我可以使用INT 10H,但是,我会在虚拟框中出现错误。我想在这一点上以任何类型的VGA设置屏幕。我设法设置了Globa说明表,并写入80x25屏幕,但不初始化VGA。我该怎么做?

代码:

;===DATA============================================================================================
[bits   16]
[org    0x500]
jmp boot
;===VARIABLES======================================================================================
gdt_start:
    dd  0
    dd  0
    dw  0xFFFF
    dw  0
    db  0
    db  10011010b
    db  11001111b
    db  0
    dw  0xFFFF
    dw  0
    db  0
    db  10010010b
    db  11001111b
    db  0
gdt_end:
GDT_loader:
    dw  gdt_end - gdt_start - 1
    dd  gdt_start
;===CODE============================================================================================
load_GDT:
    pusha
    cli
    lgdt    [GDT_loader]
    sti
    popa
    ret
boot:
    ; Initalize the GDT
    ; Setup Stacks
    cli
    mov ax, 0x0000
    mov ss, ax
    mov sp, 0xFFFF
    sti
    ; Clear segment registers
    mov ax, 00h
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    call load_GDT
    cli
    mov eax, cr0
    or  eax, 1
    mov cr0, eax
    jmp 08h:kernel
;===VARIABLES=======================================================================================
bootingmessage      db "Starting up", 0x00
;===DATA============================================================================================
[bits   32]
;===CODE============================================================================================
kernel:
    mov ax, 10h
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov esp, 0x900000
    cli
    ;*****************
    ;Setup VGA Here
    ;*****************
    jmp $

我必须假设您在尝试使用int 0x10时获得错误(在VirtualBox中)的原因是您在受保护模式下(以及BIOS功能包括int 0x10期望在实际模式下执行)。否则,它应该在VirtualBox中完美工作。

替代方案是:

  • 在启动期间设置视频模式(在切换到受保护模式之前)

  • 使用Virtual8086模式(仍处于保护模式时执行真实模式代码)

  • 使用模拟器或解释器(在受保护模式下执行/解释真实模式代码)

  • 每次更改视频模式时,每次更改实际模式。这是一个非常糟糕的主意(由于未处于受保护模式时收到的IRQ,防止本地驾驶员无法正常运行)。

  • 写一个"通用VGA"的本地驱动程序。

  • 为每张不同的视频卡写一个本地驱动程序

对于所有这些选项;我会说第一个也是唯一的理智。其他的是浪费时间,从长期来看 - 启动后的任何取决于实际模式的BIOS功能的任何事物对现代(UEFI)计算机都不是有用的;VGA是如此丑陋(颜色深度和分辨率极差),以至于它使人们的眼睛流血(并假设"在硬件级别上兼容100%的VGA,而没有错误,怪癖或无兼容性",这是一个相对狡猾的假设。已经30多年了,而VGA只是为了向后兼容的目的而勉强容忍的真实视频卡。

更具体地;您的启动加载程序可能应在启动过程中设置视频模式(如果启动加载程序是为BIOS设计的,则使用VBE,如果启动加载程序是为UEFI设计的,则使用GOP或UGA),并告诉OS/内核相关的详细信息(帧的地址缓冲,水平和垂直分辨率,颜色深度和像素格式,每扫描线字节);操作系统应使用此信息提供"仅原始帧缓冲区"驱动程序(直到/除非它为特定的视频卡/GPU加载本机驱动程序)。

最新更新