寄存器
这些寄存器可以用于多种操作,如算术运算、数据传输等。在 x86 架构中,这些包括:
通用
这些寄存器可以用于多种操作,如算术运算、数据传输等
AX/EAX/RAX:累加器,用于算术运算。通常用于存储函数调用返回值
BX/EBX/RBX:基址寄存器,用于地址指定。
CX/ECX/RCX:计数寄存器,用于字符串操作和循环计数,this指针
DX/EDX/RDX:数据寄存器,用于 I/O 操作和一些算术运算。
索引寄存器
用于字符串操作和数组处理:
SI/ESI/RSI:源索引寄存器,用于字符串操作中的源地址指定。
DI/EDI/RDI:目的索引寄存器,用于字符串操作中的目标地址指定。字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
指针寄存器
用于指向栈和基址:
IP/EIP/RIP:指令指针寄存器,包含下一条要执行的指令的地址。
IR(指令寄存器):存储当前正在执行的指令。
SP/ESP/RSP:堆栈指针寄存器,指向栈顶。栈顶指针,指向栈的顶部
BP/EBP/RBP:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量
状态和控制寄存器
FLAGS/EFLAGS/RFLAGS:标志寄存器,包含了当前状态标志,如零标志、进位标志、溢出标志等。
CR0、CR1、…:控制寄存器,用于控制操作系统的行为,如内存管理、缓存控制等。
段寄存器
在 x86 架构中,用于内存分段:
CS:代码段寄存器,包含当前执行代码的段基址。
DS:数据段寄存器,通常包含数据的段基址。
SS:堆栈段寄存器,包含栈的段基址。
ES、FS、GS:额外的段寄存器,用于特殊用途。
R8 - 第8个通用寄存器,可用于多种目的。
R9 - 第9个通用寄存器,可用于多种目的。
R10 - 第10个通用寄存器,可用于多种目的。
R11 - 第11个通用寄存器,可用于多种目的。
R12 - 第12个通用寄存器,可用于多种目的。
R13 - 第13个通用寄存器,可用于多种目的。
R14 - 第14个通用寄存器,可用于多种目的。
R15 - 第15个通用寄存器,可用于多种目的。
函数调用使用
rax:通常用于存储函数调用返回值
rsp:栈顶指针,指向栈的顶部
rdi:第一个入参
rsi:第二个入参
rdx:第三个入参
rcx:第四个入参
r8:第五个入参
r9:第六个入参
rbx:数据存储,遵循Callee Save原则
rbp:数据存储,遵循Callee Save原则
r12~r15:数据存储,遵循Callee Save原则
r10~r11:数据存储,遵循Caller Save原则
参考
https://zhuanlan.zhihu.com/p/664901746
https://zhuanlan.zhihu.com/p/502718676
指令
MOV 将源操作数传送到目标操作数
ADD 将源操作数与目标操作数相加 最后结果给到目标操作数
SUB 将源操作数与目标操作数相减 最后结果给到目标操作数
AND 将源操作数与目标操作数进行与运算 最后结果给到目标操作数
OR 将源操作数与目标操作数进行或运算 最后结果给到目标操作数
XOR 将源操作数与目标操作数进行异或运算 最后结果给到目标操作数
NOT 将源操作数与目标操作数进行异非运算 最后结果给到目标操作数
MOVS 数据传送 与MOV不同处在于它可以将内存的数据传送到内存
STOS 将 AL AX EAX 的值存到EDI指定的内存地址
REP 循环
先入后出
PUSH 押入 通用寄存器 内存地址 立即数
POP 释放。通用寄存器 内存地址
JMP指令 (EIP劫持)
JMP 寄存器 内存 立即数
修改EIP
CALL指令 相当于
push %eip
jmp addr
RET 指令 表示返回
参考
https://www.cnblogs.com/mazhimazhi/p/15241450.html