| 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 | |