有一个关于堆栈的问题???

neke 2002-09-22 12:15:08
有一个关于堆栈的问题,不知道我理解的对不对.比如说有一段程序:

地址 代码

100 int x = 5;
101 int y = 7;
102 cout<<x;
103 Func(x,y);
104 y = 9;
105 return;

1当程序转去执行Func()函数时,指令指针寄存器中的地址加1,成为地址104,随后这个地址(104)被放入堆栈,它作为函数Func()的返回地址。2然后在堆栈中,也就是在地址104的上面为返回值的类型开辟新的空间(书上说这个空间不放入任何值,直到本地变量被初始化。这点我不是很理解,本地变量指的是哪里的变量?)。3被调用函数的地址放在一块特殊内存区域中,这时候指令指针开始执行被调用函数。4当前的堆栈栈顶被存入栈帧(当前的堆栈是为返回值的类型开辟新的空间的地址吗?)。5函数所有变元放入堆栈。6现在执行指令指针中的指令,也就是函数的第一条指令。7局部变量按期定义的方式压入堆栈。8当函数返回时,返回值放入为返回值的类型开辟的新空间。9然后堆栈直接移到栈帧指针,弹出上面所有局部变量和变元。10返回值被弹出堆栈。11从堆栈恢复104到指令指针。12然后返回指令指针去执行104。

我这样理解对吗?你可以讲更深入一些吗???/谢谢!!!
...全文
25 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
neke 2002-09-22
  • 打赏
  • 举报
回复
谢谢楼上的两位大侠!!:)
xiaogangzi 2002-09-22
  • 打赏
  • 举报
回复
1. 这是变量作用域的问题.本地变量指的是那些在被调用函数中定义,只能在本函数中使用的变量,函数块结束,变量所占用的空间即被释放。
2.函数调用过程大体是这样,他和中断处理基本相同,可参见相关汇编语言知识
3.8088/8086/单片机等的指令执行顺序均为:保存现场(压栈)--处理--恢复现场(出栈)
mylove0618 2002-09-22
  • 打赏
  • 举报
回复
函数的调用只不过是代码执行时,从顺序执行的地方跳转到另外一个代码块而已。至于在跳转的时候编译器会做什么,就是建立堆栈段,保存原来的现场包括后面的指令地址,传递参数,等等。函数代码段执行完成,弹出栈中数据,销毁栈,恢复现场,继续后面的执行。至于具体的实现,你可以看看反汇编后的代码。可能不同的编译器执行的操作顺序不一样。不过效果一样的。

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