我正在尝试为教育目的开发自己的基本操作系统。在对内核进行编码时,我尝试将颜色设置为屏幕上的某些像素以使其看起来更好,但我失败了。
我将INT 10h
与AH = 0CH
一起用于视频模式13h
(320x200图形,256色,1页),并尝试了其他几种模式,例如01h
和{{1}但他们没有工作。
这是我的完整代码:
03h
我的代码出了什么问题?
答案 0 :(得分:3)
编辑:
您的代码在DOS中运行(在我的linux机器上的dosbox
中测试)。
所以要么没有达到(启动过程出现问题和代码前面的代码),或者你的内核/环境设置阻止int 10h
BIOS中断工作(不要破坏) IVT意外?)。或者你的引导加载程序的大小已超过510B,因此引导扇区看起来不像你期望的那样?
根据这个wiki about Bootloaders看起来当你把你自己的代码(或这个例子)放到磁盘上的第一个扇区时,并在扇区末尾用0xAA55标记它,它应该工作(它可能会崩溃在结束后按键)。
您可能还想尝试他们的bootloader示例(编写hello world)。
要测试直接写入VRAM,你可以使用这样的代码(在我的linux机器上的dosbox中工作,所以如果你的操作系统设置类似的16b环境并允许BIOS中断):
; to compile DOS COM file: nasm -o palette.com palette.asm
; to run it with dosbox: dosbox palette.com -exit
BITS 16
ORG 100h
start:
mov ax,13h
int 10h
; draw palette in 32x8 squares, each square 5x5 pixels big (so 160x40px)
push 0a000h
pop es
xor di,di
xor ax,ax ; color
mov cx,8 ; big rows (each having 32 5x5 squares)
bigRowLoop:
mov bx,5 ; pixel height of single row
rowLoop:
mov dx,32 ; squares per row
push ax
push di
squareLoop:
; draw 5 pixels with "ah:al" color, ++color, di += 5
mov [es:di],ax
mov [es:di+2],ax
mov [es:di+4],al
add ax,0101h
add di,5
dec dx
jnz squareLoop
pop di
pop ax ; restore color for first square
add di,320 ; move di to start of next line
dec bx ; do next single pixel line
jnz rowLoop
; one row of color squares is drawn, now next 32 colors
add ax,02020h ; color += 32
dec cx
jnz bigRowLoop
; wait for any key and exit
xor ah,ah
int 16h
ret
答案 1 :(得分:1)
以下代码以红色显示一个像素。颜色,nr,4即。您必须使用NASM对其进行编译,然后它才能工作。
mov ax,13h
int 10h
mov ax,0A000h
mov es,ax
mov ax,32010
mov di,ax
mov dl,4
mov [es:di],dx
int 10h