Partager via


__segmentlimit

Spécifique à Microsoft

Génère des instructions d' lsl (limite de segment de charge).

unsigned long __segmentlimit( 
   unsigned long a 
);

Paramètres

  • [in] a
    Une constante qui spécifie le sélecteur de segment.

Valeur de retour

La limite de segment du sélecteur de segment spécifié par a,à condition que le sélecteur soit valide et visible au niveau d'autorisation actuel.

Configuration requise

Intrinsèque

Architecture

__segmentlimit

x86, x64

Fichier d'en-tête <intrin.h>

Notes

Si la limite de segment ne peut pas être récupérée, de échec de cette instruction. En cas de échec, cette instruction désactive la balise de ZF et la valeur de retour est pas définie.

Cette routine est uniquement disponible sous forme intrinsèque.

Exemple

#include <stdio.h>

#ifdef _M_IX86
typedef unsigned int READETYPE;
#else
typedef unsigned __int64 READETYPE;
#endif

#define EFLAGS_ZF      0x00000040
#define KGDT_R3_DATA    0x0020
#define RPL_MASK        0x3

extern "C"
{
unsigned long __segmentlimit (unsigned long);
READETYPE __readeflags();
}

#pragma intrinsic(__readeflags)
#pragma intrinsic(__segmentlimit)

int main(void)
{
   const unsigned long initsl = 0xbaadbabe;
   READETYPE eflags = 0;
   unsigned long sl = initsl;

   printf("Before: segment limit =0x%x eflags =0x%x\n", sl, eflags);
   sl = __segmentlimit(KGDT_R3_DATA + RPL_MASK);

   eflags = __readeflags();

   printf("After: segment limit =0x%x eflags =0x%x eflags.zf = %s\n", sl, eflags, (eflags & EFLAGS_ZF) ? "set" : "clear");

   // If ZF is set, the call to lsl succeeded; if ZF is clear, the call failed.
   printf("%s\n", eflags & EFLAGS_ZF ? "Success!": "Fail!");

   // You can verify the value of sl to make sure that the instruction wrote to it
   printf("sl was %s\n", (sl == initsl) ? "unchanged" : "changed");

   return 0;
}
  
  

Voir aussi

Référence

intrinsèques du compilateur