Ejemplo n.º 1
0
def x86_scas(ctx, i, size):

    a = ctx.destination
    b = r(ctx.accumulator.name, size)
    value = ctx.tmp(size)
    result = ctx.tmp(size * 2)
    address = ctx.tmp(a.size)

    if i.mnemonic.startswith('rep'):
        rep_prologue(ctx, i)

    ctx.emit(  str_  (a, address))

    # read the value
    ctx.emit(  ldm_  (address, value))

    # do the comparison and set flags
    ctx.emit(  sub_  (value, b, result))
    arithmetic._sub_set_flags(ctx, a, b, result)

    # do the increment/decrement
    ctx.emit(  jcc_  (r('df', 8), 'decrement'))
    ctx.emit('increment')
    ctx.emit(  add_  (address, imm(value.size // 8, ctx.word_size), address))
    ctx.emit(  jcc_  (imm(1, 8), 'set'))
    ctx.emit('decrement')
    ctx.emit(  sub_  (address, imm(value.size // 8, ctx.word_size), address))
    ctx.emit('set')
    ctx.emit(  str_  (address, ctx.destination))

    if i.mnemonic.startswith('rep'):
        rep_epilogue(ctx, i)
Ejemplo n.º 2
0
def x86_cmps(ctx, i, size):

    src = ctx.source
    dst = ctx.destination

    result = ctx.tmp(size * 2)

    value1 = ctx.tmp(size)
    address1 = ctx.tmp(src.size)

    value2 = ctx.tmp(size)
    address2 = ctx.tmp(src.size)

    if i.mnemonic.startswith('rep'):
        rep_prologue(ctx, i)

    # read the values
    ctx.emit(  str_  (src, address1))
    ctx.emit(  ldm_  (address1, value1))

    ctx.emit(  str_  (dst, address2))
    ctx.emit(  ldm_  (address2, value2))

    # do the comparison and set flags
    ctx.emit(  sub_  (value1, value2, result))
    arithmetic._sub_set_flags(ctx, value1, value2, result)

    # do the increment/decrement
    ctx.emit(  jcc_  (r('df', 8), 'decrement'))
    ctx.emit('increment')
    ctx.emit(  add_  (address1, imm(size // 8, ctx.word_size), address1))
    ctx.emit(  add_  (address2, imm(size // 8, ctx.word_size), address2))
    ctx.emit(  jcc_  (imm(1, 8), 'set'))
    ctx.emit('decrement')
    ctx.emit(  sub_  (address1, imm(size // 8, ctx.word_size), address1))
    ctx.emit(  sub_  (address2, imm(size // 8, ctx.word_size), address2))
    ctx.emit('set')
    ctx.emit(  str_  (address1, ctx.source))
    ctx.emit(  str_  (address2, ctx.destination))

    if i.mnemonic.startswith('rep'):
        rep_epilogue(ctx, i)