Example #1
0
  def pass2(self):
    accumulator = {}
    for addr in sorted(self.data):
      instruction = self.data[addr]
      op, args = instruction[0], instruction[1:]

      # Adjust addresses for relative ops.
      if op in ('rcall', 'rjmp', 'brne', 'breq'):
        args = self._adjust(op, args, ibv(int(addr, 16)))

      opf = ops.get(op, lambda *args: args)
      n, data = opf(*args)

      if n == -1:
        bindata = data
      elif n == 16:
        bindata = pack('H', data)
      else:
        bindata = pack('2H', data[32:16], data[16:])

##      if op in ('db', 'dw'):
##        print addr, 10 * ' ', op, len(data), 'bytes:', repr(data)
##      else:
##        try:
##          fdata = '%-10x' % (data,)
##        except TypeError:
##          print addr, 10 * '.', instruction, repr(data)
##        else:
##          print addr, fdata, instruction, repr(bindata)

      accumulator[addr] = bindata

    return accumulator
Example #2
0
 def define(self, **defs):
   for k, v in defs.iteritems():
     if isinstance(v, int):
       defs[k] = v = ibv(v)
     print 'defining %s = %#x' % (k, v)
   self.context.update(defs)
Example #3
0
 def org(self, address):
   address = ibv(address)
   print 'setting org to %#06x' % (address,)
   update(self.here, address)
Example #4
0
 def _adjust(self, op, args, addr):
   return (ibv(args[0] - addr - 1),)