0

我正在使用 Rars Risc-V 模拟器,我必须从我的计算机中读取 24 位位图图像并将其显示在 rars 中。我所做的是使用 risc-v 系统调用打开图像,然后我尝试使用读取调用来读取它。

la a0, file_name
li a7, 1024     #system call for open
li a1, 0        #open for reading
ecall
mv s6, a0       #save the file descriptor to s6
    
#read file
li t0, -1
beq a0, t0, error

mv  a0, s6
la  a1, buffer
li  a2, 400000
li  a7, 63
ecall

但是这样做我得到了这个结果:

这个结果.

有谁知道如何正确地做到这一点?

4

1 回答 1

0

该文件格式具有将您定向到图像内容的标题。您将无法简单地将整个文件转储到视频内存中。

特别要注意(来自维基百科):

24 位像素 (24bpp) 格式支持 16,777,216 种不同的颜色,每 3 个字节存储 1 个像素值。

这是一种适度的压缩形式;而 MARS/RARS 位图工具每个像素使用 4 个字节(一个完整的字)。

相对而言,硬件模拟器使用的是未压缩形式,其中每个字浪费了一个字节(高位字节不会影响像素的颜色),这(浪费)使程序和硬件显示的寻址变得更加简单— 每个单词一个像素可以更轻松地使用数学绘制线条和其他图形形状。(但是每个像素 1 个额外的/未使用的字节对于非常大的图像集合或库所占用的磁盘空间来说是一种负担,因此以查看图像所需的解包代码和打包代码为代价放弃了磁盘上的额外空间文件创建程序需要。)

在文件中找到像素内容后,您必须将 3 个文件字节组(代表一个像素)解压缩成一个字(4 个字节),然后将该字写入视频内存像素。

因此,您需要将整个文件读入某个内存缓冲区(而不是视频映射),然后解码标题以找到第一个像素,然后将像素的 3 个颜色字节组合成一个字并将该字写入视频内存. 标题还将告诉您图像中总共有多少像素,以及每行有多少像素。

每组 3 个字节(一个像素的颜色)转到视频像素的另一个字,直到到达行边界,然后需要在视频内存中向前跳到下一个视频行,因为每行的像素数文件通常小于显示硬件的每行像素数。

于 2022-01-20T00:56:58.673 回答