#include #include #include 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(esp)); printf("ebp = 0x%08" PRIx32 "\n", static_cast(ebp)); printf("esi = 0x%08" PRIx32 "\n", esi); printf("edi = 0x%08" PRIx32 "\n", edi); return 0; }