There are three classes of names in the Itanium(TM) architecture assembly language:
Symbols, which refer to memory locations, sections, and symbolic constants. These names are case sensitive.
Registers, which refer to registers defined in the Itanium architecture. These names are not case sensitive. Some register names consist of multiple syntactic elements rather than a single identifier.
Mnemonics, which refer to machine instructions, pseudo-ops, directives, and completers. These names are not case sensitive.
The assembler places names in three separate name spaces, according to their class. A name may not be defined twice in the same namespace, but it may be defined once in each namespace. When a name is defined in both the register and symbol namespaces, the register name takes precedence over the symbol unless the identifier is “protected” by terminating it with the # operator; this forces the assembler to look up the identifier in the symbol namespace.
The # operator in conjunction with a symbol is legal only when the symbol is an operand.
The following examples illustrate the correct use of the # operator:
r5: //label named r5, where label is the symbol name
movl r4=r5# //;moves the r5 label address to register r4
.global r5# //declares label r5 as global
The # operator is unnecessary and illegal when included in the symbol definition, as shown:
r5#: //illegal