The assembly code outputted by the compiler is still in a human readable form, should you know the specifics of the assembly code for the processor. Developers will often take a peek at the assembly output to manually check that the code is the most optimised or to discover any bugs in the compiler (this is more common than one might think, especially when the compiler is being very aggressive with optimisations).

The assembler is a more mechanical process of converting the assembly code into a binary form. Essentially, the assembler keeps a large table of each possible instruction and its binary counterpart (called an op code for operation code). It combines these opcodes with the registers specified in the assembly to produce a binary output file.

This code is called object code and, at this stage, is not executable. Object code is simply a binary representation of specific input source code file. Good programming practice dictates that a programmer should not "put all the eggs in one basket" by placing all your source code in one file.