在MIPS中,如何使用syscall 14来读取长文件?

时间:2015-10-27 20:15:36

标签: mips

我目前正在开发一个项目(使用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

1 个答案:

答案 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

在系统退出呼叫之前进入主要区块。