x86上的许多操作都隐式地将值写入寄存器 - 例如另外还会更新eflags寄存器。我的问题是:是否可以判断何时不再需要存储在寄存器中的数据?例如,假设我执行一些更新寄存器R1的操作,然后执行1000多个操作然后从R1获取值,期望它是之前存储的值是有效的吗?编译器会生成这样的代码吗? 谢谢!
答案 0 :(得分:6)
在干预操作发生后假设任何有关寄存器的内容都无效。在生成代码时 - 特别是如果您是编译器 - 您知道 R1
是否会通过跟踪您发出的指令导致的每个公共状态更改来更改值。如果您希望保留R1
,则不会发出会覆盖它的指令。
为了更容易跟踪这类事情,编译器遵循conventions:当调用未知代码时,他们保存他们想要保留的寄存器的值,并在返回未知代码后恢复它们。通常约定规定,如果需要覆盖它们,某些寄存器(“callee-save”)将通过未知代码临时存储它们的值;它将负责在返回之前恢复其值。这通过不冗余地存储绝对一切来提高效率。像标志这样的东西通常被认为在执行路径离开你的视线的第二个时间内丢失了。
当编译器没有调用未知代码时,它不需要遵循约定并且可以执行它喜欢的操作。一台机器有一个长而完美的内存,它可以很容易地将寄存器的值保存在千个中间指令中,只需不发出任何会覆盖它的内容。就这么简单。