在MIPS汇编程序中使用syscall 13



我从那时起就开始学习计算机,目前我的任务是学习如何使用qtSPIM在MIPS汇编程序中编程。

我目前正在处理的任务是,编写一个程序作为例程,将图片(PGM 5,二进制)从硬盘加载到阵列中。在陷阱的起点还有一个标题,其中包含宽度、长度、颜色深度和胶体的数量。

据我所知,我必须使用syscall 14来完成这项工作。此函数的参数为"$a0=文件描述符,$a1=缓冲区,$a2=长度"。但不幸的是,我没有找到任何关于使用此函数读取特定大小(64x64像素)的图片的程序的正确语法的信息。

如果有人能帮我解决这项任务,我将非常高兴和感激。

提前感谢

麦克风

syscall 14需要:"$a0=文件描述符,$a1=缓冲区,$a2=长度">

要获得文件的文件描述符,您必须使用syscall 13"$a0=包含文件名$a1=标志$a2=模式的空终止字符串的地址"打开它进行读取

Service 13-MARS实现了三个标志值:0表示只读,1表示使用create只写,9表示使用create和append只写。它忽略模式。如果操作失败,返回的文件描述符将为负数。底层文件I/O实现使用java.io.FileInputStream.read()进行读取,使用java.io.FileOutputStream.write()进行写入。MARS在内部维护文件描述符,并从3开始分配它们。文件描述符0、1和2始终打开:分别从标准输入读取、写入标准输出和写入标准错误(4.3版中新增)

文档中还有一个示例。

没有获取文件信息(如长度)的服务,因此您必须将文件作为流读取并同时处理,或者分配足够大的缓冲区来一次性读取所有pgm文件。64x64是4096字节(如果使用8位灰度),所以您的缓冲区将不够,pgm文件也有标题。

syscall 16是关闭文件(不要忘记在读取后调用它)。

但不幸的是,我没有找到任何关于使用此函数读取特定大小(64x64像素)的图片的程序的正确语法的信息。

嗯。。。您只需将前2000个字节读入缓冲区(应该覆盖任何标头),然后解析这些数据,提取width/heigh/maxcolor的值,并检测像素数据的开始。

然后,将剩余的2000个字节作为像素数据(您可以使用syscall 9为像素数据动态分配所需的内存,或者如果您确定输入是64x64 8位灰度级,则只需创建另一个pixels: .space 4096缓冲区)复制到最终像素缓冲区,然后再次读取读取文件缓冲区中可用的字节数,并复制更多像素。。。直到读取宽度x高度像素为止。

然后关闭文件。

听起来很简单,看不出你的问题在哪里。也许展示几个例子,你带来了什么,来展示对你来说有问题的地方,但整个组装就像在这里和那里移动数字,没有太多其他事情要做,所以只要你能把你所有的任务都公式化为在那里和这里移动数字的算法,你就可以了。

最新更新