我应该存储一个包含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
答案 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
并且,在加载/存储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
而不是