如何在实模式下显示图像?

时间:2016-05-18 10:45:00

标签: assembly linker operating-system kernel bootloader

我正在学习操作系统。我已经通过Boot加载器和内核。当我使用XP操作系统时,我突然想知道如何使用第二阶段引导加载程序在实模式下显示图像(比如logo.jpg)。有可能这样做吗?

因为我认为启动时显示的XP徽标处于实模式。

那么,我该怎么做? 即:我的引导加载程序加载第二阶段,第二阶段应加载图像文件并显示它。

我应该使用资源链接器吗?

语言:8086汇编

由于

1 个答案:

答案 0 :(得分:2)

您可以使用中断10h与BIOS进行交互以控制视频卡。

维基百科:https://en.wikipedia.org/wiki/INT_10H
教程"视频编程I":http://fleder44.net/312/notes/18Graphics/index.html

以下示例摘自this websitelicense):

  

以下是使用写入模式2的4个平原的MODE 12h视频图形示例。   只需在640x480x16屏幕上绘制从(0,0)到(479,479)的彩色线条。       ;此代码与NBASM

组合在一起
.model tiny
.code
.186

           org 100h

           mov  ax,0012h                ; set mode to 640x480x16
           int  10h

           mov  ax,0A000h
           mov  es,ax

           ; start line from (0,0) to (639,479)
           mov  word X,0001h            ; top most pixel (0,0)
           mov  word Y,0001h            ;
           mov  byte Color,00h          ; start with color 0
           mov  cx,480                  ; 480 pixels
DrawLine:  call putpixel                ; put the pixel
           inc  word X                  ; move down a row and inc col
           inc  word Y                  ;
           inc  byte Color              ; next color
           and  byte Color,0Fh          ; 00h - 0Fh only
           loop DrawLine                ; do it

           xor  ah,ah                   ; wait for key press
           int  16h

           mov  ax,0003                 ; return to screen 3 (text)
           int  10h

           .exit                        ; exit to DOS


; on entry X,Y = location and C = color (0-15)
putpixel   proc near uses ax bx cx dx

; byte offset = Y * (horz_res / 8) + int(X / 8)

           mov  ax,Y                    ; calculate offset
           mov  dx,80                   ;
           mul  dx                      ; ax = y * 80
           mov  bx,X                    ;
           mov  cl,bl                   ; save low byte for below
           shr  bx,03                   ; div by 8
           add  bx,ax                   ; bx = offset this group of 8 pixels

           mov  dx,03CEh                ; set to video hardware controller

           and  cl,07h                  ; Compute bit mask from X-coordinates
           xor  cl,07h                  ;  and put in ah
           mov  ah,01h                  ;
           shl  ah,cl                   ;
           mov  al,08h                  ; bit mask register
           out  dx,ax                   ;

           mov  ax,0205h                ; read mode 0, write mode 2
           out  dx,ax                   ;

           mov  al,es:[bx]              ; load to latch register
           mov  al,Color
           mov  es:[bx],al              ; write to register

           ret
putpixel   endp

X          dw 00h
Y          dw 00h
Color      db 00h

.end