我目前正在上一门涵盖 MIPS ISA 的课程,我注意到的一件事是临时寄存器的分割:
临时寄存器
$t0
至$t7
存储在$8
至$15
中,但$t8
和$t9
存储在$24
和$25
中。这是为什么呢?哪些决定促使 MIPS ISA 设计者不让临时寄存器连续?
在 MIPS 中,$t0 到 $t9 等临时寄存器根据谁负责在函数调用期间保存其值分为两组。
调用者保存的寄存器($t0 到 $t9): 它们用于不需要在函数调用之间保存的临时数据。当一个函数调用另一个函数时,如果稍后需要它们的值,则由调用函数(发出调用的函数)来保存这些寄存器。被调用的函数(被调用者)可以自由更改这些寄存器,因此调用者必须在需要时保存它们。
被调用者保存的寄存器($s0 到 $s7): 这些寄存器用于存储需要在函数调用之间保留的值。如果函数使用这些寄存器,则被调用函数(被调用者)负责保存和恢复它们。这样,调用函数就不会丢失重要的值。
为什么要分裂? 这种拆分有助于使函数调用更加高效:
调用者只需担心在需要时保存临时数据,这减少了它要做的工作。 被调用者确保重要数据保持完整,但它只需保存和恢复真正重要的值。 这种设计有助于避免不必要的工作,并保持函数调用期间的顺利运行。