Assembly 在MIPS中读取文件时,它会读取最后一行两次
我能够(部分)成功地在MIPs中读取文件。下面是我当前的代码。在QtSpim中,当我运行它时,我会得到一个指向$a1中文件的指针,但文件的最后几个字符会重复两次。重复的字符数根据文件的不同而变化。从我看到的情况来看,它似乎与文件中新行字符的数量有关,除非新行字符位于文件的最末尾(这意味着,如果有5个新行字符,则文件的最后5个字符将在读入的文件末尾出现重复),尽管我看不出这是真的。(仅供参考,除了读而不是写之外,此代码几乎是逐字复制的)Assembly 在MIPS中读取文件时,它会读取最后一行两次,assembly,mips,qtspim,Assembly,Mips,Qtspim,我能够(部分)成功地在MIPs中读取文件。下面是我当前的代码。在QtSpim中,当我运行它时,我会得到一个指向$a1中文件的指针,但文件的最后几个字符会重复两次。重复的字符数根据文件的不同而变化。从我看到的情况来看,它似乎与文件中新行字符的数量有关,除非新行字符位于文件的最末尾(这意味着,如果有5个新行字符,则文件的最后5个字符将在读入的文件末尾出现重复),尽管我看不出这是真的。(仅供参考,除了读而不是写之外,此代码几乎是逐字复制的) 你不可能知道最后一行是用这个代码重复的。您给出的链接在文件读
你不可能知道最后一行是用这个代码重复的。您给出的链接在文件读取的结果列中清楚地指出,
$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
读取文件并put
打印字符串,则必须在C中执行完全相同的操作。出现重复可能是因为syscall在缓冲区之后使用内存进行自己的缓冲,在数据完成后留下数据。print语句从缓冲区的末尾跑到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