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)
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)