Arrays 使用mips在阵列中存储记录

Arrays 使用mips在阵列中存储记录,arrays,assembly,mips,record,Arrays,Assembly,Mips,Record,我应该存储一个包含10条记录的数组,每条记录都有一个名称(40个字符)、年龄和薪水 我做了一个循环来存储用户输入,另一个循环来打印它,但是我的输出显示了一些不同的东西。我不确定我是否正确存储了这些记录?请给我一些建议 这是我的输出。对于测试,我只有3个记录 There are 10 records. first employee 23 20 second employee 34 20 third employee 25 23 third employee 23 20

我应该存储一个包含10条记录的数组,每条记录都有一个名称(40个字符)、年龄和薪水

我做了一个循环来存储用户输入,另一个循环来打印它,但是我的输出显示了一些不同的东西。我不确定我是否正确存储了这些记录?请给我一些建议

这是我的输出。对于测试,我只有3个记录

 There are 10 records.
 first employee
 23
 20
 second employee
 34
 20
 third employee
 25
 23  
 third employee
 23
 20

 23
 20

 23
 20

-- program is finished running --
我的代码是这样的:

loop:
bgt $t0, $a2, print #counter = size go to print
#store name
li $v0, 40
li  $v0, 8
syscall

#reads and store the age
li $v0, 5
syscall
sb $v0, 40($a1)

#reads and stores the salary
li $v0, 5
syscall
sb $v0, 44($a1)
addi $t0, $t0, 1    #up counter
addiu $a1, $a1, 12  #shift to the next value? may be error here
b loop

print:
beqz $t0, end   #counter = 0; end
li $v0, 4
la $a1, Records
syscall     #print name
li $v0, 1
lb $t1, 40($a1)
move $a0, $t1
syscall     #print age
la $a0, newline
li $v0, 4
syscall     #newline        
li $v0, 1
lb $t1, 44($a1)
move $a0, $t1
syscall     #print salary
la $a0, newline
li $v0, 4
syscall

addi $t0, $t0, -1   #decrement
addiu $a1, $a1, 12
b print
警告:您可能想发布整个程序

在打印循环中,您正在执行
la$a1,记录
[在每次迭代中]。这将[在
$a1
]中]将基指针重置为记录数组的开头。此语句应移到
循环:

而且,循环底部的
$a1
增量太小。你需要的东西至少是记录的总大小。我认为你的记录是这样的:

offset  length  element
------  ------  ------------------
0       40      employee name
40      4       age
44      4       salary
48      -       TOTAL
因此,您应该使用
addiu$a1,$a1,48

而且,当加载/存储
age
salary
时,我认为您希望分别使用
lw
sw
,而不是
lb
sb

而且,我相信您存储记录的循环还有一些问题

特别是,读取名称的系统调用是不正确的。您需要设置:

    # assuming a0 points to the name field
    li      $v0,8                   # syscall for gets (read string)
    li      $a1,40                  # string length
    syscall
因此,在读取循环的开始上方,您需要
la$a0,Record
,而
$a1
的其他用法需要是
$a0