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