1

我需要保存一个包含:名称、ID 和评级的数据。所以插入命令是这样的:

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
查看命令后是这样的:aa, 12, 12 second one: aa, 13, 13

你能帮我解决这个问题吗?

4

1 回答 1

1

看起来您每次都将相同的地址 ( buffer) 传递给系统调用。read_string所以每次调用都会覆盖上一次调用的字符串。

您需要为每个字符串设置单独的缓冲区。例如,您可以传递buffer给 syscall 8,然后计算读取字符串的长度,使用 syscall 9为其分配内存(包括 NULL 终止符) ,将字符串复制buffer到新分配的内存块中,最后存储地址在堆栈上分配的内存而不是buffer's.

于 2013-05-02T05:21:37.800 回答