__segmentlimit

Блок, относящийся только к системам Майкрософт

Создает инструкцию lsl (ограничение сегмента нагрузки).

Синтаксис

unsigned long __segmentlimit(
   unsigned long a
);

Параметры

a
[in] Константа, указывающая селектор сегментов.

Возвращаемое значение

Ограничение сегмента селектора сегмента, указанного в параметре, если селектор является допустимым и видимым на текущем уровне разрешений.

Требования

Intrinsic Архитектура
__segmentlimit x86, x64

Файл<заголовка intrin.h>

Замечания

Если не удается получить ограничение сегмента, эта инструкция завершается ошибкой. При сбое эта инструкция очищает флаг ZF, а возвращаемое значение не определено.

Эта процедура доступна только как встроенная функция.

Пример

#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;
}
Before: segment limit =0xbaadbabe eflags =0x0
After: segment limit =0xffffffff eflags =0x256 eflags.zf = set
Success!
sl was changed

Завершение блока, относящегося только к системам Майкрософт

См. также

Встроенные компоненты компилятора