[英]Write graphics pixels in 16-bit assembly
我正在尝试出于教育目的开发自己的非常基本的操作系统。 在对内核进行编码时,我尝试将颜色设置为屏幕上的某些像素以使其看起来更好,但失败了。
我在视频模式13h
(320x200图形,256色,1页)中使用AH = 0CH
INT 10h
,并尝试了其他几种模式,例如01h
和03h
但它们不起作用。
这是我完整的代码:
;set video mode
mov ah, 00h
mov al, 13h
int 10h
;write pixels on screen
mov ah, 0ch
mov bh, 0
mov dx, 5
mov cx, 5
mov al, 0100b
int 10h
我的代码有什么问题?
编辑:您的代码在DOS中工作(在我的Linux机器上的dosbox
测试)。
因此,它要么没有达到(启动程序和代码之前的问题),要么您设置的内核/环境阻止了int 10h
BIOS中断起作用(您不是偶然地破坏了IVT吗?)。 还是您的引导加载程序已经超过510B大小,所以引导扇区看起来不像您期望的那样?
根据有关引导加载程序的此Wiki,它看起来像是您将自己的代码(或本示例)放入磁盘上的第一个扇区,并在扇区末尾将其标记为0xAA55时,它应能工作(并且在按键时可能会崩溃)。结束)。
您可能还想尝试一下他们的引导程序示例(编写问候世界)。
要测试直接写入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
以下代码以红色显示一个像素。 颜色,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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.