MIPS寄存器的行为有何不同?

时间:2016-11-02 17:11:03

标签: mips cpu-registers

MIPS寄存器的行为有何不同?例如,有保存的寄存器和临时寄存器,它们可以互换使用吗?临时寄存器是否可能被操作系统覆盖,而保存的寄存器不会(因此它们的名称)或纯粹的惯例?

1 个答案:

答案 0 :(得分:2)

MIPS 有 32 个通用寄存器和另外 32 个浮点寄存器。临时寄存器是通用寄存器,可以自由地用于算术和其他指令,而保存的寄存器必须在函数调用期间保持其值。

系统服务调用遵循标准调用约定,临时寄存器 ($t0 - $t9) 可能会被更改,而保存的寄存器 ($s0 - $s7, $fp, $ra) 将被保留。

>

整数寄存器 $t0 - $t9 和浮点寄存器 $f4 - $f10 和 $f16 - $f18(单精度或双精度)用于保存不需要跨过程调用保留的临时数量。< /p>

因此,如果在循环中打印一系列值,则循环计数器和当前数组地址/索引将需要保存的寄存器。

示例: 调用函数时,约定保证 $s 寄存器在返回后相同,而约定不保证 $t 寄存器如此。

.data
newline: .asciiz "\n"
.text
.globl main

main:
addi $s0, $zero, 5
# li $t0, 5

jal increment 


li $v0, 4
la $a0, newline    #print newline string
syscall

move $a0, $s0       #print saved register after calling function --> output = 5
li $v0, 1        
syscall

end:
li $v0, 10
syscall

increment:
addi, $sp, $sp, -4      # to store old value of--> -4 because store in 4 bytes (allocated in stack)
sw $s0, 0($sp)          # save the value of $s0 to the first location in stack pointer  

addi $s0, $s0, 1        # add 1 

move $a0, $s0
li $v0, 1               #print saved register after calling function  --> output = 6
syscall

lw $s0, 0($sp)          # will load previous value 
addi $sp, $sp, 4

jr $ra

即使保存的寄存器值在函数中增加了,函数结束后我们仍然可以访问原始值。