0

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

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

我们假设使用 MIPS 程序集对此进行编码。我不明白我应该如何处理这种问题。我在想首先将旧文件中的所有字符读入内存中的数组,然后尝试找出一种方法来构造第二个数组,其中包含所有唯一单词及其频率。

到目前为止,我只能将原始文件读入数组。.data chars: .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

如果有人能指导我完成这项任务,我将不胜感激。感谢一百万次。

4

1 回答 1

0

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

考虑问题的解决方案并同时考虑在汇编程序中实现该解决方案太复杂了。你只会陷入细节并迷失方向。这就是我在日常工作中编写汇编代码的方式。

解决这个问题的最简单的方法是有一个包含迄今为止看到的所有单词的数组,以及一个包含每个单词的使用计数的单独数组,以便 WORDS[0] 的使用计数保存在 COUNTS [0]。然后:

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

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

于 2013-09-27T02:47:06.170 回答