在 MIPS 汇编中,为什么保存和恢复程序需要使用的已保存寄存器很重要?
In MIPS Assembly, why is it important to save and restore saved registers that need to be used by a procedure?
为什么它很重要,保存的寄存器中的数据究竟会发生什么;它会被删除或被新值覆盖吗?这些新价值从何而来?如果我有什么不清楚的地方,请在下面评论。
当您从任何汇编语言中调用函数、系统调用、过程或任何其他外部代码时,该函数的函数调用定义将为您定义需要保留的寄存器和可能不需要的寄存器保存。通常这被记录为平台、库或语言的标准。你很清楚这一点。你的问题是,"Why?"
当不能保证保留寄存器时,这意味着被调用的函数可以自由地以任何方式操作和更改这些寄存器。与其说它们是"deleted,",不如说它们在函数运行时被更改或覆盖;毕竟,该函数必须使用与您正在使用的相同的寄存器!
另一方面,如果调用需要保留寄存器,那么可以保证在调用 return 代码时它不会被修改。这可能是因为该寄存器未被调用函数使用,但也可能是因为它保存在堆栈(或内存中某处)然后在 return.
之前恢复
为什么它很重要,保存的寄存器中的数据究竟会发生什么;它会被删除或被新值覆盖吗?这些新价值从何而来?如果我有什么不清楚的地方,请在下面评论。
当您从任何汇编语言中调用函数、系统调用、过程或任何其他外部代码时,该函数的函数调用定义将为您定义需要保留的寄存器和可能不需要的寄存器保存。通常这被记录为平台、库或语言的标准。你很清楚这一点。你的问题是,"Why?"
当不能保证保留寄存器时,这意味着被调用的函数可以自由地以任何方式操作和更改这些寄存器。与其说它们是"deleted,",不如说它们在函数运行时被更改或覆盖;毕竟,该函数必须使用与您正在使用的相同的寄存器!
另一方面,如果调用需要保留寄存器,那么可以保证在调用 return 代码时它不会被修改。这可能是因为该寄存器未被调用函数使用,但也可能是因为它保存在堆栈(或内存中某处)然后在 return.
之前恢复