读入用 C 打开的 MIPS 文件

read in MIPS file opened in C

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

根据:When reading file in MIPS, it reads last line twice and http://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)?)。

问题是系统调用似乎没有被执行。缓冲区保持不变,甚至 return 寄存器 (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

有什么问题吗? 谢谢

我终于可以解决这个问题了。 碰巧系统调用代码不是 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:

The C library function char *fgets(char *str, int n, FILE *stream) reads a line from the specified stream and stores it into the string pointed to by str. It stops when either (n-1) characters are read, the newline character is read, or the end-of-file is reached, whichever comes first.

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