/*读取fs段中指定地址处的字节
*参数:addr-指定的内存地址
*%0-(_v),%1-内存地址
*返回:返回内存fs:[addr]处的字节
*/
extern inline unsigned char get_fs_byte(const char*addr)
{
unsigned register char _v;
__asm__("movb %%fs:%1,%0":"=r"(_v):"m"(*addr));
return _v;
}
/*读取fs段中指定地址处的字
*参数:addr-指定的内存地址
*%0-(_v),%1-内存地址
*返回:返回内存fs:[addr]处的字
*/
extern inline unsigned short get_fs_word(const unsigned short *addr)
{
unsigned short _v;
__asm__("movw %%fs:%1,%0":"=r")(_v):"m"(*addr);
return _v;
}
/*读取fs段中指定地址处的长字
*参数:addr-指定的内存地址
*%0-(_v),%1-内存地址
*返回:返回内存fs:[addr]处的长字
*/
extern inline unsigned long get_fs_long(const unsigned long *addr)
{
unsigned long _v;
__asm__("movl %%fs:%1,%0":"=r"(_v):"m"(*addr));
return _v;
}
/*将一字节放在fs段中指定内存地址处
*参数:val-长字值,addr-内存地址
*%0-寄存器(val),%1-内存地址(addr)
*/
extern inline void put_fs_byte(char val,char *addr)
{
__asm__("movb %0,%%fs:%1"::"r"(val),"m"(*addr));
}
/*将一字放在fs段中指定内存地址处
*参数:val-长字值,addr-内存地址
*%0-寄存器(val),%1-内存地址(addr)
*/
extern inline void put_fs_word(short val,short *addr)
{
__asm__("movw %0,%%fs:%1"::"r"(val),"m"(*addr));
}
/*将一长字放在fs段中指定内存地址处
*参数:val-长字值,addr-内存地址
*%0-寄存器(val),%1-内存地址(addr)
*/
extern inline void put_fs_long(unsigned long val,unsigned long*addr)
{
__asm__("movl %0,%%fs:%1"::"r"(val),"m"(*addr));
}
//取fs段寄存器值
//返回,fs寄存器值
extern inline unsigned long get_fs()
{
unsigned short _v;
__asm__("mov %%fs,%%al":"=a"(_v):);
return _v;
}
//取ds段寄存器值
//返回,ds寄存器值
extern inline unsigned long get_ds()
{
unsigned short _v;
__asm__("mov %%ds,%%al":"=a"(_v):);
return _v;
}
//设置fs段寄存器
//参数:val-段值
extern inline void set_fs(unsigned long val)
{
__asm__("mov %0.%%fs"::"a"((unsigned long)(val)));
}