Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在MIPS中读取文件时,它会读取最后一行两次_Assembly_Mips_Qtspim - Fatal编程技术网

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

Assembly 在MIPS中读取文件时,它会读取最后一行两次,assembly,mips,qtspim,Assembly,Mips,Qtspim,我能够(部分)成功地在MIPs中读取文件。下面是我当前的代码。在QtSpim中,当我运行它时,我会得到一个指向$a1中文件的指针,但文件的最后几个字符会重复两次。重复的字符数根据文件的不同而变化。从我看到的情况来看,它似乎与文件中新行字符的数量有关,除非新行字符位于文件的最末尾(这意味着,如果有5个新行字符,则文件的最后5个字符将在读入的文件末尾出现重复),尽管我看不出这是真的。(仅供参考,除了读而不是写之外,此代码几乎是逐字复制的) 你不可能知道最后一行是用这个代码重复的。您给出的链接在文件读

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