2017-05-31 28 views
-4

这是一个我真的需要帮助的问题,我目前在FASM程序集中编写了一个操作系统,并且有一个像样的输出,图标来自ASCII表格。我想知道是否可以在装配程序中显示图像。我无法找到一个网站,所以链接到一个可以帮助完美的网站,或者如果它不可能的话,就不会。我如何在汇编程序中放置位图或任何图像格式

+0

真的吗?我以前建议你看看http://osdev.org。它很清楚地解释了这一点。您需要了解如何创建和管理帧缓冲区。 –

+0

osdev.org不显示如何将位图上传到FASM中的程序集文件中,我期待但感谢您的回复。 –

回答

1

首先,您需要知道您正在实施的文件结构。
您可以点击此处查看例如在维基百科上,对BMP: https://en.wikipedia.org/wiki/BMP_file_format
或位置:http://www.dragonwins.com/domains/getteched/bmp/bmpfileformat.htm - 我更喜欢用这一个
正如你看到的,我们必须实现一个有点头,然后我们就可以只需创建该文件。
让我们写一些示例代码:

File_begin: 
file_header: 
     .bfType: db "BM" 
     .bfSize: dd File_end - File_begin 
     .bfReserved1: dw 0 
     .bfReserved2: dw 0 
     .bfOffBits: dd PIXEL_DATA_START 
image_header: 
     .biSize: dd image_header_end-image_header 
     .biWidth: dd 3 
     .biHeight: dd 3 
     .biPlanes: dw 1 
     .biBitCount: dw 32 
     .biCompression: dd 0 
     .biSizeImage: dd 0 
     .biXPelsPerMeter: dd 0 
     .biYPelsPerMeter: dd 0 
     .biClrUsed: dd 0 
     .biClrImportant: dd 16 
image_header_end: 


PIXEL_DATA_START: 
dd 0x00000000, 0x00000000, 0x00000000 
dd 0x00ffffff, 0x00ffffff, 0x00000000 
dd 0x00ffffff, 0x00000000, 0x00ffffff 

File_end: 

这是一个显示一个3x3的滑翔机符号一个非常简单的BMP文件。
正如您所看到的,BMP文件格式实现起来非常简单 - 如果需要解释任何字段,请参阅我链接到的文档。
要记住的一件事是,你应该按照相反的顺序定义字节,因为PC架构中的东西很少。

我的代码使用FASM编译并在每个平台上运行,因为它只是一个映像 - 根本没有处理器作业。
因此,要回答您的问题,请查找文件头格式,然后实施它。相同的技术可以处理汇编中的所有操作,因此该文件在正常操作系统源代码中看起来将完全相同。
创建或解析这样的文件后,应该用下面的公式写每一个像素到帧缓冲器:
像素地址=帧缓冲器地址+ pixelX *颜色质量汇总+ pixelY *屏幕宽度*颜色质量汇总
例如:

mov eax, [framebuffer_addr] 
add eax, pixelX * cDepth ; simplified code, in normal circumstances you will have to muliply it first 
add eax, pixelY * cDepth * scrWidth 
mov [eax], 0x00ff0000 ;; this will paint your desired pixel red 

处理图像的每个像素并将其写入帧缓冲区,然后完成。

相关问题