我有一个应用程序的汇编指令列表,我想知道哪些寄存器可以自由使用,哪些寄存器在列表的任何索引中使用。
我如何知道寄存器何时被使用,何时被释放(免费再次使用)?我的目标是到达真正免费的寄存器。
这是我解决这个问题的假设,这听起来可能很愚蠢,因为我对装配的知识非常有限。
术语:读(源),写(目的)
它能解决问题吗?还是说得通?我也对其他解决方案持开放态度。
注释后的更新:
我看到JMPS/调用/条件移动把所有这些都搞砸了。为了确保它的安全(安全=空闲寄存器是真正免费的),做这样的事情怎么样:当我看到任何跳转/调用/有条件的移动到外部时,我用哈罗德描述的最悲观的假设将所有寄存器标记为“正在读取”。我相信,在这种情况下,我会有更安全的结果,尽管它不会很好,因为注册将在大多数时间处于繁忙状态。你能同意我的结果那样是安全的吗?
Instructions
结果:
更新2
相反,我将将应用程序分成基本块,其中每个块表示跳转(也是有条件的)、调用和返回之间的代码块。跳转语句将是块的结尾。然后,我将分析每个块,假设所有寄存器在开始时都在使用。我可能会错过很多免费的寄存器,但当我得到一个,我就会知道它是真正免费的。
更新3
我仍在努力改进基于反馈的解决方案(谢谢哈罗德)。
我读过活性分析,据我了解,建议从应用程序结束到开始进行分析。但是,我不知道在编译后的程序集中应用程序的结尾,就像下面的注释中提到的停止问题一样,所以我将对将来的分支做相反的处理。
may_continue_with
容器,其中包含指向可能继续使用的分支的指针。
发布于 2017-06-24 17:08:56
第1步很简单,实际上需要做大量的工作(需要解析x86机器代码),有些库可能会对此有所帮助。
第二步并不像你让它听起来那么容易,因为控制流。在控制流简单的假设下,活性分析是一个众所周知的问题。不过,在这种情况下还有一些额外的问题。
switch
被编译到跳转表时。实际上,并不能保证变量跳转一开始是跨过程的,您很可能会假设..。我真的不知道该怎么办。然后,我将分析每个块,假设所有寄存器在开始时都在使用。
这是一个巨大的浪费,通过执行适当的活性分析可以很容易地避免这种浪费。
https://stackoverflow.com/questions/44738655
复制相似问题