保存 Caller saved 寄存器 的动作,是硬件行为,还是软件行为?

查看 77|回复 6
作者:amiwrong123   
我们知道 arm 体系或 x86 体系中(我比较关心 arm ),在进行函数调用时,会区分 Caller saved 和 Callee saved (就是把通用寄存器划分为两个范围)。
软件行为我是指:我在汇编代码中能够看到保存的过程(就是入栈和出栈)。比如在被调用的函数( Callee )里如果改变了 Callee saved 寄存器,那么在 这个函数里的开头结尾,就会分别出一个 入栈保存和出栈恢复 的操作(如果没有改变 Callee saved 寄存器,那么就不会多这两个操作)。
硬件行为我是指:是 CPU 自动做的,不是我在汇编代码里面能看到的指令。
  • 然后我现在理解,保存 Callee saved 寄存器的行为,应该是一个软件行为。
  • 但,保存 Caller saved 寄存器的行为,是什么行为呢?——如果能附上 arm 文档链接和原话就更好了。

    saved, callee, 寄存, Caller

  • thinkm   
    函数调用是硬件做的,例如像是 RTOS 之类的操作系统入栈出栈是软件做的。
    多年没搞了,记忆中是这样
    leonshaw   
    软件行为,caller 自己才知道哪些需要保存
    bugu1986   
    os 做的
    bugu1986   
    trap 把执行权从硬件给软件
    feather12315   
    一部分硬件,一部分软件。
    准确地说:
    通用寄存是是软件行为,特定的寄存器是硬件行为。
    比如函数调用是软件行为,中断异常的寄存器保存( amd64 下的 rip 、返回地址)是硬件行为
    feather12315   
    arm 的话,返回地址是 r13 还是 r12 。
    这个要查手册页了,programming manual 有详细的介绍( arm 的手册很多,要仔细找找,有个 guide 简述了上述过程
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部