【问题标题】:When reading file in MIPS, it reads last line twice在 MIPS 中读取文件时,它会读取最后一行两次
【发布时间】:2014-04-18 01:54:27
【问题描述】:

我能够(部分)成功读取 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

【问题讨论】:

    标签: assembly mips qtspim


    【解决方案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
    

    【讨论】:

    • 非常感谢。这做到了。仅供参考,代码的第二行应该是“la $a0,fBuffer”而不是“li”,但这只是一个简单的错字。我做错了什么需要手动将空字符添加到文件末尾吗?为什么会重复文件的结尾?
    • @Cruzer 您的文件读取很好(除非它超过 1024 个字符)。您只需按照打印例程的预期将输入转换为字符串。如果您使用fread 读取文件并使用puts 打印字符串,则必须在C 中执行完全相同的操作。重复的出现可能是因为系统调用在缓冲区之后使用内存进行自己的缓冲,在完成后留下数据。您的打印语句从缓冲区的末尾跑到系统调用区域,重复的信息只是巧合。它可能是任何垃圾。
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 2021-12-05
    • 2022-07-11
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多