1 #include <stdio.h>
2 #include <stdlib.h>
3 
main(int argc,char ** argv)4 int main(int argc, char **argv)
5 {
6   unsigned long  sp1;
7   unsigned long  sp2;
8   unsigned long  sp3;
9   unsigned short fs1;
10   unsigned short fs2;
11 
12   fs1 = 0x0003;
13 
14   asm("movw %4, %%fs\n"
15       "movl %%esp, %0\n"
16       "pushw %%fs\n"
17       "movl %%esp, %1\n"
18       "popw %%fs\n"
19       "movl %%esp, %2\n"
20       "movw %%fs, %3\n"
21       : "=r" (sp1), "=r" (sp2), "=r" (sp3), "=r" (fs2)
22       : "r" (fs1)
23       : "ax"
24       );
25 
26   printf("sp change after push = %ld\n", sp2 - sp1);
27   printf("sp change after pop = %ld\n", sp3 - sp2);
28   printf("fs after push and pop = %04x\n", fs1);
29 
30   asm("movw %4, %%fs\n"
31       "movl %%esp, %0\n"
32       "pushl %%fs\n"
33       "movl %%esp, %1\n"
34       "popl %%fs\n"
35       "movl %%esp, %2\n"
36       "movw %%fs, %3\n"
37       : "=r" (sp1), "=r" (sp2), "=r" (sp3), "=r" (fs2)
38       : "r" (fs1)
39       : "ax"
40       );
41 
42   printf("sp change after push = %ld\n", sp2 - sp1);
43   printf("sp change after pop = %ld\n", sp3 - sp2);
44   printf("fs after push and pop = %04x\n", fs1);
45 
46   exit(0);
47 }
48