64位反汇编栈帧结构

64位反汇编栈帧结构 一、x64反汇编栈帧理解(返回地址函数内部与函数外部是分界线)二、反汇编部分截图三、x64反汇编寄存器介绍64位寄存器 低32位 低16位 低8位 在Windows x64调用约定中的角色/用途RAX EAX AX AL 返回值寄存器函数通常将整数返回值放在这里。也是除法、乘法等算术运算的累加器。RCX ECX CX CL 第1个参数函数调用时传递第一个整数/指针参数。在循环指令中可作为计数器。RDX EDX DX DL 第2个参数传递第二个整数/指针参数。也用于除法运算中存放余数。R8 R8D R8W R8B 第3个参数这是64位新增的寄存器用于传递第三个参数。R9 R9D R9W R9B 第4个参数64位新增用于传递第四个参数。R10 R10D R10W R10B 临时/静态链用于临时变量或在 syscall 指令中保存返回地址。R11 R11D R11W R11B 临时寄存器在函数调用中不保留易失性。在 syscall 指令中用于设置标志。R12 R12D R12W R12B 非易失 (Callee-saved)被调用函数必须保存并恢复它。常用于存放循环计数器或全局指针。R13 R13D R13W R13B 非易失 (Callee-saved)同上。R14 R14D R14W R14B 非易失 (Callee-saved)同上。R15 R15D R15W R15B 非易失 (Callee-saved)同上。常用于存放某些上下文中的重要指针。RBP EBP BP BPL 帧指针 (Frame Pointer)传统上用于指向栈帧的底部。但在优化过的64位代码中它经常被当作通用非易失寄存器使用像R12一样。如果你看到它被加减通常是局部变量存取如果你看到它被PUSH/POP则是作为帧指针。RSI ESI SI SIL 源变址在字符串操作中指向源地址。在Windows x64中属于易失性寄存器调用者保存。RDI EDI DI DIL 目的变址在字符串操作中指向目的地址。在Windows x64中属于易失性寄存器。RSP ESP SP SPL 栈指针 (Stack Pointer)始终指向当前栈顶。在64位中栈必须保持16字节对齐即在call指令执行前RSP必须是16的倍数。