| #include <cinttypes> | |
| #include <cstdint> | |
| #include <cstdio> | |
| int main() { | |
| constexpr uint32_t fill = 0x0F0F0F0F; | |
| uint32_t eax, ebx, ecx, edx, esi, edi; | |
| // need to use 64-bit types due to bug in clang | |
| // https://bugs.llvm.org/show_bug.cgi?id=41748 | |
| uint64_t esp, ebp; | |
| asm volatile( | |
| // save esp & ebp | |
| "movd %%esp, %%mm0\n\t" | |
| "movd %%ebp, %%mm1\n\t" | |
| "\n\t" | |
| "movl %8, %%eax\n\t" | |
| "movl %8, %%ebx\n\t" | |
| "movl %8, %%ecx\n\t" | |
| "movl %8, %%edx\n\t" | |
| "movl %8, %%esp\n\t" | |
| "movl %8, %%ebp\n\t" | |
| "movl %8, %%esi\n\t" | |
| "movl %8, %%edi\n\t" | |
| "\n\t" | |
| "int3\n\t" | |
| "\n\t" | |
| // copy new values of esp & ebp | |
| "movd %%esp, %4\n\t" | |
| "movd %%ebp, %5\n\t" | |
| // restore saved esp & ebp | |
| "movd %%mm0, %%esp\n\t" | |
| "movd %%mm1, %%ebp\n\t" | |
| : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx), "=y"(esp), "=y"(ebp), | |
| "=S"(esi), "=D"(edi) | |
| : "i"(fill) | |
| : "%mm0", "%mm1" | |
| ); | |
| printf("eax = 0x%08" PRIx32 "\n", eax); | |
| printf("ebx = 0x%08" PRIx32 "\n", ebx); | |
| printf("ecx = 0x%08" PRIx32 "\n", ecx); | |
| printf("edx = 0x%08" PRIx32 "\n", edx); | |
| printf("esp = 0x%08" PRIx32 "\n", static_cast<uint32_t>(esp)); | |
| printf("ebp = 0x%08" PRIx32 "\n", static_cast<uint32_t>(ebp)); | |
| printf("esi = 0x%08" PRIx32 "\n", esi); | |
| printf("edi = 0x%08" PRIx32 "\n", edi); | |
| return 0; | |
| } |