## ALP Programming Guide and Reference

[prev][next][parent][TOC]

### Description

The LGS, LSS, LDS, LES, and LFS instructions read a full pointer from memory and store it in the selected segment register:register pair. The full pointer loads 16-bits into the segment register SS, DS, ES, FS, or GS. The other register loads 32-bits if the operand-size attribute is 32-bits, or loads 16-bits if the operand-size attribute is 16-bits. The other 16- or 32-bit register to be loaded is determined by the r16 or r32 register operand specified.

When an assignment is made to one of the segment registers, the descriptor is also loaded into the segment register. The data for the register is obtained from the descriptor table entry for the selector given.

A null selector (values 0000-0003) can be loaded into DS, ES, FS, or GS registers without causing a protection exception. (Any subsequent reference to a segment whose corresponding segment register is loaded with a null selector to address memory causes a #GP(0) exception. No memory reference to the segement occurs.)

The following is a listing of the Protected Mode checks and actions taken in the loading of a segment register:

    IF SS is loaded;
      IF selector is null THEN #GP(0); FI;
      Selector index must be within its descriptor table limits ELSE
        #GP(selector);
      Selector's RPL must equal CPL ELSE #GP(selector);
      AR byte must indicate a writable data segment ELSE #GP(selector);
      DPL in the AR byte must equal CPL ELSE #GP(selector);
      Segment must be marked present ELSE #SS(selector);
      Load SS with selector;
      Load SS with descriptor;

    IF DS, ES, FS, or GS is loaded with non-null selector:
      Selector index must be within its descriptor table limits ELSE
        #GP(selector);
      AR byte must indicate data or readable code segment ELSE
        #GP(selector);
      IF data or nonconforming code
      THEN both the RPL and the CPL must be less than or equal to DPL in
        AR byte;
      ELSE #GP(selector);
      Segment must be marked present ELSE #NP(selector);
    Load segment register with selector and RPL bits;
    Load segment register with descriptor;

    IF DS, ES, FS or GS is loaded with a null selector:
      Load segment register with selector;
      Clear descriptor valid bit;