1#include <cinttypes>
2#include <cstdint>
3#include <cstdio>
4
5int 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

source code of lldb/test/Shell/Register/Inputs/x86-gp-write.cpp