code: def disassemble(nex):
      
      rev_opcodes = {}
      for op in interpreter.opcodes:
          rev_opcodes[interpreter.opcodes[op]] = op
      r_constants = 1 + len(nex.signature)
      r_temps = r_constants + len(nex.constants)
  
      def getArg(pc, offset):
          if sys.version_info[0] < 3:
              arg = ord(nex.program[pc + offset])
              op = rev_opcodes.get(ord(nex.program[pc]))
          else:
              arg = nex.program[pc + offset]
              op = rev_opcodes.get(nex.program[pc])
          try:
              code = op.split(b'_')[1][offset - 1]
          except IndexError:
              return None
          if sys.version_info[0] > 2:
              # int.to_bytes is not available in Python < 3.2
              #code = code.to_bytes(1, sys.byteorder)
              code = bytes([code])
          if arg == 255:
              return None
          if code != b'n':
              if arg == 0:
                  return b'r0'
              elif arg < r_constants:
                  return ('r%d[%s]' % (arg, nex.input_names[arg - 1])).encode('ascii')
              elif arg < r_temps:
                  return ('c%d[%s]' % (arg, nex.constants[arg - r_constants])).encode('ascii')
              else:
                  return ('t%d' % (arg,)).encode('ascii')
          else:
              return arg
  
      source = []
      for pc in range(0, len(nex.program), 4):
          if sys.version_info[0] < 3:
              op = rev_opcodes.get(ord(nex.program[pc]))
          else:
              op = rev_opcodes.get(nex.program[pc])
          dest = getArg(pc, 1)
          arg1 = getArg(pc, 2)
          arg2 = getArg(pc, 3)
          source.append((op, dest, arg1, arg2))
      return source
docs: Given a NumExpr object, return a list which is the program disassembled.