<P> Symbolic assemblers let programmers associate arbitrary names (labels or symbols) with memory locations and various constants . Usually, every constant and variable is given a name so instructions can reference those locations by name, thus promoting self - documenting code . In executable code, the name of each subroutine is associated with its entry point, so any calls to a subroutine can use its name . Inside subroutines, GOTO destinations are given labels . Some assemblers support local symbols which are lexically distinct from normal symbols (e.g., the use of "10 $" as a GOTO destination). </P> <P> Some assemblers, such as NASM, provide flexible symbol management, letting programmers manage different namespaces, automatically calculate offsets within data structures, and assign labels that refer to literal values or the result of simple computations performed by the assembler . Labels can also be used to initialize constants and variables with relocatable addresses . </P> <P> Assembly languages, like most other computer languages, allow comments to be added to program source code that will be ignored during assembly . Judicious commenting is essential in assembly language programs, as the meaning and purpose of a sequence of binary machine instructions can be difficult to determine . The "raw" (uncommented) assembly language generated by compilers or disassemblers is quite difficult to read when changes must be made . </P> <P> Many assemblers support predefined macros, and others support programmer - defined (and repeatedly re-definable) macros involving sequences of text lines in which variables and constants are embedded . The macro definition is most commonly a mixture of assembler statements, e.g., directives, symbolic machine instructions, and templates for assembler statements . This sequence of text lines may include opcodes or directives . Once a macro has been defined its name may be used in place of a mnemonic . When the assembler processes such a statement, it replaces the statement with the text lines associated with that macro, then processes them as if they existed in the source code file (including, in some assemblers, expansion of any macros existing in the replacement text). Macros in this sense date to IBM autocoders of the 1950s . </P>

Software which converts a program into assembly language is called