我需要保存包含以下内容的数据:name,id和rating。 所以insert命令是这样的:
addi $sp, $sp, -12
li $v0,8 # take in input
la $a0, buffer # load byte space into address
move $t0,$a0 # save string to t0
syscall
sw $t0, 0($sp) # name
sw $t1, 4($sp) # id
sw $t2, 8($sp) # rating
addi $t7,$t7,1 # number of elements
视图命令是这样的:
loop:
beq $t6, $t7, end
lw $a0, 0($sp) # name
li $v0, 4
syscall
lw $a0, 4($sp) # id
li $v0, 1
syscall
lw $a0, 8($sp) # rating
li $v0, 1
syscall
addi $t6,$t6, 1
addi $sp,$sp, 12
j loop
当将两个元素作为第一个元素时:aa, 12, 12 second one : bb, 13, 13
在view命令之后:aa, 12, 12 second one: aa, 13, 13
你能帮我解决这个问题吗?
答案 0 :(得分:1)
您似乎每次都将相同的地址(buffer
)传递给read_string
系统调用。因此,每次调用都将覆盖前一次调用中的字符串。
您需要为每个字符串分别使用缓冲区。例如,您可以将buffer
传递给syscall 8,然后计算读取字符串的长度,为其分配内存(包括NULL终止符)using syscall 9,将字符串从buffer
复制到新分配的内存块,最后将已分配内存的地址存储在堆栈中,而不是buffer
。