好的,基本上我遇到的问题就是这个。
我被分配编写一个动态存储结构的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
我最终得到的只是存储在我分配的内存中的地址, 我不知道如何将字符串存储到已分配的内存中。
任何帮助将不胜感激! :)
答案 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