public static Disassembler getDisassembler(Program program, TaskMonitor monitor,
			DisassemblerMessageListener listener) {
		Class<? extends Disassembler> disassemblerClass =
			getLanguageSpecificDisassembler(program.getLanguage());
		if (disassemblerClass != null) {
			try {
				Constructor<? extends Disassembler> constructor = disassemblerClass.getConstructor(
					Program.class, TaskMonitor.class, DisassemblerMessageListener.class);
				return constructor.newInstance(program, monitor, listener);
			}
			catch (Exception e) {
				throw new RuntimeException("Disassembler instantiation failure " +
					GhidraLanguagePropertyKeys.CUSTOM_DISASSEMBLER_CLASS + " (" +
					disassemblerClass.getName() + "): " +
					program.getLanguage().getLanguageDescription().getLanguageID(), e);
			}
		}
		return new Disassembler(program, monitor, listener);
	}
Get a suitable disassembler instance. 
The following Program options are used during disassbly:
<ul>
<li>{@link #MARK_BAD_INSTRUCTION_PROPERTY}</li>
<li>{@link #MARK_UNIMPL_PCODE_PROPERTY}</li>
<li>{@link #RESTRICT_DISASSEMBLY_TO_EXECUTE_MEMORY_PROPERTY}</li>
</ul>
@param program the program to be disassembled.
@param monitor progress monitor
@param listener object to notify of disassembly messages.
@return a disassembler ready to disassemble
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/disassemble/Disassembler.java