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