⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segment.h

📁 一个用于学习的操作系统
💻 H
字号:
/*文件名: segment.h  说明:   段寄存器处理函数  作者:   marsinfan  日期:   2005/12/20*/#include <fairysky/types.h>inline static unsigned char get_fs_byte(const char * addr){    unsigned register char _v;    __asm__ __volatile__("movb %%fs:%1,%0":"=q" (_v):"m" (*addr));    return _v;}inline static unsigned short get_fs_word(const unsigned short *addr){    unsigned short _v;    __asm__ __volatile__("movw %%fs:%1,%0":"=r" (_v):"m" (*addr));    return _v;}inline static unsigned long get_fs_long(const unsigned long *addr){    unsigned long _v;    __asm__ __volatile__("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \    return _v;}inline static void put_fs_byte(char val,char *addr){    __asm__ __volatile__("movb %0, %%fs:%1"::"q" (val),"m" (*addr));}inline static void put_fs_word(short val,short * addr){    __asm__ __volatile__("movw %0,%%fs:%1"::"r" (val),"m" (*addr));}inline static void put_fs_long(u32 val, u32 * addr){    __asm__ __volatile__("movl %0,%%fs:%1"::"r" (val),"m" (*addr));}inline static void memcpy_tofs(void * to, void * from, unsigned long n){__asm__ __volatile__("cld\n\t"    "push %%es\n\t"    "push %%fs\n\t"    "pop %%es\n\t"    "testb $1,%%cl\n\t"    "je 1f\n\t"    "movsb\n"    "1:\ttestb $2,%%cl\n\t"    "je 2f\n\t"    "movsw\n"    "2:\tshrl $2,%%ecx\n\t"    "rep ; movsl\n\t"    "pop %%es"    ::"c" (n),"D" ((long) to),"S" ((long) from)    );}inline static void memcpy_fromfs(void * to, void * from, unsigned long n){__asm__ __volatile__("cld\n\t"    "testb $1,%%cl\n\t"    "je 1f\n\t"    "fs ; movsb\n"    "1:\ttestb $2,%%cl\n\t"    "je 2f\n\t"    "fs ; movsw\n"    "2:\tshrl $2,%%ecx\n\t"    "rep ; fs ; movsl"    ::"c" (n),"D" ((long) to),"S" ((long) from)    );}/* * Someone who knows GNU asm better than I should double check the followig. * It seems to work, but I don't know if I'm doing something subtly wrong. * --- TYT, 11/24/91 * [ nothing wrong here, Linus: I just changed the ax to be any reg ] */inline static unsigned long get_fs(){    u32 _v;    __asm__ __volatile__("movl %%fs, %0":"=r" (_v):);    return _v;}inline static unsigned long get_ds(){    u32 _v;    __asm__ __volatile__("movl %%ds, %0":"=r" (_v):);    return _v;}inline static void set_fs(u32 val){    __asm__ __volatile__("movl %0, %%fs"::"r" ((u32) val));}inline static unsigned long get_cr2(){    u32 _v;    __asm__ __volatile__("movl %%cr2, %0":"=r" (_v):);    return _v;}inline static void set_esp(u32 val){    __asm__ __volatile__("movl %0, %%esp"::"r" ((u32) val));}inline static unsigned long get_esp(){    u32 _v;    __asm__ __volatile__("movl %%esp, %0":"=r" (_v):);    return _v;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -