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