读入用 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。
我有一个 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。