Knowledge Base |

# Characteristics of MASM Labels

Article ID: 123685

Article Last Modified on 2/11/2004

APPLIES TO

- Microsoft Macro Assembler 5.1 Standard Edition
- Microsoft Macro Assembler 6.0 Standard Edition
- Microsoft Macro Assembler 6.1 Standard Edition
- Microsoft Macro Assembler 6.11 Standard Edition

This article was previously published under Q123685

## SUMMARY

Most high-level programming languages use variables for data and functions or procedures for code. MASM uses labels for both data and code.
It is helpful to think of a MASM label as an address because once the program is loaded into memory, each label corresponds to a particular address. It is also helpful to think of a data label as a variable and a code label as a function or procedure.
You can think of a MASM label as a C pointer; however, this might lead to confusion because a label is more like a C array name than a C pointer. A MASM label has no space allocated to store its value, as does a C pointer.
This article discusses the segment and offset of a MASM label, label type, and label distance.

## MORE INFORMATION

A MASM label is made up of a segment and an offset. In your MASM program, you can use the SEG and OFFSET operators to access the corresponding portion of the label. The the SEG and OFFSET directives work in a way similar to the C FP_SEG and FP_OFF macros. However, FP_SEG and FP_OFF work on C pointers, not MASM labels or memory addresses.
The size of the segment of a MASM label is always 16 bits. MASM labels have either a 16-bit or a 32-bit offset. In general, the offset component of a label is 16 bits. However, in flat model programs, the offset component of a label is 32 bits.
In addition to a segment and an offset, every label has a type or distance associated with it. Data labels typically have a type, while code labels have an associated distance.
The type or distance associated with a label is used to resolve ambiguities. For example, consider the following instruction:

       mov MyLabel, 0

Should the assembler generate code to move a byte or a word to MyLabel? The answer depends on how MyLabel was defined. If MyLabel was defined as a byte, a 0 byte is moved to MyLabel, but if MyLabel was defined as a word, a 0 word is moved to MyLabel.
If you want to move a value to a label that has a size different from the size for the type associated with the label, cast the label. You can cast a label by placing the type that you want to associate with the label, followed by PTR, in front of the data label. For example, the following instruction casts MyLabel to a label for a WORD:

       mov WORD PTR MyLabel, 0

The WORD PTR does not mean MyLabel contains a pointer to a word; it means the data at MyLabel should be considered to be a word.
Similarly, you can tell the assembler whether to make a call or a jump NEAR or FAR by specifying the distance for the code label. For example, the following instruction tells the assembler to generate a 32-bit NEAR jump to the label CodeLabel:

       jmp NEAR32 CodeLabel

A jump such as this one is helpful when writing Windows NT or OS/2 flat model programs.

Additional query words: kbinf 5.10 6.00 6.10

Keywords: KB123685