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
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)
def org(self, address): address = ibv(address) print 'setting org to %#06x' % (address,) update(self.here, address)
def _adjust(self, op, args, addr): return (ibv(args[0] - addr - 1),)