Assembly 如何以实模式显示图像?

Assembly 如何以实模式显示图像?,assembly,linker,operating-system,kernel,bootloader,Assembly,Linker,Operating System,Kernel,Bootloader,我正在学习操作系统。我已经通过了引导加载程序和内核。当我使用XP操作系统时,我突然想知道如何使用第二阶段引导加载程序在真实模式下显示图像(比如logo.jpg)。有可能吗 因为我认为在启动过程中显示的XP徽标是真实模式 那么,我该怎么做呢? ie:我的引导加载程序加载第二阶段,第二阶段应该加载图像文件并显示它 我应该使用资源链接器还是什么 语言:8086汇编语言 谢谢您可以使用中断10h与BIOS交互以控制视频卡 维基百科: 教程“视频编程I”: 下面是一个取自()的示例: 下面是使用写入模式2

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

因为我认为在启动过程中显示的XP徽标是真实模式

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

我应该使用资源链接器还是什么

语言:8086汇编语言


谢谢

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

维基百科:
教程“视频编程I”:

下面是一个取自()的示例:

下面是使用写入模式2的4个平面的模式12h视频图形示例。 只需在640x480x16屏幕上从(0,0)到(479479)绘制一条彩色线。 ; 这段代码是用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

使用现代显示设备的VESA VBE 3-bios,我们可以切换到8、16或24/32位颜色的视频模式,可能具有1920x1200x32(16:10纵横比)的宽屏分辨率。更多详细信息可以在vesa.org(需要注册/登录)的免费公共文档“vbe3.pdf”中找到。只有4位16色的旧视频模式不太容易使用,因为它不太适合需要端口访问来设置每个像素。是的,但通常情况下,您不希望对引导加载程序中的可用硬件等做出乐观的假设。。。这就是为什么即使是现代Windows也可以显示非VESA引导屏幕的原因(如果我没有弄错的话,默认情况下在Windows Vista之前都是如此)。实际上,我可以在真实模式下显示图像(比如logo.jpg)吗?我不想画图形,而是显示图像。同样的事情。然而,解码JPG将是不必要的复杂。只需将其存储为位图甚至原始像素数据。然后去画所有的像素到屏幕上。你们刚刚显示了一个图像。好的,但我应该如何从位图文件中提取像素并绘制它呢?你们正在写一个内核,对吗?你已经建立了一个文件系统吗?否则根本就没有像“文件”这样的东西。。。如果您还没有从磁盘加载东西的方法,那么您需要在代码中包含像素作为数组。