2017-02-23 24 views
0

我应该存储10个记录的数组,每个记录有一个名称(40个字符),年龄和工资。在一个数组中存储记录与mips

我已经做了一个循环来存储用户输入和另一个循环打印出来,但我的输出显示了不同的东西。我不确定我是否正确存储记录?请咨询。

这是我的输出。为了测试我只有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 

回答

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代替

相关问题