diff options
Diffstat (limited to 'miasm2/arch/arm/sem.py')
| -rw-r--r-- | miasm2/arch/arm/sem.py | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/miasm2/arch/arm/sem.py b/miasm2/arch/arm/sem.py index 4af177d2..b5ab60d0 100644 --- a/miasm2/arch/arm/sem.py +++ b/miasm2/arch/arm/sem.py @@ -1089,7 +1089,7 @@ def cbnz(ir, instr, a, b): e = [] loc_next = ir.get_next_loc_key(instr) loc_next_expr = ExprLoc(loc_next, 32) - e.append(ir.IRDst, ExprCond(a, b, loc_next_expr)) + e.append(ExprAssign(ir.IRDst, ExprCond(a, b, loc_next_expr))) return e, [] @@ -1190,6 +1190,12 @@ def uxtab(ir, instr, a, b, c): return e, [] +def uxtah(ir, instr, a, b, c): + e = [] + e.append(ExprAssign(a, b + (c & ExprInt(0xffff, 32)))) + return e, [] + + def bkpt(ir, instr, a): e = [] e.append(ExprAssign(exception_flags, ExprInt(EXCEPT_SOFT_BP, 32))) @@ -1294,6 +1300,13 @@ def rev(ir, instr, a, b): return e, [] +def rev16(ir, instr, a, b): + e = [] + result = ExprCompose(b[8:16], b[:8], b[24:32], b[16:24]) + e.append(ExprAssign(a, result)) + return e, [] + + def nop(ir, instr): e = [] return e, [] @@ -1328,6 +1341,10 @@ def wfi(ir, instr): e = [] return e, [] +def adr(ir, instr, arg1, arg2): + e = [] + e.append(ExprAssign(arg1, (PC & ExprInt(0xfffffffc, 32)) + arg2)) + return e, [] COND_EQ = 0 COND_NE = 1 @@ -1494,8 +1511,10 @@ mnemo_condm0 = {'add': add, 'ubfx': ubfx, 'bfc': bfc, 'rev': rev, + 'rev16': rev16, 'clz': clz, 'uxtab': uxtab, + 'uxtah': uxtah, 'bkpt': bkpt, 'smulbb': smul, 'smulbt': smul, @@ -1579,6 +1598,7 @@ mnemo_nocond = {'lsr': lsr, 'cpsid': cpsid, 'wfe': wfe, 'wfi': wfi, + 'adr': adr, 'orn': orn, 'smlabb': smlabb, 'smlabt': smlabt, @@ -1706,7 +1726,7 @@ class ir_arml(IntermediateRepresentation): # Gen dummy irblock for IT instr loc_next = self.get_next_loc_key(instr) - dst = ExprAssign(self.IRDst, ExprId(loc_next, 32)) + dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32)) dst_blk = AssignBlock([dst], instr) assignments.append(dst_blk) irblock = IRBlock(loc, assignments) @@ -1743,7 +1763,7 @@ class ir_arml(IntermediateRepresentation): if split: raise NotImplementedError("Unsupported instr in IT block (%s)" % instr) - dst = ExprAssign(self.IRDst, ExprId(loc_next, 32)) + dst = ExprAssign(self.IRDst, ExprLoc(loc_next, 32)) dst_blk = AssignBlock([dst], instr) assignments.append(dst_blk) irblock = IRBlock(loc, assignments) |