1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
#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);
}
|