def emit_mov(ir, instr, a, b):
    # movの中間表現を生成
    instr_ir, extra_ir = sem.mov(ir, instr, a, b)
    # カウンタをインクリメントする中間表現を追加
    dst = expr.ExprMem(expr.ExprInt64(ADDR_COUNTER), 64)
    new_value = dst + expr.ExprInt64(1)
    instr_ir.append(expr.ExprAff(dst, new_value))
    return instr_ir, extra_ir
Ejemplo n.º 2
0
def emit_syscall(ir, instr):
    e = []
    # EXCEPT_PRIV_INSNの設定
    e.append(
        expr.ExprAff(regs.exception_flags,
                     expr.ExprInt32(sem.EXCEPT_PRIV_INSN)))
    # syscallの次命令のポインタを保存
    e.append(
        expr.ExprAff(expr.ExprMem(expr.ExprInt64(ADDR_SYSCALL_NEXTIP), 64),
                     expr.ExprId(ir.get_next_label(instr), instr.mode)))
    return e, []
Ejemplo n.º 3
0
 def mod_pc(self, instr, instr_ir, extra_ir):
     "Replace PC by the instruction's offset"
     cur_offset = m2_expr.ExprInt64(instr.offset)
     for i, expr in enumerate(instr_ir):
         dst, src = expr.dst, expr.src
         if dst != self.pc:
             dst = dst.replace_expr({self.pc: cur_offset})
         src = src.replace_expr({self.pc: cur_offset})
         instr_ir[i] = m2_expr.ExprAff(dst, src)
     for b in extra_ir:
         for irs in b.irs:
             for i, expr in enumerate(irs):
                 dst, src = expr.dst, expr.src
                 if dst != self.pc:
                     dst = dst.replace_expr({self.pc: cur_offset})
                 src = src.replace_expr({self.pc: cur_offset})
                 irs[i] = m2_expr.ExprAff(dst, src)
Ejemplo n.º 4
0
class imm64_noarg(object):
    int2expr = lambda self, x: m2_expr.ExprInt64(x)
Ejemplo n.º 5
0
def adrp(arg1, arg2):
    arg1 = (PC & m2_expr.ExprInt64(0xfffffffffffff000)) + arg2
Ejemplo n.º 6
0
def bl(arg1):
    PC = arg1
    ir.IRDst = arg1
    LR = m2_expr.ExprInt64(instr.offset + instr.l)