函数调用时堆栈内的数据结构?

dedema 2002-05-15 09:17:30

有以下的C函数代码!
#include "stdio.h"
int fun(int a,int b)
{int x,y,z;
x=1;y=2;z=3;
return x+y+z+a+b;
}
main()
{int num1,num2,sum;

clrscr();

num1=10;num2=20;

sum=fun(num1,num2);
printf("%d",sum);
getch();
}
当以上程序运行时调用fun这个函数时,堆栈内的数据结构是怎么样的?
从栈底到栈顶依次是哪些数值!
比如:返回地址,返回值,参数值,局部变量,还有其它什么值,它们的次序分别怎样?

...全文
99 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
superzjx2000 2002-05-18
  • 打赏
  • 举报
回复
楼上说得不错 的确是一招
liem 2002-05-17
  • 打赏
  • 举报
回复
你可以在fun函数中插入一条:
printf("%p %p %p",&x,&y,&z,&a,&b);
就可以知道它们的内存地址,也就可以知道它们的顺序
dedema 2002-05-17
  • 打赏
  • 举报
回复
那么返回地址,返回值,还有bp,sp它们的值的位置呢?
coyj 2002-05-16
  • 打赏
  • 举报
回复
vc6下反汇编得
1: #include <stdio.h>
2:
3: int fun(int a,int b)
4: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,4Ch
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-4Ch]
0040102C mov ecx,13h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
5: int x,y,z;
6: x=1;y=2;z=3;
00401038 mov dword ptr [ebp-4],1
0040103F mov dword ptr [ebp-8],2
00401046 mov dword ptr [ebp-0Ch],3
7: return x+y+z+a+b;
0040104D mov eax,dword ptr [ebp-4]
00401050 add eax,dword ptr [ebp-8]
00401053 add eax,dword ptr [ebp-0Ch]
00401056 add eax,dword ptr [ebp+8]
00401059 add eax,dword ptr [ebp+0Ch]
8: }
0040105C pop edi
0040105D pop esi
0040105E pop ebx
0040105F mov esp,ebp
00401061 pop ebp
00401062 ret
--- E:\vctest\test3\test.c ---------------------------------------------------------------------------
9:
10: main()
11: {
00401080 push ebp
00401081 mov ebp,esp
00401083 sub esp,4Ch
00401086 push ebx
00401087 push esi
00401088 push edi
00401089 lea edi,[ebp-4Ch]
0040108C mov ecx,13h
00401091 mov eax,0CCCCCCCCh
00401096 rep stos dword ptr [edi]
12: int num1,num2,sum;
13:
14: num1=10;num2=20;
00401098 mov dword ptr [ebp-4],0Ah
0040109F mov dword ptr [ebp-8],14h
15:
16: sum=fun(num1,num2);
004010A6 mov eax,dword ptr [ebp-8]
004010A9 push eax
004010AA mov ecx,dword ptr [ebp-4]
004010AD push ecx
004010AE call @ILT+0(_fun) (00401005)
004010B3 add esp,8
004010B6 mov dword ptr [ebp-0Ch],eax
17:
18: printf("%d",sum);
004010B9 mov edx,dword ptr [ebp-0Ch]
004010BC push edx
004010BD push offset string "%d" (0042001c)
004010C2 call printf (00401100)
004010C7 add esp,8
19: }
004010CA pop edi
004010CB pop esi
004010CC pop ebx
004010CD add esp,4Ch
004010D0 cmp ebp,esp
004010D2 call __chkesp (00401180)
004010D7 mov esp,ebp
004010D9 pop ebp
004010DA ret
入栈顺序一目了然,当然不同的编译器略有不同
chenzhenjian 2002-05-16
  • 打赏
  • 举报
回复
famugong(伐木工)
真是这样的吗?
Last_Dodo 2002-05-16
  • 打赏
  • 举报
回复
这跟编译器有关的,最好不要依赖它。
famugong 2002-05-15
  • 打赏
  • 举报
回复
入栈的顺序:参数,返回地址,堆栈基址指针,局部变量,最后是一些寄存器的值。
niniu 2002-05-15
  • 打赏
  • 举报
回复
对高级语言讨论调用压栈好像没有意义吧。

70,021

社区成员

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

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