我目前正在开发一个项目(使用MARS
),我需要使用syscall 14
读取多行文件。我有一个设置缓冲区长度,我用于80字节长的系统调用。我已经在_readLine函数中设置了循环,因此每次迭代都应该将缓冲区的内容打印到控制台。这就是我如何意识到我的循环只读取文件的第一个80
字节,而不是更多。
我一直在搜索互联网,试图找到一个提示,说明为什么我无法读取文件的下一个80
字节。我认为它可能与文件描述符有关,但是当我尝试递增它时,没有任何改变,它仍然只输出文件的第一80
个字节syscall 14
。
有人可以帮我弄清楚出了什么问题,或者让我知道如何指向我档案的下一个80
字节?我的代码在下面(fileBuff
保存用户输入的文件名的地址,_printBuffer
是我稍后在程序中使用的函数,但你可以忽略。)
main:
# Open file for reading
addi $v0, $zero, 13
la $a0, fileBuff
add $a1, $zero, $zero # pass in flags
add $a2, $zero, $zero # pass in mode
syscall # open a file (file descriptor returned in $v0)
add $s6, $zero, $v0 # store descriptor in $a0
jal _readLine # call _readFile function
jal _printBuffer
addi $v0, $zero, 10 # prepare to exit the program
syscall # exit
_readLine:
readLoop:
add $a0, $zero, $s6 # setup file descriptor
la $a1, buffer # address of buffer
addi $a2, $zero, 80 # read 80 bytes
addi $v0, $zero, 14 # read from the file (descriptor already in $a0, buffer address in $a1, buffer length in $a2)
syscall # write to the file
beq $v0, $zero, doneReading
slt $t0, $v0, $zero # if end of file, then close file
beq $t0, 1, doneReading # if error, then close file
la $t0, buffer # load buffer address into $t0
add $s6, $zero, $v0 # save file length in $s0
add $s6, $s6, $t0 # change descriptor to where last left off in the file
#### remove... eventually
addi $v0, $zero, 4
la $a0, buffer
syscall
####
j readLoop
doneReading:
addi $v0, $zero, 16 # syscall to close the file
add $a0, $zero, $s6 # file descriptor to close
syscall # close the file
jr $ra
答案 0 :(得分:1)
Syscall 14连续读取字符串。
当你告诉它读取80字节时,它将读取80个字节。 当你再次调用它时(不关闭它),它将读取接下来的80个字节,依此类推。
所以我建议你移动这段代码:
addi $v0, $zero, 16 # syscall to close the file
add $a0, $zero, $s6 # file descriptor to close
syscall # close the file
在系统退出呼叫之前进入主要区块。