读入在C中打开的MIPS文件

时间:2015-05-25 18:41:44

标签: c mips readfile

我有一个c函数,我打开和关闭文件。但我想替换在MIPS中实现的自定义readFile函数的fgets函数。

根据:When reading file in MIPS, it reads last line twicehttp://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html 我需要传递系统调用代码14;和文件描述符,输入缓冲区的地址和作为参数读取的最大字符数。

当在c中打开文件时,我得到一个FILE *,从中我使用fileno得到一个fileDescriptor(根据这个How can I convert a file pointer ( FILE* fp ) to a file descriptor (int fd)?)。

问题是系统调用似乎没有被执行。缓冲区保持不变,甚至返回寄存器(v0)的值也是14(相同的代码),而不是读取的字符数。

用于调用系统调用的MIPS代码是:

li      v0, 14       # system call for read from file
lw      a0, 40($fp)  # file descriptor
lw      a1, 32($fp)  # address of buffer to which to read
lw      a2, 36($fp)  # buffer length
syscall         # read from file

可能有什么不对? 感谢

1 个答案:

答案 0 :(得分:1)

我终于可以解决这个问题。 碰巧系统调用代码不是14,而是3(SYS_read宏)。

readFile.S中要读取的代码是:

li      v0, SYS_read       # system call for read from file
lw      a0, 40($fp)  # file descriptor
lw      a1, 32($fp)  # address of buffer to which to read
lw      a2, 36($fp)  # buffer length
syscall         # read from file

第一个参数是文件描述符,而不是文件指针。 所以我从main.c调用我的自定义readFile函数,如下所示:

FILE *fp;
fp = fopen("test-files/test.txt", "r");
int fileDescriptor = fileno(fp);
int bufIncrSize = 10;
char *buffer = (char*) malloc(bufIncrSize);
while (readFile(buffer, bufIncrSize, fileDescriptor)) {
    printf("%s",buffer);
}

免责声明:此代码不完整,无法替换fgets:

  

C库函数char * fgets(char * str,int n,FILE * stream)从指定的流中读取一行并将其存储到str指向的字符串中。当读取(n-1)个字符,读取换行符或达到文件结尾时(以先到者为准),它会停止。

SYS_read系统调用不会在换行符处停止,因此它可以读取多行。 所以,你应该自己实现这个beahivour。