汇编(cpu寄存器描述)
寄存器
什么是寄存器?
寄存器(Register)是CPU内部的高速存储单元,用于临时存放数据、指令或地址。它们的访问速度远快于内存(RAM),是CPU执行计算和控制流程的关键组件
通用寄存器
x86
- EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 都是32位通用寄存器
- 参数通常通过栈传递
x64
- 将原有8个寄存器扩展为64位(如RAX, RBX等,都是64位通用寄存器)
- RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP
- 新增8个64位寄存器(R8~R15)
- x64引入新的指令(如MOVSXD符号扩展指令)和优化,支持更大数据量和更高效操作
- 优先使用寄存器传递参数(如Windows用RCX, RDX, R8, R9),减少栈操作开销
- x64兼容x86指令集
虽然通通用寄存器可以随意使用,但是一般情况下,它们都自己的特殊用途
rsp
和rbp
分别是栈顶指针和栈底指针
rax
一般用作存储方法的返回值
rcx
一般用作存储程序计数器
rsi
和rdi
一般用作内存复制,一个目标地址,一个起始地址
eip
用于存放cpu下一条要执行指令的地址
堆栈
一般在程序的运行过程中,会产生很多中间数据,这些中间数据就可以保存在栈空间中,栈是由操作系统在运行程序时自动创建的
常用指令:
PUSH:把一个内存地址中的数据,或者是立即数,寄存器中的值存入到栈空间,这时ESP的地址-4(x86)
POP:把当前栈顶指针ESP的值取出来,然后ESP+4(x86)
EIP
EIP寄存器存放着CPU要执行的下一条指令的地址
我们之前在更改通用寄存器时,可以使用 mov 指令来修改,但是在eip寄存器面前,并不允许使用mov指令来直接修改里面的值
可以使用JMP指令来变相的修改eip寄存器,jmp指令是无条件跳转指令,jmp后面跟着的地址就表示要跳转到后面地址上去执行,然而eip是存放cpu下一条指令要执行的地址,这样以来eip的值也会跟着改动(jmp指令做的事情仅仅只是修改eip中的值
)
常用指令:
JMP:jpm 寄存器/立即数/内存
特殊指令:CALL
call指令用来跳转到某一函数的执行位置,它同时修改esp和eip的值,把它的下一条指令压入栈,同时修改eip的值到要跳转的地址,esp-4
特殊指令:RET
ret指令用来返回当前执行的函数,esp+4,eip中的值就改为了esp中的值,也就是call指令的下一条地址