【问题标题】:Using syscall 13 in MIPS-Assembler在 MIPS-Assembler 中使用系统调用 13
【发布时间】:2017-01-08 19:51:04
【问题描述】:

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

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

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

如果有人能帮我解决这个任务,我将不胜感激。

提前致谢,

麦克风

【问题讨论】:

  • 有什么问题?到目前为止,您尝试过什么,您的代码是什么?
  • 我的代码,到目前为止,看起来像这样: # # load_img # .data buffer: .space 4096 .text main: la $a0, buffer # 将咬空间加载到缓冲区 li $a1, 4096 # allot字符串的咬合空间 move $to, $a0 # 将字符串保存到 $t0 li $v0, 13 syscall jr $ra
  • 我无法理解的是,如何告诉程序它必须读取的文件的地址。正如我已经说过的,这个文件在我的硬盘上......
  • 使用正确的格式将其编辑到问题本身中。也没有明确的问题......好吧,问题。
  • 虽然我对您的系统或任何事情一无所知,但根据您的说法,系统调用需要一个缓冲区,因此您可能需要以某种方式将文件加载到内存中。

标签: assembly mips system-calls qtspim


【解决方案1】:

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

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

服务 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 字节作为像素数据处理(您可以使用系统调用 9 为像素数据动态分配所需的内存,或者如果您确定输入是 64x64 8 位灰度,则只需创建另一个 pixels: .space 4096 缓冲区)将它们复制到最终像素缓冲区中,然后再次读取读取文件缓冲区中可用的尽可能多的字节,并复制更多像素...直到读取宽度 x 高度像素。

然后关闭文件。

对我来说听起来很简单,看不出你的问题在哪里。也许举几个例子,你带来了什么,来说明你有什么问题,但是整个组装就像到处移动数字一样,没有什么可做的,只要你可以将所有任务制定为移动算法到处都是数字,你很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多