以16位汇编语言写入图形像素

时间:2016-07-08 14:09:48

标签: assembly x86 16-bit vga

我正在尝试为教育目的开发自己的基本操作系统。在对内核进行编码时,我尝试将颜色设置为屏幕上的某些像素以使其看起来更好,但我失败了。

我将INT 10hAH = 0CH一起用于视频模式13h(320x200图形,256色,1页),并尝试了其他几种模式,例如01h和{{1}但他们没有工作。

这是我的完整代码:

03h

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

编辑: 您的代码在DOS中运行(在我的linux机器上的dosbox中测试)。

所以要么没有达到(启动过程出现问题和代码前面的代码),或者你的内核/环境设置阻止int 10h BIOS中断工作(不要破坏) IVT意外?)。或者你的引导加载程序的大小已超过510B,因此引导扇区看起来不像你期望的那样?

根据这个wiki about Bootloaders看起来当你把你自己的代码(或这个例子)放到磁盘上的第一个扇区时,并在扇区末尾用0xAA55标记它,它应该工作(它可能会崩溃在结束后按键)。

您可能还想尝试他们的bootloader示例(编写hello world)。

要测试直接写入VRAM,你可以使用这样的代码(在我的linux机器上的dosbox中工作,所以如果你的操作系统设置类似的16b环境并允许BIOS中断):

palette.asm:

; 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