Given what we think about surface syntax, we think the important characteristics of the assembler is that it should contain classes representing instructions, address modes, registers, immediate values, labels, etc.
The assembler should work against a data base of available instructions. This data base contains information about each instruction such as exact encoding, the form and range of each operand, etc.
The instructions created by client code such as a compiler should reflect what effect is desired, such as adding two registers together and put the result in a third register. The assembler matches this effect against possible entries in the data base and determines the exact encoding.
It is not a priority for the assembler to support file formats such as ELF.