【问题标题】:How to change VGA in 32-bit NASM Assembly如何在 32 位 NASM 程序集中更改 VGA
【发布时间】:2018-02-13 07:46:24
【问题描述】:

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

【问题讨论】:

  • 我不知道“初始化 VGA”在这种情况下是什么意思。你的意思是set video mode
  • “我收到一个错误。”什么错误?

标签: assembly nasm 32-bit


【解决方案1】:

我必须假设当您尝试使用 int 0x10 时出现错误(在 VirtualBox 中)的原因是您在受保护模式下执行此操作(包括 int 0x10 在内的 BIOS 功能预计会在实模式下执行)。否则,它应该在 VirtualBox 中完美运行。

替代方案是:

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

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

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

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

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

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

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

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

【讨论】:

  • 为了完整起见:还有另一种选择(种类)- VBE3 PM 入口点。它在VBE3 spec 的第 29 页上进行了描述。
  • Linux 例如在处于保护模式时使用模拟器/解释器来解释实模式视频 BIOS。原因很清楚:市场上有如此大量的视频卡,最后一个选项根本不可能。我一直在开发自己的操作系统,为此目的使用虚拟模式。当然:如果视频模式不改变,第一个选项是最好的。
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 2016-08-06
  • 2016-09-21
  • 1970-01-01
  • 2016-01-25
  • 2018-03-15
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多