一句话解析汇编中的ret和call指令

这篇文章有点标题党了,因为实际上这ret和call还真没法一句话说完,向下读之前,读者需要知道——

  • 什么是,栈的pop和push指的是什么
  • 初步了解了栈在函数调用中的作用

汇编中,函数调用是通过栈维护的,栈顶指针称为%rsp。通常有两类汇编命令能修改%rsp:

  • 一类是直接使用add和sub汇编指令,这种情况多用于函数在栈中分配零时空间直接通过对%rsp加减指定数值得到。
  • 另一类是pop和push汇编指令,该指令隐含了一个%rsp加一或减一的操作,多用于试图保存一个寄存器的值供后续恢复。

另一方面,有个程序运行指令的计数器%rip,时时刻刻指向下一条指令的内存位置。一般情况下,%rip都是一个一个加下去的,特例是使用了jmp指令,则%rip直接被赋值为jmp的目标地址。

当汇编指令call被调用的时候,首先会隐式调用一个push命令,将储存有“之后本应该执行的语句的地址<CALLBACK>”的寄存器%rip的值放到栈顶,然后一个jmp指令通过修改%rip,将程序指令流跳转到目标位置。

当汇编指令ret被调用的时候,首先会有一个pop命令,将栈顶的值<CALLBACK>弹出,并放在%rip中作为下一个需要执行的代码。

关于汇编中的函数调用,我在另一篇文章解析汇编中实现函数调用的若干方式中有更详细的阐述。

原创文章地址:【一句话解析汇编中的ret和call指令】,转载时请注明出处mhy12345.xyz

《一句话解析汇编中的ret和call指令》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.