首页 > 解决方案 > 如何将用户输入的字符串放入 MIPS 中的数组中

问题描述

我正在开发一个程序,该程序将从用户那里读取字符串,直到其中一个字符串显示“END”。我需要读取每个字符串并将其存储在一个数组中,以便我可以访问程序另一部分中的值。我知道读入的字符串不会超过 20 个,并且每个字符串不会超过 15 个字符。

到目前为止,这是我尝试过的:

#Arrays
animals: .word 80

la $s0, animals         #Load the address of animals array into #$s0
add $t6, $0, $s0              #Copy address of animlas into $t6

获取用户输入:

addi $v0, $0, 8         #syscall code for read user input
la $a0, animal             #Where to store read string (animal)
addi $a1, $0, 15            #Max character allowance
syscall                      #Execute

将值放入数组中:

sw $a0, 0($t6)          #Load the address of animal into animals array
addi $t6, $t6, 4            #Increment index of array for next element

然后将读取的字符串发送到我已经彻底测试过的字符串比较函数;它工作正常!比较函数测试读取的字符串是否等于“END”。从函数返回后,代码继续循环,直到它读取“END”

要点是,在 MIPS 中将字符串读入数组的最佳方法是什么? 我对 MIPS 相当陌生,因此将不胜感激任何帮助!

标签: arraysstringassemblymips

解决方案


我将有 1 个大20 * (15+1)字节缓冲区,以及指向每个字符串开头的单独指针数组。将字符串读入大缓冲区中的某个位置后,将指针存储到指针数组中,并将 char 缓冲区中的当前位置增加长度(作为系统调用返回值获得)。

为 0 终止符留出空间,或者也存储长度。

或者,不要使用指向压缩字符串开头的指针,而是使用struct { char str[16]; } string_array[20];. 这会在数组内部留下未使用的空间,而不是在打包缓冲区末尾的大块中。

将每个字符串填充到固定宽度的一个好处(在这种情况下,它是 2 的幂)是您可以lw从读取字符串的位置执行单词加载 ( )。然后您可以bne $t0, $t8, top_of_loop一次检查所有 4 个字节是否存在"END\0",如果不存在则继续循环。$t8(使用 lui/ori 或负载获取该 4 字节值。)


推荐阅读