Assembly 在MIPS汇编程序中使用syscall 13

Assembly 在MIPS汇编程序中使用syscall 13,assembly,mips,system-calls,qtspim,Assembly,Mips,System Calls,Qtspim,我从年开始学习计算机,目前的任务是,学习如何使用qtSPIM在MIPS汇编程序中编程 我目前正在处理的任务是,编写一个程序作为例程,将图片(PGM 5,二进制)从硬盘加载到阵列中。在柱头的开始处还有一个柱头,包含宽度、长度、颜色深度和颜色的数量 据我所知,我必须使用syscall14来实现这一点。此函数的参数为“$a0=文件描述符,$a1=缓冲区,$a2=长度”。但不幸的是,我没有找到关于使用此函数读取特定大小(64x64像素)图片的程序的正确语法的任何信息 如果有人能帮我解决这项任务,我将非常

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

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

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

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

提前感谢,


麦克风

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

要获取文件的文件描述符,必须使用“$a0=包含文件名$a1=标志$a2=模式的以null结尾的字符串的地址”打开该文件进行读取

服务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个字节读入缓冲区(该缓冲区应包含任何标题),然后解析这些数据,提取宽度/高度/最大颜色的值,并检测像素数据的开始

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

然后关闭文件


听起来很简单,看不出你的问题在哪里。可能会展示一些例子,你带来了什么,来说明什么对你来说是有问题的,但整个装配就像在这里和那里移动数字一样,没有什么其他的事情要做,所以只要你能将所有任务表述为在这里和那里移动数字的算法,你就可以了。

问题是什么?到目前为止,您尝试了什么以及您的代码是什么?我的代码,sofar,看起来是这样的:#加载#img#。数据缓冲区:。空格4096。文本主:la$a0,buffer#加载位空间到缓冲区li$a1,4096#为字符串移动分配位空间,$a0#将字符串保存到$t0 li$v0,13系统调用jr$raWhat我无法理解的是,如何告诉程序它必须读取的文件的地址。正如我已经说过的,这个文件在我的硬盘上…用正确的格式将它编辑成问题本身。同样,在这个问题上也没有明确的问题。。。好吧,问题。虽然我对您的系统或任何东西一无所知,但根据您的说法,系统调用需要一个缓冲区,因此您可能需要以某种方式将文件加载到内存中。