Пример #1
0
def alias_SMADDL(i):
    m = mnemo(i)
    r = regs(i)
    if i.a == 0:
        m = tok_mnemo("smull")
        r.pop()
    return m + TokenListJoin(", ", r)
Пример #2
0
def alias_UMSUBL(i):
    m = mnemo(i)
    r = regs(i)
    if i.a == 0:
        m = tok_mnemo("umnegl")
        r.pop()
    return m + TokenListJoin(", ", r)
Пример #3
0
def alias_AND(i):
    m = mnemo(i)
    r = regs(i)
    if i.setflags and i.d == 0:
        m = tok_mnemo("tst")
        r = r[1:]
    return m + TokenListJoin(", ", r)
Пример #4
0
def ops(i):
    s = []
    for o in i.operands:
        if o._is_slc:
            assert i.BW
            o = o.x
        if o._is_reg:
            s.append((Token.Register, str(o)))
        elif o._is_cst:
            s.append((Token.Constant, '#%s' % o))
        else:
            assert o._is_mem
            a = o.a.base
            disp = o.a.disp
            if disp == 0 and a._is_reg:
                if i.misc['autoinc'] is a:
                    s.append((Token.Memory, '@%s+' % a))
                else:
                    s.append((Token.Memory, '@%s' % a))
            elif a._is_cst:
                a.sf = False
                s.append((Token.Memory, '&%s' % a))
            else:
                if a._is_eqn:
                    l, r = a.l, a.r
                else:
                    l, r = a, disp
                if l == pc and i.address:
                    s.append((Token.Address, '*%s' % (i.address + r)))
                else:
                    s.append((Token.Memory, '%s(%s)' % (r, l)))
    return TokenListJoin(', ', s)
Пример #5
0
def alias_EXTR(i):
    m = mnemo(i)
    r = regs(i)
    if i.n is i.m:
        m = tok_mnemo("ror")
        r.pop(1)
    return m + TokenListJoin(", ", r)
Пример #6
0
def alias_ORN(i):
    m = mnemo(i)
    r = regs(i)
    if i.n == 0:
        m = tok_mnemo("mvn")
        r.pop(1)
    return m + TokenListJoin(", ", r)
Пример #7
0
def alias_SBC(i):
    m = mnemo(i)
    r = regs(i)
    if i.n == 0:
        m = m[0][1].replace("sbc", "ngc")
        m = tok_mnemo(m)
        r.pop(1)
    return m + TokenListJoin(", ", r)
Пример #8
0
def alias_CSNEG(i):
    m = mnemo(i)
    r = regs(i)
    if i.n is i.m:
        if i.cond >> 1 != 0b111:
            m = tok_mnemo("cneg")
            r = r[:2]
            r.append((Token.Literal, "%s" % CONDITION[i.cond ^ 1][0]))
    return m + TokenListJoin(", ", r)
Пример #9
0
def alias_BFM(i):
    r = regs(i)
    if i.imms < i.immr:
        r[3] = (Token.Constant, str(i.immr + 1))
        r[2] = (Token.Constant, str(-i.imms % i.datasize))
        m = tok_mnemo("bfi")
    else:
        r[3] = (Token.Constant, str(i.imms - i.immr + 1))
        m = tok_mnemo("bfxil")
    return m + TokenListJoin(", ", r)
Пример #10
0
def alias_ADD(i):
    m = mnemo(i)
    r = regs(i)
    if not i.setflags:
        if (i.d == 0 or i.n == 0) and i.operands[-1] == 0:
            m = tok_mnemo("mov")
            r.pop(0)
    elif i.setflags and i.d == 0:
        m = tok_mnemo("cmn")
        r = r.pop(0)
    return m + TokenListJoin(", ", r)
