An Assembler is a program that a program written in an assembly language into a program in the instruction set of some machine.
There are often several different machine-readable forms of output possible.
escargo 2004-08-09: 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 2014-05-26: I would be remiss not to reference the one book I know that deals specifically with linkers and loaders: http://www.amazon.com/Linkers-Kaufmann-Software-Engineering-Programming/dp/1558604960 (I am mentioned in the acknowledgements: http://www.iecc.com/linkers/linker00.html )
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. :^)
CL: has been thinking about writing an explanation of why Tcl and assembly language can be good partners, a practice briefly described in, for example, Regular Expressions: Programming Down to the Silicon , by Cameron Laird and Kathryn Soraiz, 2004-02