x64架构相关学习

date: 2024/6/27

常规寄存器介绍

RAX: 累加寄存器,常用于存放函数返回值。
RBX: 基址寄存器,通常用于在需要保持函数调用前后状态不变的情况下存储数据。
RCX: 计数寄存器,通常用作第一个整数参数传递给函数。
RDX: 数据寄存器,通常用作第二个整数参数传递给函数。
RSI: 源索引寄存器,常用于字符串和数组操作,指向源的位置。
RDI: 目的索引寄存器,常用于字符串和数组操作,指向目的的位置。
RBP: 基指针寄存器,用于指向当前函数栈帧的基址。
RSP: 堆栈指针寄存器,指向当前堆栈的顶部,是最重要的寄存器之一,用于追踪函数调用堆栈。
R8 - R9: 用作额外的整数参数传递(第三和第四参数)。
R10 - R11: 通常用于特定的函数调用和系统调用,或者由编译器用作临时寄存器。
R12 - R15: 这些是可供程序自由使用的额外通用寄存器,通常用于在函数调用过程中保持其值不变。

RIP:指向当前或下一个条执行的指令

函数调用和返回过程中自动修改 RSP。调用函数(call 指令)会自动将返回地址压入堆栈,这会改变 RSP 的值。当函数执行完成后,返回指令(ret)会从堆栈中弹出返回地址,并将 RSP 恢复到之前的状态。

常用指令

MOV RAX, RBX ;数据传送,将RBX中的值复制到RAX
;运算后结果都是后一个存入前一个
。ADD RAX, RBX ;加法,RBX中的值加到RAX。SUB减法。
MUL, IMUL无符号和有符号乘法。
DIV, IDIV有无符号除法。
LEA RAX, [RBX+R8*2];加载 RBX 加上 R8 乘以 2 的结果的地址到 RAX
JMP 0x00400000;无条件跳转
jne,je;条件跳转
CALL FUNC;调用FUNC函数
RET;从当前函数返回
PUSH, POP - 堆栈操作,后接一个值,将该值推入堆栈或堆栈弹出到该值
CMP RAX, RBX ;比较 RAX 和 RBX,并设置状态标用与条件跳转
TEST RAX, RAX 测试 RAX 的值是否为 0。