EIP 指令指针寄存器
核心功能:EIP存放下一条即将执行指令的内存地址,CPU 依靠 EIP 按顺序逐条取指运行
硬性规则:代码中无法使用 MOV 等普通指令直接赋值修改 EIP(mov eip,0x401000是非法代码),只能依靠专用跳转 / 调用指令间接改写
JMP 无条件跳转指令
本质功能:直接修改 EIP,强行切换代码执行位置
支持三种操作数:立即地址、通用寄存器、内存地址
jmp 0x401100 ; 立即数地址
jmp eax ; 寄存器内的值作为新EIP
jmp dword ptr esi ; 取出内存数值赋值给EIP
执行流程:把目标地址直接写入 EIP,无堆栈操作
CALL 子程序调用指令
同样会改写 EIP 实现跳转,比 JMP 多一步堆栈保存
完整执行步骤(32 位):
1.把CALL 下一条指令的返回地址压入栈:ESP = ESP - 4,ESP = 返回地址
2.将目标函数地址写入 EIP,跳转到子程序运行
作用:实现函数 / 子程序调用,预留返回的地址凭证
RET 返回指令(RETURN)
配合 CALL 成对使用,实现函数调用后回到原代码位置
32 位标准执行步骤:
1.读取栈顶保存的返回地址,赋值给 EIP
2.栈指针上移回收空间:ESP = ESP + 4
拓展:还有RET n格式,弹出地址后额外再加 n 平衡栈,多用于 stdcall 调用约定
三指令对比
JMP:只改 EIP,不操作栈,单纯跳转
CALL:压返回地址到栈 → 改 EIP,调用函数
RET:弹栈地址给 EIP → 抬高 ESP,函数返回