Caller-saved register(又名易失性寄存器AKA volatile registers, or call-clobbered)用于保存不需要在各个调用之间保留的临时数据。
因此,如果要在过程调用后恢复该值,则调用方有责任将这些寄存器压入堆栈或将其复制到其他位置。不过,让调用销毁这些寄存器中的临时值是正常的。从被调用方的角度来看,您的函数可以自由覆盖(也就是破坏)这些寄存器,而无需保存/恢复。Or you have to understand that "caller-saved" means "saved somehow if you want the value later".
Callee-saved register(又称非易失性寄存器AKA non-volatile registers, or call-preserved)用于保存应在每次调用中保留的长寿命值。
当调用者进行过程调用时,可以期望这些寄存器在被调用者返回后将保持相同的值,这使被调用者有责任在返回调用者之前保存它们并恢复它们, 还是不要碰它们。
Callee vs caller saved 的约定是约定谁负责在整个调用中保存和恢复寄存器中的值。所有寄存器都是“全局”的,因为任何地方的任何代码都可以看到(或修改)一个寄存器,而这些修改将被任何以后的任何代码看到。 寄存器保存约定的重点是,不应将代码修改某些寄存器,而其他代码则假定未修改该值。
寄存器从硬件上都是一样的,但是为了软件的正确性和协同工作,对寄存器进行了区分。所有软件在x86上都需要遵循一样的规则才能保证正确性。该谁保存就谁保存
“ 调用者保存”( caller saving )方法:如果采用调用者保存策略,那么在一个调用者调用别的过程时,必须保存调用者所要保存的寄存器,以备调用结束返回后,能够再次访问调用者。
“ 被调用者保存”( callee saving )方法:如果采用被调用者保存策略,那么被调用的过程必须保存它要用的寄存器,保证不会破坏过程调用者的程序执行环境,并在过程调用结束返回时,恢复这些寄存器的内容。
被调用者保存 更为简单通用