据我所知,函数内部的局部变量是分配在栈空间里的,也就是在call指令将函数的返回地址压入之后,如若函数内部定义了若干局部变量,那ret指令是怎样找到返回地址的地址啊?小弟猜测就是在编译的时候,编译器在每次函数调用时,都记录了函数的返回地址的地址,然后在函数执行完成之后,ret指令有一部分就是jmp 返回地址的栈地址 这一条指令,从而实现函数返回,这仅是小弟的猜想,望大虾细心讲解一下,感激不尽!
2 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
堆栈的压入顺序是从高位地址向低位地址延伸,局部变量的分配方向也是这样,这个是关键。
每个函数开始一般有push bp、mov bp, sp两条指令,局部变量的分配地址都在bp之下,访问也是通过bp-n,而bp+2(32位汇编中是esp+4)才是栈顶,所以局部变量不会破坏栈顶数据,ret之前有pop bp,则栈顶数据就是call的时候压入堆栈的返回地址,没有什么“寻找返回地址”的活儿要干。
千巷猫影
TA贡献1829条经验 获得超7个赞
call指令返回地址压栈,此时返回地址存储在栈顶而此时esp正好指向栈顶,而分配局部变量空间会改变esp,所以在ret执行之前esp必须指向返回地址所存储的地方,不然就会出错
添加回答
举报
0/150
提交
取消