Esempio n. 1
0
 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')]
Esempio n. 2
0
"""
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)
Esempio n. 3
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 = {}