Holdec 1.2

  • fully supported: the decompiler knows what the inputs and outputs (register, flags, memory location) are and how the output is calculated
  • adc, add, and, bsf, bsr, bt, btc, btr, bts, call, cbw, clc,
    cld, cli, cmc, cmovcc, cmp, cmps, cmpxchg, cwd, dec, div,
    enter, idiv, imul, inc, iret, jcc, jcxz/jecxz, jmp, lahf,
    lea, leave, lods, loop, mov, movs, movsx, movzx, mul, neg,
    nop, not, or, pop, popa, popf, push, pusha, pushf, rol,
    ror, rcl, rcr, shl, shr, sar, ret, sahf, sbb, scas, setcc,
    shld, shrd, stc, std, sti, stos, sub, test, xadd, xchg,
    xlat, xor, xadd
    • input/output supported: the decompiles knows what the inputs and outputs are and uses a builtin function in the decompiled source code
    aaa, aad, aam, aas, bound, bswap, cmpxchg8b, cpuid, daa,
    das, in, ins, int, out, outs, rdtsc, rep
    • unsupported: nothing is known about these opcodes and they are modeled as inline assembler
    arpl, clts, enter, hlt, lar, lgdt, lidt,
    lds/les/lfs/lgs/lss, lldt, lmsw, lsl, ltr, sgdt, sidt,
    sldt, smsw, str, verr, verw, wait, invd, invlpg, wbinvd,
    rdmsr, wrmsr
    The complete list of changes:
    • feature: support (in various levels) hopefully all x86 opcodes excluding FPU, x64, MMX, SSE
    • feature: add –help command line option
    • feature: add –hide-addresses command line option
    • feature: -c supports now multiple functions which are matched on function name with a regexp
    • feature: differ between three different types of undefined values: cpu opcode results in undefined value, not modeled by the decompiler and trashed by a function call
    • feature: add new type ‘bit’ to the external type system
    • feature: simplify cond?0:1 to BIT_TO_INT(!cond) and cond?1:0 to BIT_TO_INT(cond)
    • feature: simplify x-y>42 to x>y+42
    • feature: a new file ‘symbol_table.txt’ is written in current directory after each run
    • feature: support ‘pc’ in the m68k code
    • change: use register names with two letters if required e.g. ‘reg_da’
    • change: replace builtin functions prefix from ‘intern_’ to ‘holdec
    • change: create names according their definition place; this should make generated names more repeatable
    • change: rework how concrete numbers are treated internally
    • change: treat signed and unsigned comparisons different internally
    • change: format numbers depending on the context (bit context -> unsigned hex, signed context -> signed decimal, unsigned and unknown context -> unsigned decimal)
    • change: rework the SSA generation to use an algorithm based on Aycock and Horspool
    • change: do not convert tail controlled loops with a fixed number of iterations to a for(…) loop
    • fix: only issue a warning and do not die if a jump with a constant false condition is removed
    • fix: add dummy values for local->register converted variables without an initial assignment
    One of the things I have learned is that a signed shift right is not equivalent to a signed divide. ]]>

    This entry was posted in decompiler, holdec and tagged . Bookmark the permalink.

    Leave a Reply

    Your email address will not be published. Required fields are marked *