- call 指令的语法
call address
call 指令的操作过程
保存当前指令指针(EIP/PC): call 指令会将当前 EIP 的值(指向下一条指令的地址)压入栈中。这样做的目的是保存调用位置,以便在子程序或函数执行完成后能够返回到调用位置。
跳转到目标地址: 接下来, call 指令会将控制权传送到目标地址处,执行目标地址所指向的代码。
跳转到被调函数中后栈结构如下
high
---------------------------------
主调函数的局部变量..
---------------------------------
..
---------------------------------
传递给被调函数的参数..
---------------------------------
..
---------------------------------
返回地址 : 返回主调函数要执行的指令地址, ret 指令之前先 调整 rsp 指向这里,ret 指令读取返回
---------------------------------
<---- 主调函数 rsp
主调函数 rbp 的值 : 由被调函数压栈 <---- 被调函数 rbp
---------------------------------
被调函数的局部变量..
---------------------------------
.. <---- 被调函数 rsp
---------------------------------
low
- ret 指令
ret 指令的语法ret
没有参数
ret 指令的操作过程
恢复 EIP(指令指针): ret 指令会从栈中弹出一个地址,即 EIP 的值。这个值指向被调用函数的返回地址。这是通过将 EIP 的当前值压入堆栈来实现的。
恢复栈指针: 在弹出 EIP 之后,ret 指令会将栈指针 (ESP 或 RSP) 和 (EBP 或 RBP) 恢复到调用时的状态。这样可以恢复到调用时的上下文,使程序能够继续执行调用者的代码。 参考资料
https://blog.csdn.net/m0_47696151/article/details/121324729