An Assembler is a program that converts a human-readable (and, more particularly, human-writable) form of machine instructions (often called Assembly Language or Assembler) into a machine-readable form.
There are often several different machine-readable forms of output possible.
The key question with regard to the machine-readable format is, What are the capabilities of the tool chain programs that come after the assembler? There must be a loader (which loads the code into the executing machine's memory); there might be a linker (which combines different programs together into a single loadable program). The loader might be an absolute or relocating loader. These two processing programs are often underspecified and ignored, but they are crucially important to real program operation. -- escargo 9 Aug 2004
DKF: The #1 feature of assemblers is that they work out jump offsets and addresses for you. (I've done it by hand for the Z80, but it is very difficult.)
The second feature of assemblers for some modern processors is that they can do certain kinds of ugly low-level peephole optimizations. Exactly how much varies, but even so.
Third obvious feature is that they save you from having to look up each machine code word to use the instruction. :^)
See also Playing Assembler for some 8080 memories...