MIPS:计算纯文本文件中的唯一单词并查找其频率

时间:2013-09-27 01:03:14

标签: mips

第一次在这里问问题。我对MIPS的家庭作业非常感到沮丧。赋值状态:输入将是纯文本文件,输出将是包含带有频率的单词列表的另一个文件。输出文件呈现两列,左列将是一个单词,右列将是输入文件中的频率数。例如,输出文件可能如下所示:

有:2
  他们:3
  是:4
  我:5

我们假设使用MIPS Assembly对此进行编码。我不明白我该怎么处理这类问题。我在想第一次将旧文件中的所有字符读入内存中的数组,并尝试找出构建第二个数组的方法,包含所有唯一字及其频率。

到目前为止,我只能将原始文件读入数组。 。数据     字符:.space 1024     fin:.ascii“chill.txt”#要读取的文件名     uniqueWord:.space 1024

的.text 主要:

   Open a file 

li $v0, 13      # syscall for open file
la $a0, fin     # output file name
li $a1, 0       # open for read
li $a2, 0   
syscall
move $s6, $v0       # save the file descriptor

   read from the file that just opened

li $v0, 14      # syscall for read from file
move $a0, $s6       # file descriptoer
la $a1, chars       
li $a2, 1024
syscall

I try to use these to find the beginning and the ending or a word. 
add   $t4, $zero, $zero     # I = 0
add   $t0, $zero, $zero     # TOTAL = 0
add   $t1, $zero, 44        # ENDPOINT = ',' 
add   $t2, $zero, 32        # ENDPOINT = ' ' 
addi  $t3, $zero, 46        # ENDPOINT = '.'



loop:
lb    $t5, chars($t4)       # for c in chars
beq   $t5, $zero, endloop   #
beq   $t5, $t3,uniqueWord      # if c == '.'  go to uniqueWord 
beq   $t5, $t1,uniqueWord   # if c == ','  go to endloop
beq   $t5, $t2, uniqueWord  # if c == ' '  go to endloop
addi  $t4, $t4, 1           # i += 1       increment index
addi  $t0, $t0, 1           # total += 1     
j loop

如果有人能指导我完成这项任务,我真的很感激。万分感谢。

1 个答案:

答案 0 :(得分:0)

对于这样的所有复杂分配,您应该首先在C中编写和调试一个简单的解决方案,然后手动转换为汇编。您可以使用C语言快速开发工作解决方案。然后,您需要做的就是验证是否已将其正确地转换为汇编并调试可能已在程序集中引入的任何错误。

考虑问题的解决方案并同时考虑在汇编程序中实现该解决方案太复杂了。你会陷入困境,迷失方向。这就是我在日常工作中用汇编写东西的方式。

解决这个问题的最简单方法是使一个数组包含到目前为止看到的所有单词,以及一个单独的数组,每个单词使用use-count,这样WORDS [0]的use-count是保持在COUNTS [0]。然后:

  • 当你读到一个新词时:
  • 将其与数组中的每个单词进行比较
  • 如果匹配单词,则递增该单词的使用次数
  • 如果在没有匹配的情况下到达数组的末尾:
    • 将当前单词添加到数组的末尾
    • 增加数组长度。如果数组长度超过最初为数组分配的空间,请放弃并退出并显示错误

这只是一个简单的建议,不会太难转换成汇编程序。对于这个问题,显然有许多更快的算法,例如树和哈希表。