【问题标题】:Byte operations decompile字节操作反编译
【发布时间】:2012-11-06 15:16:01
【问题描述】:

所以我很讨厌那些“标志”和字节操作,所以这里是汇编代码:

loc_4097F5:
   .text:004097F5     cmp     [esi+1Bh], dl
   .text:004097F8     jnz     short loc_409812
   .text:004097FA     cmp     [esi+6], dl
   .text:004097FD     jnz     short loc_409812
   .text:004097FF     mov     ecx, [ebp+490h]
   .text:00409805     test    cl, 2 ; How to represent this????
   .text:00409808     jz      short loc_40980F
   .text:0040980A     test    ch, 1 ; How to represent this????
   .text:0040980D     jz      short loc_409812
   .text:0040980F loc_40980F:                        
   .text:0040980F     mov     [esi+25h], dl
   .text:00409812 loc_409812:                      
   .text:00409812     mov     ecx, [esp+18h+arg_0]
   .text:00409816     cmp     [ecx+8Ch], eax

这是反编译器产生的伪代码:

v13 = a3->field_454.TextureCaps;
  if ( !(v13 & 2) || BYTE1(v13) & 1 )
    *(_BYTE *)(v5 + 37) = v3;

任何想法如何为 VC++ 6.0 编译器表示这个(编译此代码)??

编辑:实际上 a3->field_454 是一个 D3DCAPS9 结构。

【问题讨论】:

    标签: visual-c++ assembly reverse decompiler


    【解决方案1】:

    不知道你还需要什么,除了反编译版本中已经存在的东西。 您当然可以在 d3d 标头中查找 TextureCaps 标志位,以更了解这一点。我相信这是正确的:

    if (!(TextureCaps & D3DPTEXTURECAPS_POW2) || (TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL))
    

    因此,它正在测试是否无条件支持非二次幂纹理(如果支持,则条件评估为true)。 另请参阅相关的msdn page

    【讨论】:

    • 奇怪的是我在这里读到:en.wikipedia.org/wiki/TEST_(x86_instruction) 如果“如果 AND 的结果为 0,则 ZF 设置为 1,否则设置为 0。”但它似乎是相反的......无论如何这有效!谢谢!
    • @sasho648:不,那是正确的,这正是代码的作用。如果第一个AND 结果为0,则执行0040980F 处的指令。否则,如果第二个 AND 结果为 0,则该指令将被绕过,因为代码会直接跳转到 00409812。因此,要执行该指令,第一个 AND 必须产生 0 ,第二个 AND 必须产生非 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2011-04-12
    • 2011-09-20
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多