程序14-16 linux/include/asm/segment.h


    //// 读取fs段中指定地址处的字节。

    // 参数:addr - 指定的内存地址。

    // %0 - (返回的字节_v)%1 - (内存地址addr)

    // 返回:返回内存fs:[addr]处的字节。

    // 3行定义了一个寄存器变量_v,该变量将被保存在一个寄存器中,以便于高效访问和操作。

  1 extern inline unsigned char get_fs_byte(const char * addr)

  2 {

  3         unsigned register char _v;

  4

  5         __asm__ ("movb %%fs:%1,%0":"=r" (_v):"m" (*addr));

  6         return _v;

  7 }

  8

    //// 读取fs段中指定地址处的字。

    // 参数:addr - 指定的内存地址。

    // %0 - (返回的字_v)%1 - (内存地址addr)

    // 返回:返回内存fs:[addr]处的字。

  9 extern inline unsigned short get_fs_word(const unsigned short *addr)

 10 {

 11         unsigned short _v;

 12

 13         __asm__ ("movw %%fs:%1,%0":"=r" (_v):"m" (*addr));

 14         return _v;

 15 }

 16

    //// 读取fs段中指定地址处的长字(4字节)

    // 参数:addr - 指定的内存地址。

    // %0 - (返回的长字_v)%1 - (内存地址addr)

    // 返回:返回内存fs:[addr]处的长字。

 17 extern inline unsigned long get_fs_long(const unsigned long *addr)

 18 {

 19         unsigned long _v;

 20

 21         __asm__ ("movl %%fs:%1,%0":"=r" (_v):"m" (*addr)); \

 22         return _v;

 23 }

 24

    //// 将一字节存放在fs段中指定内存地址处。

    // 参数:val - 字节值;addr - 内存地址。

    // %0 - 寄存器(字节值val)%1 - (内存地址addr)

 25 extern inline void put_fs_byte(char val,char *addr)

 26 {

 27 __asm__ ("movb %0,%%fs:%1"::"r" (val),"m" (*addr));

 28 }

 29

    //// 将一字存放在fs段中指定内存地址处。

    // 参数:val - 字值;addr - 内存地址。

    // %0 - 寄存器(字值val)%1 - (内存地址addr)

 30 extern inline void put_fs_word(short val,short * addr)

 31 {

 32 __asm__ ("movw %0,%%fs:%1"::"r" (val),"m" (*addr));

 33 }

 34

    //// 将一长字存放在fs段中指定内存地址处。

    // 参数:val - 长字值;addr - 内存地址。

    // %0 - 寄存器(长字值val)%1 - (内存地址addr)

 35 extern inline void put_fs_long(unsigned long val,unsigned long * addr)

 36 {

 37 __asm__ ("movl %0,%%fs:%1"::"r" (val),"m" (*addr));

 38 }

 39

 40 /*

 41  * Someone who knows GNU asm better than I should double check the followig.

 42  * It seems to work, but I don't know if I'm doing something subtly wrong.

 43  * --- TYT, 11/24/91

 44  * [ nothing wrong here, Linus ]

 45  */

    /*

     * 比我更懂GNU汇编的人应该仔细检查下面的代码。这些代码能使用,但我不知道是否

     * 含有一些小错误。

     * --- TYT19911124

     * [ 这些代码没有错误,Linus ]

     */

 46

    //// fs段寄存器值(选择符)

    // 返回:fs段寄存器值。

 47 extern inline unsigned long get_fs()

 48 {

 49         unsigned short _v;

 50         __asm__("mov %%fs,%%ax":"=a" (_v):);

 51         return _v;

 52 }

 53

    //// ds段寄存器值。

    // 返回:ds段寄存器值。

 54 extern inline unsigned long get_ds()

 55 {

 56         unsigned short _v;

 57         __asm__("mov %%ds,%%ax":"=a" (_v):);

 58         return _v;

 59 }

 60

    //// 设置fs段寄存器。

    // 参数:val - 段值(选择符)。

 61 extern inline void set_fs(unsigned long val)

 62 {

 63         __asm__("mov %0,%%fs"::"a" ((unsigned short) val));

 64 }

 65

 66