首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >寄存器使用跟踪x86

寄存器使用跟踪x86
EN

Stack Overflow用户
提问于 2017-06-24 16:40:31
回答 1查看 396关注 0票数 2

我有一个应用程序的汇编指令列表,我想知道哪些寄存器可以自由使用,哪些寄存器在列表的任何索引中使用。

我如何知道寄存器何时被使用,何时被释放(免费再次使用)?我的目标是到达真正免费的寄存器。

这是我解决这个问题的假设,这听起来可能很愚蠢,因为我对装配的知识非常有限。

术语:读(源),写(目的)

  1. 将所有指令标记为写入或读取每个寄存器(使用http://ref.x86asm.net/coder32.html表示所有信息如前所述)。
  2. 跟踪所有的读和写操作到寄存器,并找出它什么时候可以免费使用。示例:
    • 寄存器X是由一条指令在5点写的。
    • 寄存器X正在由指令在8点读取。
    • 寄存器X是由一条指令在15点写的。
    • 我可以说,寄存器X不是在8-15之间读取,而是在15时重新分配,这意味着它在指令8和15之间是自由的,但在5-8之间是繁忙的。

它能解决问题吗?还是说得通?我也对其他解决方案持开放态度。

注释后的更新:

我看到JMPS/调用/条件移动把所有这些都搞砸了。为了确保它的安全(安全=空闲寄存器是真正免费的),做这样的事情怎么样:当我看到任何跳转/调用/有条件的移动到外部时,我用哈罗德描述的最悲观的假设将所有寄存器标记为“正在读取”。我相信,在这种情况下,我会有更安全的结果,尽管它不会很好,因为注册将在大多数时间处于繁忙状态。你能同意我的结果那样是安全的吗?

Instructions

  • 指令1:写到寄存器X。
  • 指令3:条件JMP / MOV / CALL。
  • 指令5:写到寄存器X。
  • 指令8:从寄存器X读取。
  • 指令15 :写到寄存器X。

结果

  • 在1-3之间:寄存器X很忙,因为我数到外部迁移在3读。
  • 3-5之间:寄存器X是免费的,因为没有更多的阅读.
  • 5-8 :寄存器X很忙,因为在8点有一个读取操作.
  • 8-15 :注册X是免费的。

更新2

相反,我将将应用程序分成基本块,其中每个块表示跳转(也是有条件的)、调用和返回之间的代码块。跳转语句将是块的结尾。然后,我将分析每个块,假设所有寄存器在开始时都在使用。我可能会错过很多免费的寄存器,但当我得到一个,我就会知道它是真正免费的。

更新3

我仍在努力改进基于反馈的解决方案(谢谢哈罗德)。

我读过活性分析,据我了解,建议从应用程序结束到开始进行分析。但是,我不知道在编译后的程序集中应用程序的结尾,就像下面的注释中提到的停止问题一样,所以我将对将来的分支做相反的处理。

  1. 如所述,标记所有指示。读=源,写=目的地。条件移动被计算为对源的读取和对目标的写入。
  2. 将所有指令分块。使用任何有条件的或直接的分支出口来分割它们。
  3. 将所有块链接到彼此,每个块都有may_continue_with容器,其中包含指向可能继续使用的分支的指针。
  4. 如果寄存器X在A索引处是空闲的,请询问一个块。块检查索引A之后对寄存器X的第一次访问是否是读或写操作。首先,它检查自己的指令,如果它没有发现在寄存器上运行的任何指令,它会向将来的分支机构提出同样的问题。(未来的分支会进一步询问它们是否也没有访问寄存器X的指令)。块返回:
    • false (如果未来的任何分支已经先读取访问权限)
    • 如果所有未来的分支都有先写访问权(仅一个分支是不够的,因为我们不知道哪个分支将被执行),则是真正的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-24 17:08:56

第1步很简单,实际上需要做大量的工作(需要解析x86机器代码),有些库可能会对此有所帮助。

第二步并不像你让它听起来那么容易,因为控制流。在控制流简单的假设下,活性分析是一个众所周知的问题。不过,在这种情况下还有一些额外的问题。

  • 可以调用输入寄存器尚未确定的过程。这主要是由于不走运的订货,处理程序深度-第一,减少了问题。但是,由于(相互)递归,不一定会出现这样的问题。你可以做程序间活性分析来解决这个问题。
  • 可以调用未知过程(虚拟方法或通过函数指针进行显式调用)。我不认为你能做什么,除了做一个极度悲观的假设。
  • 甚至过程内控制流也可能是不可预测的,例如当switch被编译到跳转表时。实际上,并不能保证变量跳转一开始是跨过程的,您很可能会假设..。我真的不知道该怎么办。

然后,我将分析每个块,假设所有寄存器在开始时都在使用。

这是一个巨大的浪费,通过执行适当的活性分析可以很容易地避免这种浪费。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44738655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档