Compiler construction 如何使用SSA表单处理数据流分析中的别名寄存器?(例如x86中的EAX/AX/AH/AL)

Compiler construction 如何使用SSA表单处理数据流分析中的别名寄存器?(例如x86中的EAX/AX/AH/AL),compiler-construction,x86,alias,dataflow,ssa,Compiler Construction,X86,Alias,Dataflow,Ssa,对于exmaple: 如何在中表示以下x86: 通过介绍一些伪函数,我得出: eax@1 = eax@0 ^ eax@0 ax@1 = LOWORD(eax@1) al@1 = LOBYTE(ax@1) ah@1 = HIBYTE(ax@1) hax@1 = HIWORD(eax@1) ax@2 = ax@1 + 1 eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1)) al@2 = LOBYTE(ax@2) ah@2 = HIBYTE(ax@2) 但是我觉得用你的符

对于exmaple:

如何在中表示以下x86:

通过介绍一些伪函数,我得出:

eax@1 = eax@0 ^ eax@0
ax@1 = LOWORD(eax@1)
al@1 = LOBYTE(ax@1)
ah@1 = HIBYTE(ax@1)
hax@1 = HIWORD(eax@1)

ax@2 = ax@1 + 1
eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1))
al@2 = LOBYTE(ax@2)
ah@2 = HIBYTE(ax@2)
但是我觉得用你的符号太冗长了

  • eax@0 = ... 不管以前这里发生了什么
  • eax@1=0
  • ax@2 = ax@1+1
  • 因为eax包含ax,所以在2和3之间有一个隐式步骤

  • eax@0=
  • eax@1=0
  • ax@1=0(因为如果eax为零,则ax不能为非零)
  • ax@2 = ax@1+1
  • 第2步,因为任何与自身异或的数字都是0。。。eax@0在那一点上是死的,因此eax@1可以重命名(使用ebx作为重命名以便可读;显然,您将使用虚拟寄存器,而不是真实寄存器):

  • ---已删除,eax不再相关
  • ebx@0=0
  • bx@0=0
  • bx@1 = bx@0+1
  • 然后您可以注意到,由于步骤3是一个常量函数,因此步骤4(将常量添加到常量)也是一个常量函数,并将两者压缩在一起(即常量折叠)

  • --已删除,eax不再相关
  • ebx@0=0
  • bx@0=1

  • 如果ebx的上16位不能控制下面的任何内容,您也可以删除第2步。

    您所说的“SSA形式”是什么意思?@Eli Bendersky:没有任何简化的建议,但我很好奇这是在哪里使用的。您是否正在尝试优化/转换现有的已编译应用程序?****看看上面的例子,您不需要在每一步都保持eax、ax、al和ah的同步吗。例如,如果下一条指令是一个条件分支,其中一条路径使用ax,另一条路径使用eax,该怎么办?然后,您需要更加详细地更新此注册表的所有版本@Gautham Ganapathy:我正在反编译(严重混淆)二进制文件。对于分支,SSA引入了phi函数,详情请参见wiki。是的,你说得对。我试图避免冗长,但冗长可能是SSA的特点。
    eax@1 = eax@0 ^ eax@0
    ax@1 = LOWORD(eax@1)
    al@1 = LOBYTE(ax@1)
    ah@1 = HIBYTE(ax@1)
    hax@1 = HIWORD(eax@1)
    
    ax@2 = ax@1 + 1
    eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1))
    al@2 = LOBYTE(ax@2)
    ah@2 = HIBYTE(ax@2)