SDM指令功能描述(LSS)
总体描述:
用32位或48位或64位的数据加载16位SS段选择符和16或32位或64位的通用寄存器值,其中通用寄存器在目的操作数中。
LSS (16or32or64)通用寄存器, (32or48or64)内存变量的地址
伪代码:
64位模式:
if(selector is NULL && ((RPL==3) or (RPL!=3 && RPL!=CPL)))
{
#GP
}
else if(描述符不合法)
{
#GP
}
else if((selector->index超出了所在表的limit) or
(RPL!=CPL) or
(指向的描述符说明是不可写的数据段) or
(DPL!=CPL))
{
#GP
}
SS选择符赋值
SS描述符赋值
DEST=*(SRC)
32位模式:
if(selector is NULL)
{
#GP
}
else if(index超出了表的limit限制 or
(selector->RPL != CPL) or
(DPL!=CPL))
{
#GP
}
else if(描述符中信息说明段不存在)
{
#SS
}
SS选择符赋值
SS描述符赋值
DEST=*(SRC)
16位实模式
SS=*(SRC+2)
DEST=*(SRC)
标志位影响:
无
相关异常:
GP:当显示或隐示的使用CS, DS, ES, FS, GS加上一个偏移作为内存访问地址时超出limit
SS:使用SS和一个指针访问内存超出ss段limit
UD:当使用了LOCK prefix的时候
示例代码:
struct lseg_st{
long a;
int16_t b;
};
void test()
{
struct lseg_st lss;
lss.a = 0xffffffff;
lss.b = 0x08;
__asm__ volatile
(
"lssl %0, %%eax\t\n"
::"m"(les)
);
}