1*87aa9c9eSJonas Devlieghere #include <cinttypes>
2*87aa9c9eSJonas Devlieghere #include <cstdint>
3*87aa9c9eSJonas Devlieghere #include <cstdio>
4*87aa9c9eSJonas Devlieghere
main()5*87aa9c9eSJonas Devlieghere int main() {
6*87aa9c9eSJonas Devlieghere constexpr uint32_t fill = 0x0F0F0F0F;
7*87aa9c9eSJonas Devlieghere
8*87aa9c9eSJonas Devlieghere uint32_t eax, ebx, ecx, edx, esi, edi;
9*87aa9c9eSJonas Devlieghere // need to use 64-bit types due to bug in clang
10*87aa9c9eSJonas Devlieghere // https://bugs.llvm.org/show_bug.cgi?id=41748
11*87aa9c9eSJonas Devlieghere uint64_t esp, ebp;
12*87aa9c9eSJonas Devlieghere
13*87aa9c9eSJonas Devlieghere asm volatile(
14*87aa9c9eSJonas Devlieghere // save esp & ebp
15*87aa9c9eSJonas Devlieghere "movd %%esp, %%mm0\n\t"
16*87aa9c9eSJonas Devlieghere "movd %%ebp, %%mm1\n\t"
17*87aa9c9eSJonas Devlieghere "\n\t"
18*87aa9c9eSJonas Devlieghere "movl %8, %%eax\n\t"
19*87aa9c9eSJonas Devlieghere "movl %8, %%ebx\n\t"
20*87aa9c9eSJonas Devlieghere "movl %8, %%ecx\n\t"
21*87aa9c9eSJonas Devlieghere "movl %8, %%edx\n\t"
22*87aa9c9eSJonas Devlieghere "movl %8, %%esp\n\t"
23*87aa9c9eSJonas Devlieghere "movl %8, %%ebp\n\t"
24*87aa9c9eSJonas Devlieghere "movl %8, %%esi\n\t"
25*87aa9c9eSJonas Devlieghere "movl %8, %%edi\n\t"
26*87aa9c9eSJonas Devlieghere "\n\t"
27*87aa9c9eSJonas Devlieghere "int3\n\t"
28*87aa9c9eSJonas Devlieghere "\n\t"
29*87aa9c9eSJonas Devlieghere // copy new values of esp & ebp
30*87aa9c9eSJonas Devlieghere "movd %%esp, %4\n\t"
31*87aa9c9eSJonas Devlieghere "movd %%ebp, %5\n\t"
32*87aa9c9eSJonas Devlieghere // restore saved esp & ebp
33*87aa9c9eSJonas Devlieghere "movd %%mm0, %%esp\n\t"
34*87aa9c9eSJonas Devlieghere "movd %%mm1, %%ebp\n\t"
35*87aa9c9eSJonas Devlieghere : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx), "=y"(esp), "=y"(ebp),
36*87aa9c9eSJonas Devlieghere "=S"(esi), "=D"(edi)
37*87aa9c9eSJonas Devlieghere : "i"(fill)
38*87aa9c9eSJonas Devlieghere : "%mm0", "%mm1"
39*87aa9c9eSJonas Devlieghere );
40*87aa9c9eSJonas Devlieghere
41*87aa9c9eSJonas Devlieghere printf("eax = 0x%08" PRIx32 "\n", eax);
42*87aa9c9eSJonas Devlieghere printf("ebx = 0x%08" PRIx32 "\n", ebx);
43*87aa9c9eSJonas Devlieghere printf("ecx = 0x%08" PRIx32 "\n", ecx);
44*87aa9c9eSJonas Devlieghere printf("edx = 0x%08" PRIx32 "\n", edx);
45*87aa9c9eSJonas Devlieghere printf("esp = 0x%08" PRIx32 "\n", static_cast<uint32_t>(esp));
46*87aa9c9eSJonas Devlieghere printf("ebp = 0x%08" PRIx32 "\n", static_cast<uint32_t>(ebp));
47*87aa9c9eSJonas Devlieghere printf("esi = 0x%08" PRIx32 "\n", esi);
48*87aa9c9eSJonas Devlieghere printf("edi = 0x%08" PRIx32 "\n", edi);
49*87aa9c9eSJonas Devlieghere
50*87aa9c9eSJonas Devlieghere return 0;
51*87aa9c9eSJonas Devlieghere }
52