我的代码中存在异常行为,我无法弄清楚
.data
hello: .asciiz "Hello\n"
msg1: .asciiz "lol"
msg2: .asciiz "msg2"
.text
main:
la $a0, hello
jal print
la $a0, msg1
jal create
move $s1, $v0 #s0
move $a0, $v0
jal print
la $a0, msg2
jal create
move $s2, $v0 #s1
move $a0, $v0
jal print
move $a0, $s1 #s0
move $a1, $s2 #s1
jal append
move $a0, $v0
jal print
li $v0, 10
syscall
在注释的行中,如果我用s0切换s1,用s1切换s2,我的代码不会按照它的方式工作。无论我使用的保存寄存器的其他索引是什么,代码行为都很好,但如果我使用0,则程序会出错。
答案 0 :(得分:2)
这些是32 MIPS寄存器及其功能。
$zero 0 constant value 0
$at 1 assembler temp
$v0 2 funcZon return
$v1 3 funcZon return
$a0 4 argument
$a1 5 argument
$a2 6 argument
$a3 7 argument
$t0 8 temporary value
$t1 9 temporary value
$t2 10 temporary value
$t3 11 temporary value
$t4 12 temporary value
$t5 13 temporary value
$t6 14 temporary value
$t7 15 temporary value
$s0 16 saved temporary
$s1 17 saved temporary
$s2 18 saved temporary
$s3 19 saved temporary
$s4 20 saved temporary
$s5 21 saved temporary
$s6 22 saved temporary
$s7 23 saved temporary
$t8 24 temporary value
$t9 25 temporary value
$k0 26 reserved for OS
$k1 27 reserved for OS
$gp 28 global pointer
$sp 29 stack pointer
$fp 30 frame pointer
$ra 31 return address
$s
和$t
寄存器之间的区别在于$s
寄存器在函数返回后是相同的,而对$t
寄存器不能保证这一点。
如果使用$s
寄存器,则必须保存并恢复其值。例如,如果函数create
使用寄存器$t0
和$s0
然后调用函数print
,则必须保存寄存器$t0
才能使用它在print
返回后。 <{1}}必须保存print
才能开始使用它。
在这种情况下,看起来应该使用$s0
寄存器。