Пример #11
0
def alias_CSINV(i):
    m = mnemo(i)
    r = regs(i)
    if i.n is i.m:
        if i.cond >> 1 != 0b111:
            if i.n != 0:
                m = tok_mnemo("cinv")
                r = r[:2]
            else:
                m = tok_mnemo("csetm")
                r = r[:1]
            r.append((Token.Literal, "%s" % CONDITION[i.cond ^ 1][0]))
    return m + TokenListJoin(", ", r)
Пример #12
0
def alias_SUB(i):
    m = mnemo(i)
    r = regs(i)
    if not i.setflags:
        if i.n == 0:
            m = tok_mnemo("neg")
            r.pop(1)
    elif i.setflags:
        if i.d == 0:
            m = tok_mnemo("cmp")
            r.pop(1)
        elif i.n == 0:
            m = tok_mnemo("negs")
            r.pop(1)
    return m + TokenListJoin(", ", r)
Пример #13
0
def alias_SBFM(i):
    m = mnemo(i)
    r = regs(i)
    if i.imms == i.datasize - 1:
        r.pop()
        m = tok_mnemo("asr")
    elif i.imms < i.immr:
        m = tok_mnemo("sbfiz")
        r[3] = (Token.Constant, str(i.immr + 1))
        r[2] = (Token.Constant, str(-i.imms % i.datasize))
    elif i.immr == 0:
        if i.immr == 7:
            m = tok_mnemo("sxtb")
        if i.immr == 15:
            m = tok_mnemo("sxth")
        if i.immr == 31:
            m = tok_mnemo("sxtw")
        r.pop(1)
    return m + TokenListJoin(", ", r)
Пример #14
0

def specreg(i):
    spec_reg = "%s_" % apsr
    if i.write_nzcvq:
        spec_reg += "nzcvq"
    if i.write_g:
        spec_reg += "g"
    return [(Token.Register, "%s, %s" % (i.operands[0], spec_reg))]


def reglistcomma(i):
    return ", " if len(i.operands) > 1 else ""


format_allregs = [lambda i: TokenListJoin(", ", regs(i))]
format_default = [mnemo] + format_allregs
format_sreg = format_default
format_label = [mnemo, label]
format_adr = [mnemo, lambda i: regs(i, 1), ", ", lambda i: label(i, 1)]
format_bits = format_default
format_reglist = [
    mnemo,
    (lambda i: TokenListJoin(", ", regs(i, -1))),
    reglistcomma,
    reglist,
]
format_deref = [
    mnemo, lambda i: TokenListJoin(", ",
                                   regs(i, -2) + deref(i, -2))
]
Пример #15
0
    _pc = i.address
    if _pc is None:
        _pc = pc
    if i.operands[0]._is_ext:
        return [(Token.Address, str(i.operands[0].ref))]
    if i.operands[0]._is_reg:
        return [(Token.Register, "%%%s" % (i.operands[0].ref))]
    if i.operands[0]._is_cst:
        offset = i.operands[0].signextend(32) * 4
        target = i.misc["dst"] or (_pc + offset)
        return [(Token.Address, str(target))]
    raise TypeError("operand type not supported")


