如何使用动态内存在MIPS中存储字符串?

时间:2012-03-30 01:52:21

标签: memory dynamic assembly stack mips

好的,基本上我遇到的问题就是这个。

我被分配编写一个动态存储结构的MIPS程序。

基本上,它存储ID,年份,标题和描述 它将使用二叉搜索树进行存储。

如果您曾用C ++编写过堆栈,那么您就知道我在说什么。 我已成功将ID和标题动态存储在内存中, 但是我无法存储用户输入的字符串。

这是一个复杂的问题,而且我没有太多信息 能够在网上找到这样的道具如果你可以帮我解决这个问题:)

这是我的记忆设置:

$ s5 - 存储根节点

$ s7 - 存储树的大小(不是必需的)

每个新项包含一个344字节的块

字节设置如下:

8字节 - [ID]

8字节 - [年]

64字节 - [标题]

256字节 - [描述]

8个字节 - [LastNodeAddress]

8个字节 - [NextNodeAddress]

以下是代码,您可能会看到问题:

li $v0, 9           #allocate memory for new record
li $a0, 344         #enough memory for 2 addresses and all the data
syscall


move $s0, $v0           #hang onto the initial address of all our info

li $v0, 4           #prompt for ID
la $a0, addid
syscall

li $v0, 5           #enter integer
syscall

sw $v0, 0($s0)          #store our ID into memory   Offset: 0

li $v0, 4           #prompt for add year
la $a0, addyear
syscall

li $v0, 5           #enter integer
syscall

sw $v0, 4($s0)          #store year into our memory Offset: 4

li $v0, 4           #prompt for add title
la $a0, addtitle
syscall

li $v0, 8           #read title into titlebuffer
la $a0, titlebuffer
li $a1, 64
syscall

sw $a0, 8($s0)          #store title into our memory    Offset: 8

li $v0, 4           #prompt for add description
la $a0, adddescription
syscall

li $v0, 8           #read from input into descriptionbuffer
la $a0, descriptionbuffer
li $a1, 256
syscall

sw $a0, 72($s0)         #store description into our memory  Offset: 72

bne $s7, 0, setlocations    #if this isn't root node let's set the locations

add $s7, $s7, 1         #add 1 to the size of the records

move $s5, $s0           #store this address as root node for now

问题是所有存储的都是缓冲区的地址。 缓冲区在我的数据部分中定义如下:

.data
titlebuffer: .space 64
descriptionbuffer: .space 256

我最终得到的只是存储在我分配的内存中的地址, 我不知道如何将字符串存储到已分配的内存中。

任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:3)

不要像我在原始问题中所显示的那样在程序开始时定义你的记忆。

相反,请将其分配并将值读入动态内存的正确偏移量。

而不是la $a0, descriptionbuffer

而不是la $a0, titlebuffer

使用:

la $a0, 8($s0)

la $a0, 72($s0)

在此,我使用$s0将内存地址移至move $s0, $v0,并将值读入正确的偏移量。

要打印你做同样的事情!

以下是工作代码:

li $v0, 9           #allocate memory for new record
li $a0, 344         #enough memory for 2 addresses and all the data
syscall

move $s0, $v0           #hang onto the initial address of all our info

li $v0, 8           #read our title into the allocated space
la $a0, 8($s0)          #Offset: 8
li $a1, 64
syscall

li $v0, 8           #read our description into the allocated space
la $a0, 72($s0)         #Offset: 72
li $a1, 256
syscall 

此外,您可以在此处找到最终解决方案:https://stackoverflow.com/a/9953839/1274820

编辑:嗯,在10k次观看之后,我决定在这里添加更多信息,这样您就不必搜索更晚的代码了

以下是在内存中存储4个不同数据的完整代码:

li $v0, 9           #allocate memory for new record
li $a0, 344         #[334 = how much memory - in bytes]
syscall

move $s0, $v0       #store the address of our allocated memory in $s0

li $v0, 5           #enter integer
syscall
sw $v0, 0($s0)      #store our ID into memory   Offset: 0

li $v0, 5           #enter integer
syscall
sw $v0, 4($s0)      #store year into our memory Offset: 4

li $v0, 8           #read our title into the allocated space
la $a0, 8($s0)      #Offset: 8
li $a1, 64
syscall

li $v0, 8           #read our description into the allocated space
la $a0, 72($s0)     #Offset: 72
li $a1, 256
syscall 

这将存储ID,年份,标题和描述 - 偏移量是我们将数据放入动态内存的位置。

想象一下,我有一个334字节的块(如上所述):

[ 334 ]

我们将ID整数(4个字节的数据)存储在偏移0处,如下所示:

[(ID) 330 ]

然后,我们将年份存储在它旁边(偏移4处)。

[(ID)(YR) 326 ]

等等......

要打印它,请执行以下操作:

li $v0, 1           #Print the ID stored at $s0     [Offset: 0]
lw $a0, 0($s0)
syscall
li $v0, 1           #Print the Year stored at $s0   [Offset: 4]
lw $a0, 4($s0)
syscall
li $v0, 4           #Print the Title stored at $s0  [Offset: 8]
la $a0, 8($s0)
syscall
li $v0, 4           #Print descript stored at $s0   [Offset: 72]
la $a0, 72($s0)
syscall