猿问

小弟主要疑问在于ret,如下具体情况

据我所知,函数内部的局部变量是分配在栈空间里的,也就是在call指令将函数的返回地址压入之后,如若函数内部定义了若干局部变量,那ret指令是怎样找到返回地址的地址啊?小弟猜测就是在编译的时候,编译器在每次函数调用时,都记录了函数的返回地址的地址,然后在函数执行完成之后,ret指令有一部分就是
jmp 返回地址的栈地址 这一条指令,从而实现函数返回,这仅是小弟的猜想,望大虾细心讲解一下,感激不尽!

明月笑刀无情
浏览 80回答 2
2回答

暮色呼如

堆栈的压入顺序是从高位地址向低位地址延伸,局部变量的分配方向也是这样,这个是关键。每个函数开始一般有push bp、mov bp, sp两条指令,局部变量的分配地址都在bp之下,访问也是通过bp-n,而bp+2(32位汇编中是esp+4)才是栈顶,所以局部变量不会破坏栈顶数据,ret之前有pop bp,则栈顶数据就是call的时候压入堆栈的返回地址,没有什么“寻找返回地址”的活儿要干。

千巷猫影

call指令返回地址压栈,此时返回地址存储在栈顶而此时esp正好指向栈顶,而分配局部变量空间会改变esp,所以在ret执行之前esp必须指向返回地址所存储的地方,不然就会出错
随时随地看视频慕课网APP

相关分类

Java
我要回答