这是一个我真正需要帮助的问题,我目前在FASM程序集中编写一个操作系统,并且输出的图像来自ASCII表。我想知道你是否可以在装配程序中显示图像。我找不到一个网站,所以链接到一个可以提供帮助的网站是完美的,如果不可能的话就没有。
答案 0 :(得分: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:
这是一个非常简单的BMP文件,显示一个3x3滑翔机符号
如您所见,BMP文件格式实现起来非常简单 - 如果您需要任何字段的说明,请参阅我链接的文档。
要记住的一件事是你应该按照相反的顺序定义字节,因为在PC架构中它们是小端的
我的代码使用FASM编译并在每个平台上运行,因为它只是一个图像 - 根本没有处理器作业。
所以,回答你的问题 - 查找文件头格式,然后实现它。相同的技术适用于您在汇编中执行的所有操作,因此该文件在正常的OS源中看起来完全相同。
创建或解析此类文件后,应使用以下公式将每个像素写入帧缓冲区:
像素地址=帧缓冲地址+ pixelX * colordepth + pixelY * screenWidth * ColorDepth
例如:
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
处理图像的每个像素并将其写入帧缓冲区,然后就完成了。