繁体   English   中英

通过mips将记录存储在数组中

[英]Storing records in an array wtih mips

我应该存储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,Record [每次迭代]。 这会将基本指针[在$a1 ]重置为记录数组的开头。 该语句应移至loop:上方loop:

而且,循环底部的$a1增量太小。 您所需要的至少是记录总大小。 认为您的记录如下:

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

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

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

而且,我相信您存储记录的循环还有更多问题。

特别是,读取名称的syscall不正确。 您需要设置:

    # 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM