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