如何在 32 位 NASM 程序集中更改 VGA
How to change VGA in 32-bit NASM Assembly
我正在尝试在此代码中更改 VGA。人们说我可以使用 int 10h,但是,我在虚拟框中遇到错误。此时我想通过任何一种 vga 设置屏幕。我设法设置了 Globa Description Table 并写入了 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模式(在保护模式下执行实模式代码)
使用模拟器或解释器(在保护模式下execute/interpret实模式代码)
每次更改视频模式时都会暂时切换到实模式。这是一个非常糟糕的主意(由于在未处于保护模式下时收到 IRQ 而导致本机驱动程序无法正常运行)。
为"generic VGA"编写本机驱动程序。
为每个不同的视频卡编写本机驱动程序
对于所有这些选项;我会说第一个和最后一个是唯一理智的。其他的完全是浪费时间,从长远来看不会有用——任何依赖实模式 BIOS 功能的东西在启动后都不会在现代 (UEFI) 计算机上有用;并且 VGA 非常丑陋(颜色深度和分辨率极差),让人眼睛流血(假设“100% VGA 在硬件级别兼容,没有错误、怪癖或不兼容”,考虑到实际的 VGA 卡,这是一个相对狡猾的假设已经有 30 多年不存在了,VGA 只是真正的视频卡为了向后兼容而勉强容忍的东西。
更具体地说;您的引导加载程序可能应该在引导期间设置视频模式(如果引导加载程序是为 BIOS 设计的,则使用 VBE,如果引导加载程序是为 UEFI 设计的,则使用 GOP 或 UGA)并告诉 OS/kernel相关细节(帧缓冲区地址、水平和垂直分辨率、颜色深度和像素格式、每条扫描线的字节数); OS 应该使用此信息来提供 "raw frame buffer only" 驱动程序(until/unless 它为特定视频 card/GPU 加载本机驱动程序)。
我正在尝试在此代码中更改 VGA。人们说我可以使用 int 10h,但是,我在虚拟框中遇到错误。此时我想通过任何一种 vga 设置屏幕。我设法设置了 Globa Description Table 并写入了 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模式(在保护模式下执行实模式代码)
使用模拟器或解释器(在保护模式下execute/interpret实模式代码)
每次更改视频模式时都会暂时切换到实模式。这是一个非常糟糕的主意(由于在未处于保护模式下时收到 IRQ 而导致本机驱动程序无法正常运行)。
为"generic VGA"编写本机驱动程序。
为每个不同的视频卡编写本机驱动程序
对于所有这些选项;我会说第一个和最后一个是唯一理智的。其他的完全是浪费时间,从长远来看不会有用——任何依赖实模式 BIOS 功能的东西在启动后都不会在现代 (UEFI) 计算机上有用;并且 VGA 非常丑陋(颜色深度和分辨率极差),让人眼睛流血(假设“100% VGA 在硬件级别兼容,没有错误、怪癖或不兼容”,考虑到实际的 VGA 卡,这是一个相对狡猾的假设已经有 30 多年不存在了,VGA 只是真正的视频卡为了向后兼容而勉强容忍的东西。
更具体地说;您的引导加载程序可能应该在引导期间设置视频模式(如果引导加载程序是为 BIOS 设计的,则使用 VBE,如果引导加载程序是为 UEFI 设计的,则使用 GOP 或 UGA)并告诉 OS/kernel相关细节(帧缓冲区地址、水平和垂直分辨率、颜色深度和像素格式、每条扫描线的字节数); OS 应该使用此信息来提供 "raw frame buffer only" 驱动程序(until/unless 它为特定视频 card/GPU 加载本机驱动程序)。