如何将位图或任何图像格式放在汇编程序中

时间:2017-05-31 02:38:43

标签: image assembly bitmap operating-system fasm

这是一个我真正需要帮助的问题,我目前在FASM程序集中编写一个操作系统,并且输出的图像来自ASCII表。我想知道你是否可以在装配程序中显示图像。我找不到一个网站,所以链接到一个可以提供帮助的网站是完美的,如果不可能的话就没有。

1 个答案:

答案 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

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