#include #include #include void print_all_regs(void) { uint32_t eax, ebx, ecx, edx, esi, edi, esp, ebp, eip; uint16_t cs, ds, es, ss; asm volatile ("mov %%eax, %0" : "=r"(eax)); asm volatile ("mov %%ebx, %0" : "=r"(ebx)); asm volatile ("mov %%ecx, %0" : "=r"(ecx)); asm volatile ("mov %%edx, %0" : "=r"(edx)); asm volatile ("mov %%esi, %0" : "=r"(esi)); asm volatile ("mov %%edi, %0" : "=r"(edi)); asm volatile ("mov %%esp, %0" : "=r"(esp)); asm volatile ("mov %%ebp, %0" : "=r"(ebp)); asm volatile ( "call 1f\n" "1: pop %0\n" : "=r"(eip) ); asm volatile ("mov %%cs, %0" : "=r"(cs)); asm volatile ("mov %%ds, %0" : "=r"(ds)); asm volatile ("mov %%es, %0" : "=r"(es)); asm volatile ("mov %%ss, %0" : "=r"(ss)); printf("EAX -> 0x%x EBX -> 0x%x ECX -> 0x%x EDX -> 0x%x\n", eax, ebx, ecx, edx); printf("ESI -> 0x%x EDI -> 0x%x ESP -> 0x%x EBP -> 0x%x\n", esi, edi, esp, ebp); printf("EIP (maybe) -> 0x%x\n", eip); printf("CS -> 0x%04x DS -> 0x%04x ES -> 0x%04x SS -> 0x%04x\n", cs, ds, es, ss); } void print_gprs(void) { uint32_t eax, ebx, ecx, edx, esi, edi, esp, ebp; asm volatile ("mov %%eax, %0" : "=r"(eax)); asm volatile ("mov %%ebx, %0" : "=r"(ebx)); asm volatile ("mov %%ecx, %0" : "=r"(ecx)); asm volatile ("mov %%edx, %0" : "=r"(edx)); asm volatile ("mov %%esi, %0" : "=r"(esi)); asm volatile ("mov %%edi, %0" : "=r"(edi)); asm volatile ("mov %%esp, %0" : "=r"(esp)); asm volatile ("mov %%ebp, %0" : "=r"(ebp)); printf("EAX -> 0x%x EBX -> 0x%x ECX -> 0x%x EDX -> 0x%x\n", eax, ebx, ecx, edx); printf("ESI -> 0x%x EDI -> 0x%x ESP -> 0x%x EBP -> 0x%x\n", esi, edi, esp, ebp); }