1 defining 16-bit and 32-bit program modules – Intel IA-32 User Manual
Page 582
16-2 Vol. 3A
MIXING 16-BIT AND 32-BIT CODE
16.1
DEFINING 16-BIT AND 32-BIT PROGRAM MODULES
The following IA-32 architecture mechanisms are used to distinguish between and support
16-bit and 32-bit segments and operations:
•
The D (default operand and address size) flag in code-segment descriptors.
•
The B (default stack size) flag in stack-segment descriptors.
•
16-bit and 32-bit call gates, interrupt gates, and trap gates.
•
Operand-size and address-size instruction prefixes.
•
16-bit and 32-bit general-purpose registers.
The D flag in a code-segment descriptor determines the default operand-size and address-size
for the instructions of a code segment. (In real-address mode and virtual-8086 mode, which do
not use segment descriptors, the default is 16 bits.) A code segment with its D flag set is a 32-bit
segment; a code segment with its D flag clear is a 16-bit segment.
The B flag in the stack-segment descriptor specifies the size of stack pointer (the 32-bit ESP
register or the 16-bit SP register) used by the processor for implicit stack references. The B flag
for all data descriptors also controls upper address range for expand down segments.
When transferring program control to another code segment through a call gate, interrupt gate,
or trap gate, the operand size used during the transfer is determined by the type of gate used
(16-bit or 32-bit), (not by the D-flag or prefix of the transfer instruction). The gate type deter-
mines how return information is saved on the stack (or stacks).
For most efficient and trouble-free operation of the processor, 32-bit programs or tasks should
have the D flag in the code-segment descriptor and the B flag in the stack-segment descriptor
set, and 16-bit programs or tasks should have these flags clear. Program control transfers from
16-bit segments to 32-bit segments (and vice versa) are handled most efficiently through call,
interrupt, or trap gates.
Instruction prefixes can be used to override the default operand size and address size of a code
segment. These prefixes can be used in real-address mode as well as in protected mode and
virtual-8086 mode. An operand-size or address-size prefix only changes the size for the duration
of the instruction.
16.2
MIXING 16-BIT AND 32-BIT OPERATIONS WITHIN A CODE
SEGMENT
The following two instruction prefixes allow mixing of 32-bit and 16-bit operations within one
segment:
•
The operand-size prefix (66H)
•
The address-size prefix (67H)