Characteristics of MASM Labels (123685)
The information in this article applies to:
- Microsoft Macro Assembler (MASM) 5.1
- Microsoft Macro Assembler (MASM) 6.0
- Microsoft Macro Assembler (MASM) 6.1
- Microsoft Macro Assembler (MASM) 6.11
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.
Modification Type: | Minor | Last Reviewed: | 2/11/2004 |
---|
Keywords: | KB123685 |
---|
|