🏷️x86_64 GPR
- The 64-bit versions of the 'original' x86 registers are named
rax: register a extended
rbx: register b extended
rcx: register c extended
rdx: register d extended
rbp: register base pointer (start of stack)
rsp: register stack pointer (current location in stack, growing downwards)
rsi: register source index (source for data copies)
rdi: register destination index (destination for data copies)
- The registers added for 64-bit mode are named
r8: register 8
r9: register 9
r10: register 10
r11: register 11
r12: register 12
r13: register 13
r14: register 14
r15: register 15
- These may be accessed as
- 64-bit registers using the
r prefix: rax, r15
- 32-bit registers using the
e prefix (original registers: e*x) or d suffix (added registers: r**d): eax, r15d
- 16-bit registers using no prefix (original registers:
*x) or a w suffix (added registers: r**w): ax, r15w
- 8-bit registers using
h ("high byte" of 16 bits) suffix (original registers - bits 8-15: *h): ah, bh
- 8-bit registers using
l ("low byte" of 16 bits) suffix (original registers - bits 0-7: *l) or b suffix (added registers: r**b): al, bl, r15b
📌arch/x86/include/asm/ptrace.h
struct pt_regs {
unsigned long r15;
unsigned long r14;
unsigned long r13;
unsigned long r12;
unsigned long bp;
unsigned long bx;
unsigned long r11;
unsigned long r10;
unsigned long r9;
unsigned long r8;
unsigned long ax;
unsigned long cx;
unsigned long dx;
unsigned long si;
unsigned long di;
unsigned long orig_ax;
unsigned long ip;
unsigned long cs;
unsigned long flags;
unsigned long sp;
unsigned long ss;
};
📌Usage during syscall/function call
- User-level applications use as integer registers for passing the sequence
rdi, rsi, rdx, rcx, r8 and r9.
- The kernel interface uses
rdi, rsi, rdx, r10, r8 and r9.
- For syscalls, the syscall number is in
rax.
- For procedure calls,
rax should be set to 0.
- Return value is in
rax.