[英]How to link 32-bit Nasm assembly object code on a 64-bit windows computer
[英]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.