1*87aa9c9eSJonas Devlieghere #include <cinttypes>
2*87aa9c9eSJonas Devlieghere #include <cstdint>
3*87aa9c9eSJonas Devlieghere #include <cstdio>
4*87aa9c9eSJonas Devlieghere
main()5*87aa9c9eSJonas Devlieghere int main() {
6*87aa9c9eSJonas Devlieghere constexpr uint64_t fill = 0x0F0F0F0F0F0F0F0F;
7*87aa9c9eSJonas Devlieghere
8*87aa9c9eSJonas Devlieghere uint64_t rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi;
9*87aa9c9eSJonas Devlieghere
10*87aa9c9eSJonas Devlieghere asm volatile(
11*87aa9c9eSJonas Devlieghere // save rsp & rbp
12*87aa9c9eSJonas Devlieghere "movq %%rsp, %4\n\t"
13*87aa9c9eSJonas Devlieghere "movq %%rbp, %5\n\t"
14*87aa9c9eSJonas Devlieghere "\n\t"
15*87aa9c9eSJonas Devlieghere "movq %8, %%rax\n\t"
16*87aa9c9eSJonas Devlieghere "movq %8, %%rbx\n\t"
17*87aa9c9eSJonas Devlieghere "movq %8, %%rcx\n\t"
18*87aa9c9eSJonas Devlieghere "movq %8, %%rdx\n\t"
19*87aa9c9eSJonas Devlieghere "movq %8, %%rsp\n\t"
20*87aa9c9eSJonas Devlieghere "movq %8, %%rbp\n\t"
21*87aa9c9eSJonas Devlieghere "movq %8, %%rsi\n\t"
22*87aa9c9eSJonas Devlieghere "movq %8, %%rdi\n\t"
23*87aa9c9eSJonas Devlieghere "\n\t"
24*87aa9c9eSJonas Devlieghere "int3\n\t"
25*87aa9c9eSJonas Devlieghere "\n\t"
26*87aa9c9eSJonas Devlieghere // swap saved & current rsp & rbp
27*87aa9c9eSJonas Devlieghere "xchgq %%rsp, %4\n\t"
28*87aa9c9eSJonas Devlieghere "xchgq %%rbp, %5\n\t"
29*87aa9c9eSJonas Devlieghere : "=a"(rax), "=b"(rbx), "=c"(rcx), "=d"(rdx), "=r"(rsp), "=r"(rbp),
30*87aa9c9eSJonas Devlieghere "=S"(rsi), "=D"(rdi)
31*87aa9c9eSJonas Devlieghere : "g"(fill)
32*87aa9c9eSJonas Devlieghere :
33*87aa9c9eSJonas Devlieghere );
34*87aa9c9eSJonas Devlieghere
35*87aa9c9eSJonas Devlieghere printf("rax = 0x%016" PRIx64 "\n", rax);
36*87aa9c9eSJonas Devlieghere printf("rbx = 0x%016" PRIx64 "\n", rbx);
37*87aa9c9eSJonas Devlieghere printf("rcx = 0x%016" PRIx64 "\n", rcx);
38*87aa9c9eSJonas Devlieghere printf("rdx = 0x%016" PRIx64 "\n", rdx);
39*87aa9c9eSJonas Devlieghere printf("rsp = 0x%016" PRIx64 "\n", rsp);
40*87aa9c9eSJonas Devlieghere printf("rbp = 0x%016" PRIx64 "\n", rbp);
41*87aa9c9eSJonas Devlieghere printf("rsi = 0x%016" PRIx64 "\n", rsi);
42*87aa9c9eSJonas Devlieghere printf("rdi = 0x%016" PRIx64 "\n", rdi);
43*87aa9c9eSJonas Devlieghere
44*87aa9c9eSJonas Devlieghere return 0;
45*87aa9c9eSJonas Devlieghere }
46