用mips存储数组中的记录

时间:2017-02-23 06:26:38

标签: 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

 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

1 个答案:

答案 0 :(得分:0)

警告:您可能希望发布整个计划。

在你的打印循环中,你正在la $a1,Record [每次迭代]。这会将基本指针[在$a1]中重置为记录数组的开头。此声明应移至loop:

之上

而且,循环底部的$a1增量太小。您需要的东西至少是记录的总大小。以下是我认为您的记录的内容:

offset  length  element
------  ------  ------------------
0       40      employee name
40      4       age
44      4       salary
48      -       TOTAL

因此,您应该使用addiu $a1,$a1,48

并且,在加载/存储agesalary时,我认为您分别需要lwsw,而不是lbsb }

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

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

    # 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而不是