在MIPS-Assembler中使用syscall 13

时间:2017-01-08 19:51:05

标签: assembly mips system-calls qtspim

我正在学习计算机,目前我的任务是学习如何使用qtSPIM在MIPS汇编程序中编程。

我正在处理的任务是,编写一个程序作为例程,将我的硬盘驱动器中的图片(PGM 5,二进制文件)加载到一个数组中。在piture的开头还有一个标题,其中包含宽度,长度,颜色深度和collors数量。

据我所知,我必须使用系统调用14才能执行此操作。该函数的参数是“$ a0 =文件描述符,$ a1 =缓冲区,$ a2 =长度”。但遗憾的是,我没有找到任何关于使用此函数读取具有特定大小(64x64像素)的图片的程序语法的信息。

如果有人能帮我解决这个问题,我将非常高兴。

提前致谢,

MIC

1 个答案:

答案 0 :(得分:1)

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

要获取文件的文件描述符,必须使用syscall 13打开它进行读取“$ a0 =包含文件名的空终止字符串的地址$ a1 = flags $ a2 = mode”

  

服务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文件也有标题。

系统调用16是关闭文件(阅读后不要忘记调用它。)

  

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

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

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

然后关闭文件。

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