在MIPS中读取文件时,它会读取最后一行两次

时间:2014-04-18 01:54:27

标签: assembly mips qtspim

我能够(部分)成功读取MIP中的文件。以下是我目前的代码。在QtSpim中,当我运行它时,我在$ a1中得到一个指向该文件的指针,但该文件的最后几个字符重复两次。重复的字符数根据文件而变化。从我所看到的,它似乎与文件中的换行符号相关联,除非新行字符位于文件的最末端(意思是,如果有5个换行符,则该文件的最后5个字符在读入的文件末尾会出现重复,但我没有看到任何理由为什么这应该是真的。 (仅供参考,此代码几乎逐字地从here复制,除了它读取而不是写入)

.data
fin: .asciiz "c:/input.txt"
fBuffer: .space 1024
.text
main:
    jal  openFile
    jr   $ra

#returns: pointer to file's text in $a1
openFile:
    li   $v0, 13       # system call for open file 
    la   $a0, fin  #fin is the file name
    li   $a1, 0    # 0 means 'read'
    li   $a2, 0
    syscall            # open file
    move $s6, $v0      # save the file descriptor

    #read from file
    li   $v0, 14       # system call for read from file
    move $a0, $s6      # file descriptor 
    la   $a1, fBuffer   
    li   $a2, 1024     # hardcoded buffer length
    syscall            # read from file

    # Close the file 
    li   $v0, 16       # system call for close file
    move $a0, $s6      # file descriptor to close
    syscall            # close file
    jr $ra

1 个答案:

答案 0 :(得分:1)

您无法知道此代码重复了最后一行。您给出的链接清楚地在文件读取的结果列中说$v0包含读取的字节数。但是你的代码会立即删除$v0来关闭文件。

如果更改代码只打印实际读取的字符,重复信息的外观应该消失。

如果使用打印字符串syscall,则只需向缓冲区添加一个字节(以防止溢出),然后在读取字符后写入空终止符。类似的东西:

syscall            # (your code) read from file 
la $a0, fBuffer    # load 32-bit buffer address
add $a0, $a0, $v0  # calculate address of byte after file data 
sb $zero, 0($a0)   # set that byte to zero