打印时在s0寄存器上出错

时间:2016-09-11 03:31:07

标签: assembly mips

我的代码中存在异常行为,我无法弄清楚

        .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,则程序会出错。

1 个答案:

答案 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寄存器。