簡體   English   中英

如何在32位NASM組件中更改VGA

[英]How to change VGA in 32-bit NASM Assembly

我試圖在此代碼中更改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中收到錯誤的原因是在保護模式下執行此操作(並且包括int 0x10 BIOS函數希望在實模式下執行) 。 否則,它應該在VirtualBox中運行良好。

替代方法是:

  • 在引導過程中設置視頻模式(在切換到保護模式之前)

  • 使用virtual8086模式(在仍處於保護模式下執行實模式代碼)

  • 使用仿真器或解釋器(在保護模式下執行/解釋實模式代碼)

  • 每次更改視頻模式時,都會暫時切換到實模式。 這是一個非常糟糕的主意(由於未在保護模式下接收到IRQ,因此會阻止本機驅動程序正常運行)。

  • 為“通用VGA”編寫本機驅動程序。

  • 為每個不同的視頻卡編寫本機驅動程序

對於所有這些選項; 我要說,第一個和最后一個是理智的。 其他的則完全浪費時間,從長遠來看將不再有用-引導后依賴於實模式BIOS功能的所有內容在現代(UEFI)計算機上均無用; VGA太丑陋(色彩深度和分辨率極差),以至於讓人流血(並且假定“在硬件級別上100%VGA兼容,沒有錯誤,怪異或不兼容”),這是相對模糊的假設,因為實際的VGA卡已有30多年的歷史了,VGA只是為了向后兼容而勉強可以忍受的真正視頻卡。

進一步來說; 您的引導加載程序可能應該在引導期間設置視頻模式(如果引導加載程序是為BIOS設計的,則使用VBE;如果引導加載程序是為UEFI設計的,則使用GOP或UGA),並告知OS /內核相關細節(幀地址)緩沖區,水平和垂直分辨率,顏色深度和像素格式,每條掃描線的字節數); 並且操作系統應使用此信息來提供“僅原始幀緩沖區”驅動程序(直到/除非它為特定的視頻卡/ GPU加載本機驅動程序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM