如何在32位NASM程序集中更改VGA

时间:2017-09-05 05:47:46

标签: assembly nasm 32-bit

我正在尝试更改此代码中的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 $

1 个答案:

答案 0 :(得分:4)

我必须假设你在尝试使用int 0x10时遇到错误(在VirtualBox中)的原因是你在保护模式下执行它(以及包括{{1}的BIOS功能期望以实模式执行)。否则,它应该在VirtualBox中完美运行。

替代方案是:

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

  • 使用virtual8086模式(在保护模式下执行实模式代码)

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

  • 每次更改视频模式时,暂时切换到实模式。这是一个非常糟糕的主意(防止本机驱动程序因未在保护模式下接收到IRQ而正常运行)。

  • 为“通用VGA”编写本机驱动程序。

  • 为每个不同的视频卡编写本机驱动程序

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

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