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

📄 segment.h

📁 fairysky系统,是一个小型的内核,模拟linux原始版本的
💻 H
字号:
/*文件名: segment.h  说明:   段寄存器处理函数  作者:   marsinfan  日期:   2005/12/20*/extern inline unsigned char get_fs_byte(const char * addr){	unsigned register char _v;    __asm__ ("movb %%fs:%1,%0":"=q" (_v):"m" (*addr));    return _v;}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;}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;}extern inline void put_fs_byte(char val,char *addr){    __asm__ ("movb %0,%%fs:%1"::"q" (val),"m" (*addr));}extern inline void put_fs_word(short val,short * addr){    __asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr));}extern inline void put_fs_long(unsigned long val,unsigned long * addr){    __asm__ ("movl %0,%%fs:%1"::"r" (val),"m" (*addr));}extern inline void memcpy_tofs(void * to, void * from, unsigned long n){__asm__("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)    );}extern inline void memcpy_fromfs(void * to, void * from, unsigned long n){__asm__("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 ] */extern inline unsigned long get_fs() {    u32 _v;    __asm__("movl %%fs, %0":"=r" (_v):);    return _v;}extern inline unsigned long get_ds() {    u32 _v;    __asm__("movl %%ds, %0":"=r" (_v):);    return _v;}extern inline void set_fs(u32 val){    __asm__ __volatile__("movl %0, %%fs"::"r" ((u32) val));}extern inline unsigned long get_cr2() {    u32 _v;    __asm__("movl %%cr2, %0":"=r" (_v):);    return _v;}extern inline void set_esp(u32 val){    __asm__ __volatile__("movl %0, %%esp"::"r" ((u32) val));}extern inline unsigned long get_esp() {    u32 _v;    __asm__("movl %%esp, %0":"=r" (_v):);    return _v;}

⌨️ 快捷键说明

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