text: #include <stdio.h>
  #include <stdlib.h>
  
  int main(int argc, char **argv)
  {
    unsigned long  sp1;
    unsigned long  sp2;
    unsigned long  sp3;
    unsigned short fs1;
    unsigned short fs2;
  
    fs1 = 0x0003;
    
    asm("movw %4, %%fs\n"
        "movl %%esp, %0\n"
        "pushw %%fs\n"
        "movl %%esp, %1\n"
        "popw %%fs\n"
        "movl %%esp, %2\n"
        "movw %%fs, %3\n"
        : "=r" (sp1), "=r" (sp2), "=r" (sp3), "=r" (fs2)
        : "r" (fs1)
        : "ax"
        );
  
    printf("sp change after push = %ld\n", sp2 - sp1);
    printf("sp change after pop = %ld\n", sp3 - sp2);
    printf("fs after push and pop = %04x\n", fs1);
     
    asm("movw %4, %%fs\n"
        "movl %%esp, %0\n"
        "pushl %%fs\n"
        "movl %%esp, %1\n"
        "popl %%fs\n"
        "movl %%esp, %2\n"
        "movw %%fs, %3\n"
        : "=r" (sp1), "=r" (sp2), "=r" (sp3), "=r" (fs2)
        : "r" (fs1)
        : "ax"
        );
  
    printf("sp change after push = %ld\n", sp2 - sp1);
    printf("sp change after pop = %ld\n", sp3 - sp2);
    printf("fs after push and pop = %04x\n", fs1);
   
    exit(0);
  }
  