def TestDECMemMem_ImmStep(): A = extarray.extarray('l', 1000) B = extarray.extarray('l', 1000) for i in xrange(1000): A[i] = i prgm = env.Program() code = prgm.get_stream() a = registers.esi b = registers.edi code.add(x86.mov(a, memory.MemRef(registers.ebp, 2*_ws))) code.add(x86.mov(b, memory.MemRef(registers.ebp, 3*_ws))) n = memory.MemRef(registers.esp) #code.add(x86.mov(n, 1000)) code.add(x86.push(1000)) i_iter = syn_iter(code, n, mode=DEC, step=-4, count_reg = memory.MemRef(registers.esp, -1*_ws), clobber_reg=registers.eax) j = registers.ebx for i_ in i_iter: code.add(x86.mov(j, i_)) code.add(x86.mov(registers.eax, memory.MemRef(a, index=j, scale=4))) code.add(x86.mov(memory.MemRef(b, index=j, scale=4), registers.eax)) code.add(x86.add(registers.esp, 4)) params = env.ExecParams() params.p1 = A.buffer_info()[0]-_ws params.p2 = B.buffer_info()[0]-_ws prgm += code proc = env.Processor() proc.execute(prgm, mode='int', params=params) for i in range(len(B)-1, 0, -4): assert(B[i] == i)
def TestDECMem(): A = extarray.extarray('l', 1000) B = extarray.extarray('l', 1000) for i in xrange(1000): A[i] = i prgm = env.Program() code = prgm.get_stream() a = registers.esi b = registers.edi code.add(x86.mov(a, memory.MemRef(registers.ebp, 2 * _ws))) code.add(x86.mov(b, memory.MemRef(registers.ebp, 3 * _ws))) n = memory.MemRef(registers.esp) code.add(x86.push(1000)) i_iter = syn_iter(code, n, mode=DEC, count_reg=registers.ecx) for i_ in i_iter: code.add(x86.mov(registers.eax, memory.MemRef(a, index=i_, scale=4))) code.add(x86.mov(memory.MemRef(b, index=i_, scale=4), registers.eax)) code.add(x86.add(registers.esp, 4)) params = env.ExecParams() params.p1 = A.buffer_info()[0] - _ws params.p2 = B.buffer_info()[0] - _ws prgm += code proc = env.Processor() proc.execute(prgm, mode='int', params=params) for i in range(1, len(B)): assert (B[i] == i)
def load_float(code, reg, val, clear = False): data = extarray.extarray('f', (val,)) data.change_type('I') # reg better be an mmx or xmm, should we check? code.add(x86.push(data[0])) code.add(x86.pshufd(reg, mem.MemRef(regs.rsp, data_size = 128), 0)) return code.add(x86.add(regs.rsp, 8))
def load_double(code, reg, val): data = extarray.extarray('d', (val,)) data.change_type('I') # reg better be an mmx or xmm, should we check? code.add(x86.push(data[0])) code.add(x86.push(data[1])) code.add(x86.pshufd(reg, mem.MemRef(regs.rsp, data_size = 128), 0x44)) return code.add(x86.add(regs.rsp, 8))
def cleanup(self): """Do end-of-loop iterator code""" # Update the current count if self.mode == DEC: if self.step_size() == 1: self.code.add(x86.dec(self.r_count)) else: if self.r_step is not None: if isinstance(self.r_step, memory.MemRef): self.code.add(x86.mov(self.r_clobber, self.r_step)) self.code.add(x86.add(self.r_count, self.r_clobber)) else: self.code.add(x86.add(self.r_count, self.r_step)) else: self.code.add(x86.add(self.r_count, self.step_size())) elif self.mode == INC: if self.step_size() == 1: self.code.add(x86.inc(self.r_count)) else: if self.r_step is not None: if isinstance(self.r_step, memory.MemRef): self.code.add(x86.mov(self.r_clobber, self.r_step)) self.code.add(x86.add(self.r_count, self.r_clobber)) else: self.code.add(x86.add(self.r_count, self.r_step)) else: self.code.add(x86.add(self.r_count, self.step_size())) return
def TestInt(): from corepy.arch.x86.lib.memory import MemRef code = InstructionStream() proc = Processor() params = x86_exec.ExecParams() params.p1 = 32 code.add(x86.mov(eax, spe.MemRef(ebp, 8))) #code.add(x86.xor(code.eax, code.eax)) code.add(x86.add(eax, 1200)) code.print_code(pro=False, epi=False, binary=True) r = proc.execute(code, debug=True, params=params) print 'int result:', r assert (r == 1232) return
def TestInt(): from corepy.arch.x86.lib.memory import MemRef code = InstructionStream() proc = Processor() params = x86_exec.ExecParams() params.p1 = 32 code.add(x86.mov(eax, MemRef(ebp, 8))) #code.add(x86.xor(code.eax, code.eax)) code.add(x86.add(eax, 1200)) code.print_code(pro = False, epi = False, binary = True) r = proc.execute(code, debug = True, params = params) print 'int result:', r assert(r == 1232) return
def TestDECMemMem_MemStep(): A = extarray.extarray('l', 1000) B = extarray.extarray('l', 1000) for i in xrange(1000): A[i] = i prgm = env.Program() code = prgm.get_stream() a = registers.esi b = registers.edi code.add(x86.mov(a, memory.MemRef(registers.ebp, 2 * _ws))) code.add(x86.mov(b, memory.MemRef(registers.ebp, 3 * _ws))) n = memory.MemRef(registers.esp, 0) code.add(x86.sub(registers.esp, 12)) code.add(x86.mov(n, 1000)) #code.add(x86.push(1000)) s = memory.MemRef(registers.esp, 2 * _ws) code.add(x86.mov(s, -4)) i_iter = syn_iter(code, n, mode=DEC, step=s, count_reg=memory.MemRef(registers.esp, 1 * _ws), clobber_reg=registers.eax) j = registers.ebx for i_ in i_iter: code.add(x86.mov(j, i_)) code.add(x86.mov(registers.eax, memory.MemRef(a, index=j, scale=4))) code.add(x86.mov(memory.MemRef(b, index=j, scale=4), registers.eax)) code.add(x86.add(registers.esp, 12)) params = env.ExecParams() params.p1 = A.buffer_info()[0] - _ws params.p2 = B.buffer_info()[0] - _ws prgm += code proc = env.Processor() proc.execute(prgm, mode='int', params=params) for i in range(len(B) - 1, 0, -4): assert (B[i] == i)
import corepy.arch.x86.isa as x86 from corepy.arch.x86.types.registers import * import corepy.arch.x86.platform as env from corepy.arch.x86.lib.memory import MemRef prgm = env.Program() code = prgm.get_stream() proc = env.Processor() # Generate sub-stream # Multiple eax by 2, add 1 subcode = prgm.get_stream() subcode.add(x86.shl(eax, 1)) subcode.add(x86.add(eax, 1)) # Initialize a register, insert code code.add(x86.mov(eax, 5)) code.add(subcode) # Add 3, insert again code.add(x86.add(eax, 3)) code.add(subcode) prgm.add(code) prgm.print_code() ret = proc.execute(prgm, mode="int") print "ret", ret
import corepy.arch.x86.isa as x86 from corepy.arch.x86.types.registers import * import corepy.arch.x86.platform as env from corepy.arch.x86.lib.memory import MemRef prgm = env.Program() code = prgm.get_stream() proc = env.Processor() # Generate sub-stream # Multiple eax by 2, add 1 subcode = prgm.get_stream() subcode.add(x86.shl(eax, 1)) subcode.add(x86.add(eax, 1)) # Initialize a register, insert code code.add(x86.mov(eax, 5)) code.add(subcode) # Add 3, insert again code.add(x86.add(eax, 3)) code.add(subcode) prgm.add(code) prgm.print_code() ret = proc.execute(prgm, mode='int') print "ret", ret prgm = env.Program()
def Test(): prgm = env.Program() code = prgm.get_stream() proc = env.Processor() params = env.ExecParams() params.p1 = 3 mr32 = MemRef(ebp, 8) mr8 = MemRef(ebp, 8, data_size = 8) lbl1 = prgm.get_label("lbl1") lbl2 = prgm.get_label("lbl2") code.add(x86_isa.xor(eax, eax)) code.add(x86_isa.cmp(eax, 1)) code.add(x86_isa.jne(lbl1)) code.add(x86_isa.ret()) code.add(lbl1) code.add(x86_isa.cmp(eax, 1)) code.add(x86_isa.je(lbl2)) code.add(x86_isa.add(eax, 12)) code.add(lbl2) prgm += code ret = proc.execute(prgm) print "ret", ret assert(ret == 12) prgm = env.Program() code = prgm.get_stream() fwd_lbl = prgm.get_label("FORWARD") bck_lbl = prgm.get_label("BACKWARD") code.add(x86_isa.xor(eax, eax)) code.add(bck_lbl) code.add(x86_isa.cmp(eax, 1)) code.add(x86_isa.jne(fwd_lbl)) for i in xrange(0, 65): code.add(x86_isa.pop(edi)) code.add(fwd_lbl) prgm += code ret = proc.execute(prgm, mode = 'int') assert(ret == 0) prgm = env.Program() code = prgm.get_stream() loop_lbl = prgm.get_label("LOOP") out_lbl = prgm.get_label("OUT") skip_lbl = prgm.get_label("SKIP") code.add(x86_isa.xor(eax, eax)) code.add(loop_lbl) r_tmp = prgm.acquire_register() for i in range(0, 1): for i in xrange(0, 24): code.add(x86_isa.add(r_tmp, MemRef(esp, 4))) code.add(x86_isa.add(eax, 4)) code.add(x86_isa.cmp(eax, 20)) code.add(x86_isa.je(out_lbl)) for i in xrange(0, 24): code.add(x86_isa.add(r_tmp, MemRef(esp, 4))) code.add(x86_isa.cmp(eax, 32)) code.add(x86_isa.jne(loop_lbl)) code.add(out_lbl) code.add(x86_isa.jmp(skip_lbl)) for i in xrange(0, 2): code.add(x86_isa.add(r_tmp, MemRef(esp, 4))) code.add(skip_lbl) prgm.release_register(r_tmp) prgm += code ret = proc.execute(prgm, mode = 'int') print "ret", ret assert(ret == 20) prgm = env.Program() code = prgm.get_stream() loop_lbl = prgm.get_label("LOOP") else_lbl = prgm.get_label("ELSE") finish_lbl = prgm.get_label("finish") code.add(x86_isa.mov(eax, -1)) code.add(x86_isa.mov(edx, 0)) code.add(loop_lbl) code.add(x86_isa.add(eax, 1)) code.add(x86_isa.cmp(eax, 16)) code.add(x86_isa.jge(finish_lbl)) code.add(x86_isa.add(edx, eax)) code.add(x86_isa.mov(edx, edi)) code.add(x86_isa.and_(edi, 0x1)) code.add(x86_isa.jnz(else_lbl)) code.add(x86_isa.add(edx, 1)) code.add(x86_isa.jmp(loop_lbl)) code.add(else_lbl) code.add(x86_isa.add(edx, edi)) code.add(x86_isa.jmp(loop_lbl)) code.add(finish_lbl) code.add(x86_isa.mov(eax, edx)) prgm += code ret = proc.execute(prgm, mode = 'int') print "ret", ret assert(ret == 1) prgm = env.Program() code = prgm.get_stream() loop_lbl = prgm.get_label("LOOP") code.add(x86_isa.xor(eax, eax)) code.add(x86_isa.xor(ecx, ecx)) code.add(x86_isa.mov(edx, 1)) code.add(loop_lbl) code.add(x86_isa.inc(eax)) code.add(x86_isa.cmp(eax, 7)) code.add(x86_isa.cmove(ecx, edx)) code.add(x86_isa.jecxz(loop_lbl)) prgm += code ret = proc.execute(prgm, mode = 'int') print "ret", ret assert(ret == 7) prgm = env.Program() code = prgm.get_stream() code.add(x86_isa.add(eax, 200)) code.add(x86_isa.xor(eax, eax)) code.add(x86_isa.add(al, 32)) code.add(x86_isa.add(bl, 32)) code.add(x86_isa.xor(bl, bl)) code.add(x86_isa.mov(mr8, al)) code.add(x86_isa.add(mr32, 0)) code.add(x86_isa.mov(eax, mr32)) code.add(x86_isa.mov(al, mr8)) code.add(x86_isa.imul(ax, ax, 4)) code.add(x86_isa.imul(ebx, eax, 10)) code.add(x86_isa.mov(cx, 1232)) code.add(x86_isa.sub(ax, cx)) code.add(x86_isa.xor(eax,eax)) code.add(x86_isa.mov(eax,ebx)) code.add(x86_isa.clc()) code.add(x86_isa.rcl(eax, 1)) code.add(x86_isa.rcr(eax, 1)) prgm += code #ret = proc.execute(code, debug = True, params = params) id1 = proc.execute(prgm, params = params, mode = 'int', async = True) id2 = proc.execute(prgm, params = params, mode = 'int', async = True) ret = proc.execute(prgm, params = params, mode = 'int') print "Return main thread: %d" % (ret) ret = proc.join(id1) print "Return thread 1: %d" % (ret) ret = proc.join(id2) print "Return thread 2: %d" % (ret) prgm = env.Program() code = prgm.get_stream() code.add(x86_isa.fldpi()) code.add(x86_isa.fld1()) code.add(x86_isa.fadd(st0, st0)) code.add(x86_isa.fmulp()) code.add(x86_isa.fsin()) code.add(x86_isa.fcos()) code.add(x86_isa.fld1()) code.add(x86_isa.fyl2xp1()) prgm += code ret = proc.execute(prgm, params = params, mode = 'fp') print "Return main thread: %f" % (ret) prgm = env.Program() code = prgm.get_stream() code.add(x86_isa.movd(xmm0, mr32)) code.add(x86_isa.mov(ebx, mr32)) code.add(x86_isa.movd(xmm1, ebx)) code.add(x86_isa.paddq(xmm0, xmm1)) code.add(x86_isa.pextrw(ecx, xmm0, 0)) code.add(x86_isa.pxor(mm1, mm1)) code.add(x86_isa.pinsrw(mm1, ecx, 0)) code.add(x86_isa.movq2dq(xmm0, mm1)) code.add(x86_isa.movdq2q(mm2, xmm0)) code.add(x86_isa.movd(edx,mm2)) code.add(x86_isa.movd(xmm5,edx)) code.add(x86_isa.movd(ecx, xmm5)) code.add(x86_isa.pxor(xmm6, xmm6)) code.add(x86_isa.pinsrw(xmm6, ecx, 0)) code.add(x86_isa.movd(eax, xmm6)) code.add(x86_isa.emms()) prgm += code prgm.print_code(hex = True) ret = proc.execute(prgm, params = params, mode = 'int') print "Return main thread: %d" % (ret) # Try the LOCK prefix prgm = env.Program() code = prgm.get_stream() code.add(x86_isa.xor(eax, eax)) code.add(x86_isa.add(mr32, eax)) code.add(x86_isa.add(mr32, eax, lock = True)) prgm += code prgm.print_code(hex = True) proc.execute(prgm, params = params) return