MIPS寄存器的行为有何不同?例如,有保存的寄存器和临时寄存器,它们可以互换使用吗?临时寄存器是否可能被操作系统覆盖,而保存的寄存器不会(因此它们的名称)或纯粹的惯例?
答案 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
即使保存的寄存器值在函数中增加了,函数结束后我们仍然可以访问原始值。