Exemplo n.º 1
0
def _arm_mov(ctx, i):
    prev_value = operand.get(ctx, i, 1)
    value = ctx.tmp(ctx.word_size)

    ctx.emit(  str_  (prev_value, value))

    if i.update_flags:
        set_N(ctx, value)
        set_Z(ctx, value)

    operand.set(ctx, i, 0, value)
Exemplo n.º 2
0
def _arm_mov(ctx, i):
    prev_value = operand.get(ctx, i, 1)
    value = ctx.tmp(ctx.word_size)

    ctx.emit(str_(prev_value, value))

    if i.update_flags:
        set_N(ctx, value)
        set_Z(ctx, value)

    operand.set(ctx, i, 0, value)
Exemplo n.º 3
0
def arm_movt(ctx, i):
    # first extract the low 16 bits of the destination
    prev_value = operand.get(ctx, i, 0)
    value = ctx.tmp(ctx.word_size)

    ctx.emit(and_(prev_value, imm(mask(16), 32), value))

    # then compute the high 16 bits
    prev_result = operand.get(ctx, i, 1)
    result = ctx.tmp(ctx.word_size)

    ctx.emit(str_(prev_result, result))
    ctx.emit(lshl_(result, imm(16, 32), result))

    ctx.emit(or_(value, result, result))

    if i.update_flags:
        set_N(ctx, result)
        set_Z(ctx, result)

    operand.set(ctx, i, 0, result)
Exemplo n.º 4
0
def arm_add(ctx, i):
    if len(i.operands) == 3:
        dst_idx = 0
        a_idx = 1
        b_idx = 2
    else:
        dst_idx = 0
        a_idx = 0
        b_idx = 1

    a = operand.get(ctx, i, a_idx)
    b = operand.get(ctx, i, b_idx)

    result = ctx.tmp(a.size * 2)

    ctx.emit(  add_  (a, b, result))

    if i.update_flags:
        raise NotImplementedError()

    operand.set(ctx, i, dst_idx, result)
Exemplo n.º 5
0
def arm_add(ctx, i):
    if len(i.operands) == 3:
        dst_idx = 0
        a_idx = 1
        b_idx = 2
    else:
        dst_idx = 0
        a_idx = 0
        b_idx = 1

    a = operand.get(ctx, i, a_idx)
    b = operand.get(ctx, i, b_idx)

    result = ctx.tmp(a.size * 2)

    ctx.emit(add_(a, b, result))

    if i.update_flags:
        raise NotImplementedError()

    operand.set(ctx, i, dst_idx, result)
Exemplo n.º 6
0
def arm_movt(ctx, i):
    # first extract the low 16 bits of the destination
    prev_value = operand.get(ctx, i, 0)
    value = ctx.tmp(ctx.word_size)

    ctx.emit(  and_  (prev_value, imm(mask(16), 32), value))

    # then compute the high 16 bits
    prev_result = operand.get(ctx, i, 1)
    result = ctx.tmp(ctx.word_size)

    ctx.emit(  str_  (prev_result, result))
    ctx.emit(  lshl_ (result, imm(16, 32), result))

    ctx.emit(  or_   (value, result, result))

    if i.update_flags:
        set_N(ctx, result)
        set_Z(ctx, result)

    operand.set(ctx, i, 0, result)
Exemplo n.º 7
0
def arm_str(ctx, i):
    value = operand.get(ctx, i, 1)
    operand.set(ctx, i, 0, value)
Exemplo n.º 8
0
def arm_str(ctx, i):
    value = operand.get(ctx, i, 1)
    operand.set(ctx, i, 0, value)