def __init__(self, mode=32): self.registers = \ [ ir.register("eax:32-0", "ax:16-0", "ah:16-8", "al:7-0"), ir.register("ebx:32-0", "bx:16-0", "bh:16-8", "bl:7-0"), ir.register("ecx:32-0", "cx:16-0", "ch:16-8", "cl:7-0"), ir.register("edx:32-0", "dx:16-0", "dh:16-8", "dl:7-0"), ir.register("esi:32-0", "si:16-0"), ir.register("edi:32-0", "di:16-0"), ir.register("ebp:32-0", "bp:16-0"), ir.register("esp:32-0", "sp:16-0", "stack"), ir.register("eip:32-0", "ip:16-0", "pc"), ir.register("eflags:32-0", "id:21", "vip:20", "vif:19", "ac:18", "vm:17", "rf:16", "nt:14", "iopl:13-12", "of:11", "df:10", "if:9", "tf:8", "sf:7", "zf:6", "af:4", "pf:2", "cf:0"), ir.register("tmem:32-0"), ir.register("tval:32-0")] self.mode = 32 self.endianness = '<' #TODO this is compiler specific --- detect this? self.call_clobber = [self.DR('eax'), self.DR('ecx'), self.DR('edx')]
""" Tests for ssa symbol abstractions. This should also shed some insight for newcomers to this spaghetti. """ import ssa import ir EAX = ir.register("eax:32-0") EBX = ir.register("ebx:32-0") ECX = ir.register("ecx:32-0") SYMa = ssa.ssa_symbol(str(EAX.register_name), EAX.bitmin, EAX.bitmax) SYMb = ssa.ssa_symbol(str(EBX.register_name), EBX.bitmin, EBX.bitmax) SYMc = ssa.ssa_symbol(str(ECX.register_name), ECX.bitmin, ECX.bitmax) TRACK = {'eax': SYMa, 'ebx': SYMb, 'ecx': SYMc} def dump(): global TRACK for name in TRACK: print name,'=',TRACK[name].get_values(), TRACK[name].get_states() print '---' #dump() #10: eax = 0 SYMa.update([0], 10, 0) #dump() #20: ebx = ecx + 5 new_state = ssa.translate_ops(TRACK, [ir.register_operand('ecx', ECX),'+', ir.constant_operand(5)], 20) SYMb.update([new_state], 20, 0)
def __init__(self): self.endianness = '>' self.registers = [ ir.register("$0:32-0", "$zero"), ir.register("$1:32-0", "$at"), ir.register("$2:32-0", "$v0"), ir.register("$3:32-0", "$v1"), ir.register("$4:32-0", "$a0"), ir.register("$5:32-0", "$a1"), ir.register("$6:32-0", "$a2"), ir.register("$7:32-0", "$a3"), ir.register("$8:32-0", "$t0"), ir.register("$9:32-0", "$t1"), ir.register("$10:32-0", "$t2"), ir.register("$11:32-0", "$t3"), ir.register("$12:32-0", "$t4"), ir.register("$13:32-0", "$t5"), ir.register("$14:32-0", "$t6"), ir.register("$15:32-0", "$t7"), ir.register("$16:32-0", "$s0"), ir.register("$17:32-0", "$s1"), ir.register("$18:32-0", "$s2"), ir.register("$19:32-0", "$s3"), ir.register("$20:32-0", "$s4"), ir.register("$21:32-0", "$s5"), ir.register("$22:32-0", "$s6"), ir.register("$23:32-0", "$s7"), ir.register("$24:32-0", "$t8"), ir.register("$25:32-0", "$t9"), ir.register("$26:32-0", "$k0"), ir.register("$27:32-0", "$k1"), ir.register("$gp:32-0", "$28"), ir.register("stack", "$29:32-0", "$sp"), ir.register("$fp:32-0", "$30"), ir.register("$ra:32-0", "$31"), ir.register("$pc:32-0", "$32", "pc"), ir.register("TMEM:32-0"), ir.register("TVAL:32-0") ] for i in range(32): self.registers.append(ir.register("$f%d:32-0"%i)) self.registers.append(ir.register("FP_COND:32-0")) self.registers.append(ir.register("HILO:64-0")) self.registers.append(ir.register("FIR:32-0")) self.registers.append(ir.register("FSR:32-0")) self.call_clobber = [] for i in [2,3,4,5,6,7]: self.call_clobber.append(self.decode_register(i)) self.external_functions = {}