format_ld = [
    mnemo, lambda i: TokenListJoin(", ",
                                   deref(i.operands[0]) + regn(i, 1))
]
format_st = [
    mnemo, lambda i: TokenListJoin(", ",
                                   regn(i, 0) + deref(i.operands[1]))
]
format_logic = [
    mnemo_icc,
    lambda i: TokenListJoin(
        ", ",
        regn(i, 0) + reg_or_imm(i.operands[1], "%#x") + regn(i, 2)),
]
format_sethi = [
    mnemo,
    lambda i: TokenListJoin(", ",
                            reg_or_imm(i.operands[0]) + regn(i, 1)),
Пример #16
0
    if offset._is_cst:
        ostr = '#%c%d' % (sign, offset.value)
    else:
        ostr = sign + str(offset)
    loc = [(Token.Memory, '[%s, %s]' % (base, ostr))]
    return m + loc


def specreg(i):
    spec_reg = "%s_" % apsr
    if i.write_nzcvq: spec_reg += 'nzcvq'
    if i.write_g: spec_reg += 'g'
    return [(Token.Register, '%s, %s' % (i.operands[0], spec_reg))]


format_allregs = [lambda i: TokenListJoin(', ', regs(i))]
format_default = [mnemo] + format_allregs
format_sreg = format_default
format_label = [mnemo, label]
format_adr = [mnemo, lambda i: regs(i, 1), lambda i: label(i, 1)]
format_bits = format_default
format_reglist = [mnemo, (lambda i: TokenListJoin(', ', regs(i, -1))), reglist]
format_deref = [
    mnemo, lambda i: TokenListJoin(', ',
                                   regs(i, -2) + deref(i, -2))
]
format_plx = [plx]
format_msr = [mnemo, specreg]
format_setend = [setend]

ARM_V7_full_formats = {
Пример #17
0
    0b0011: 'tl',
    0b1100: 'tgu',
    0b0100: 'tleu',
    0b1101: 'tcc',
    0b0101: 'tcs',
    0b1110: 'tpos',
    0b0110: 'tneg',
    0b1111: 'tvc',
    0b0111: 'tvs'
}

CONDxB = {'b': CONDB, 'fb': CONDFB, 'cb': CONDCB}

mnemo = lambda i: [(Token.Mnemonic, '{i.mnemonic}'.format(i=i))]
format_mn = [mnemo]
format_regs = [mnemo, lambda i: TokenListJoin(', ', regs(i))]
format_ld = [
    mnemo, lambda i: TokenListJoin(', ',
                                   deref(i.operands[0]) + regn(i, 1))
]
format_st = [
    mnemo, lambda i: TokenListJoin(', ',
                                   regn(i, 0) + deref(i.operands[1]))
]
format_logic = [
    mnemo_icc, lambda i: TokenListJoin(
        ', ',
        regn(i, 0) + reg_or_imm(i.operands[1], '%#x') + regn(i, 2))
]
format_sethi = [
    mnemo, lambda i: TokenListJoin(', ',
Пример #18
0
def alias_SBC(i):
    m = mnemo(i)
    r = regs(i)
    if i.n == 0:
        m = m[0][1].replace("sbc", "ngc")
        m = tok_mnemo(m)
        r.pop(1)
    return m + TokenListJoin(", ", r)


condreg = lambda i: [(Token.Literal, "'%s'" % CONDITION[i.cond][0])]
allregs = LambdaTokenListJoin(", ", regs)
format_default = [mnemo, LambdaTokenListJoin(", ", regs)]
format_ld_st = [
    mnemo, lambda i: TokenListJoin(", ",
                                   regs(i, -2) + deref(i, -2))
]
format_B = [mnemo, label]
format_ADR = [
    mnemo, lambda i: TokenListJoin(", ", i.operands[0].toks() + label_adr(i))
]
format_CBx = [mnemo, lambda i: TokenListJoin(", ", i.t.toks() + label(i, 1))]
format_CCMx = [
    mnemo, lambda i: TokenListJoin(", ", regs(i, 2)), lambda i: i.flags.toks(),
    condreg
]

ARM_V8_full_formats = {
    "A64_generic": format_default,
    "A64_load_store": format_ld_st,
    "A64_adr": format_ADR,
Пример #19
0
 def subr(i, pos=pos):
     o = i.operands[pos]
     L = [(Token.Literal, "{")]
     L += TokenListJoin(", ", [(Token.Register, "{0}".format(x)) for x in o])
     L += [(Token.Literal, "}")]
     return L
Пример #20
0
 def subf(i, L=args):
     X = []
     for l in L:
         X.extend(l(i))
     return TokenListJoin(", ", X)
Пример #21
0
 def subr(i,pos=pos):
     o = i.operands[pos]
     L = [(Token.Literal,'{')]
     L += TokenListJoin(', ',[(Token.Register,'{0}'.format(x)) for x in o])
     L += [(Token.Literal,'}')]
     return L