Compiler construction 被调用方是否在调用方传递已用寄存器的情况下保存?
在编译器设计中,为什么调用方不能将其已用寄存器列表(在调用方保存协议的情况下会推送)传递给被调用方,而不是使用调用方或被调用方寄存器保存协议,以便被调用方可以将其已用寄存器列表与调用方使用的寄存器进行比较。然后,只有真正需要推送的寄存器才会被推送。我遗漏了什么吗?效率很低。。。您将需要解析列表(对于每个函数!),这是完全不必要的。这是一个有趣的想法。我认为有两件事使它不那么吸引人:Compiler construction 被调用方是否在调用方传递已用寄存器的情况下保存?,compiler-construction,cpu-registers,register-allocation,Compiler Construction,Cpu Registers,Register Allocation,在编译器设计中,为什么调用方不能将其已用寄存器列表(在调用方保存协议的情况下会推送)传递给被调用方,而不是使用调用方或被调用方寄存器保存协议,以便被调用方可以将其已用寄存器列表与调用方使用的寄存器进行比较。然后,只有真正需要推送的寄存器才会被推送。我遗漏了什么吗?效率很低。。。您将需要解析列表(对于每个函数!),这是完全不必要的。这是一个有趣的想法。我认为有两件事使它不那么吸引人: 无论如何,被调用方必须为最坏的情况保留堆栈空间 为了提高效率,您需要一次存储和加载寄存器集的特殊指令。摩托罗拉6
- 无论如何,被调用方必须为最坏的情况保留堆栈空间
- 为了提高效率,您需要一次存储和加载寄存器集的特殊指令。摩托罗拉68000(可能还有PowerPC)上有这样的指令,但它们并不流行
有关呼叫者保存和被呼叫者保存寄存器之间权衡的更多信息,请参阅。感谢您详尽的回答!你有真正的联系吗?通过TinyURL重定向给了我一个关于cookie错误的页面,TinyURL不会透露原始内容。@Edmund:很抱歉,我一定是在工作时写下了答案,并在不知不觉中链接到了支付网站。我已经更改了链接。