On (05 Jul 97) Brian McCloud wrote to Cameron Clark...
BM> The ModRegR/m byte does not specify whether the segment is Use16 or
BM> Use32... The segment declarations determine this, and the assembler
BM> would probably make use of the address-size and/or operand-size
BM> overrides when calling one type of segment from the other type.
Yes, more or less. The `D' bit in a segment descriptor is set to 0 to
indicate a USE16 segment, and to 1 to indicate a USE32 segment.
However, calls/jumps between segments in protected mode must go through
a task gate or call gate. Each gate contains a type field that tells
what sort of gate it is - e.g. a 16 bit call gate is type 4 and a 32 bit
call gate is type C.
Alternatively, you can do intersegment calls by doing a jump directly to
a TSS. TSS's also have type fields similar to those in gates.
BM> I must admit I haven't done much with this, but the microprocessor
BM> must have some way to tell whether it's running a Use16 or a Use32
BM> segment.
It certainly must, and the D bit in the segment descriptor is it.
Later,
Jerry.
... The Universe is a figment of its own imagination.
--- PPoint 1.90
---------------
* Origin: Point Pointedly Pointless (1:128/166.5)
|