Assembly 如何以实模式显示图像?
我正在学习操作系统。我已经通过了引导加载程序和内核。当我使用XP操作系统时,我突然想知道如何使用第二阶段引导加载程序在真实模式下显示图像(比如logo.jpg)。有可能吗 因为我认为在启动过程中显示的XP徽标是真实模式 那么,我该怎么做呢? ie:我的引导加载程序加载第二阶段,第二阶段应该加载图像文件并显示它 我应该使用资源链接器还是什么 语言:8086汇编语言Assembly 如何以实模式显示图像?,assembly,linker,operating-system,kernel,bootloader,Assembly,Linker,Operating System,Kernel,Bootloader,我正在学习操作系统。我已经通过了引导加载程序和内核。当我使用XP操作系统时,我突然想知道如何使用第二阶段引导加载程序在真实模式下显示图像(比如logo.jpg)。有可能吗 因为我认为在启动过程中显示的XP徽标是真实模式 那么,我该怎么做呢? ie:我的引导加载程序加载第二阶段,第二阶段应该加载图像文件并显示它 我应该使用资源链接器还是什么 语言:8086汇编语言 谢谢您可以使用中断10h与BIOS交互以控制视频卡 维基百科: 教程“视频编程I”: 下面是一个取自()的示例: 下面是使用写入模式2
谢谢您可以使用中断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将是不必要的复杂。只需将其存储为位图甚至原始像素数据。然后去画所有的像素到屏幕上。你们刚刚显示了一个图像。好的,但我应该如何从位图文件中提取像素并绘制它呢?你们正在写一个内核,对吗?你已经建立了一个文件系统吗?否则根本就没有像“文件”这样的东西。。。如果您还没有从磁盘加载东西的方法,那么您需要在代码中包含像素作为数组。