栈,函数,参数,局部变量之间的关系
2010-11-03 18:46
267 查看
栈的定义及规则: 栈从高位到底位顺序来排列数据, 栈顶<=栈底 && 栈顶>=0, 栈顶始终指向最顶端的数据. Push(EAX) : TOP--, S[TOP]=EAX; //先减栈顶, 再进数据 Pop(EAX) : S[TOP]=EAX, TOP++; //先出数据,再加栈顶 初始值: EBP=ESP=20 (EBP-ESP=0,0个数据) 假如有以下栈段(Step0)与函数ST(): STACK 0-19 //定义栈开始位置0,共20字节 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 z ->ESP 7 7 7 7 7 7 y 8 8 8 8 8 8 x 9 9 9 9 s[3] ->ESP 9 s[3] ->EBP=ESP 9 s[3] ->EBP 10 10 10 10 s[2] 10 s[2] 10 s[2] 11 11 11 11 s[1] 11 s[1] 11 s[1] 12 12 12 12 s[0] 12 s[0] 12 s[0] 13 13 13 r[3] ->ESP 13 r[3] 13 r[3] 13 r[3] 14 14 14 r[2] 14 r[2] 14 r[2] 14 r[2] 15 15 15 r[1] 15 r[1] 15 r[1] 15 r[1] 16 16 16 r[0] 16 r[0] 16 r[0] 16 r[0] 17 17 'a' ->ESP 17 'a' 17 'a' 17 'a' 17 'a' 18 18 'b' 18 'b' 18 'b' 18 'b' 18 'b' 19 19 'c' 19 'c' 19 'c' 19 'c' 19 'c' Step0 step1 step2 step3 step4 step5 函数定义 function ST (char a, char b, char c) { char x=a; char y=b; char z=c; char n=x+y+z; } 下面让我们来详细描述一下函数调用时,栈是如何使用的: 1.将参数压栈: push 'c' ESP-- ESP=19 S[19]='c' push 'b' ESP-- ESP=18 S[18]='b' push 'a' ESP-- ESP=17 S[17]='a' 执行后如图:step1 2.CALL 函数地址 将下一个指令的地址压栈,作为函数的返回地址char r[4](4字节的地址) push(r[0]) ESP-- ESP=16 S[16]=r[0] push(r[1]) ESP-- ESP=15 S[15]=r[1] push(r[2]) ESP-- ESP=14 S[14]=r[2] push(r[3]) ESP-- ESP=13 S[13]=r[3] 注意:整形数据压栈的字节顺序是从低字节到高字节压栈,形成的顺序跟内存中的整数顺序相反 执行后如图:step2 3.函数体--保护栈底(EBP) char s[4]=EBP; push(s[0]) ESP-- ESP=12 S[12]=s[0] push(s[1]) ESP-- ESP=11 S[11]=s[1] push(s[2]) ESP-- ESP=10 S[10]=s[2] push(s[3]) ESP-- ESP=9 S[9] =s[3] 执行后如图:step3 4.函数体--设置栈底&&保存栈顶(ESP) MOV EBP,ESP //EBP=ESP 执行后如图:step4 5.函数体--声明局部变量 SUB ESP,0x03 //定义3个局部变量 x,y,z 总长度3个字节,ESP=ESP-3=5 执行后如图:step5 6.函数体--使用参数与局部变量 //参数 a=[EBP+8]; b=[EBP+9]; c=[EBP+10]; //局部变量 x=[EBP-1]; y=[EBP-2]; z=[EBP-3]; 7.函数体--恢复栈顶(ESP) MOV ESP,EBP 8.函数体--恢复栈底(EBP) POP EBP 9.返回调用函数 RET,相当于下面指令 POP EDX // EDX=r[4] 让EDX等于返回地址 JMP EDX // 跳转到EDX 此时,EBP=ESP=20,又恢复到函数调用前的栈状态
相关文章推荐
- 栈,函数,参数,局部变量之间的关系
- c++中的虚函数和多态之间的关系
- A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数
- 函数多个返回值(返回多个参数/局部变量)通过双重指针来实现
- C函数与汇编函数之间参数及返回值传递方法
- 秒懂JS对象、构造器函数和原型对象之间的关系
- 正在学习函数与泪之间的关系
- OpenGL中glVertex2f函数与gluOrtho2D的参数的对应关系,以及常见函数的对应坐标系
- 函数递归调用: 调用者 与 被调用者之间的四种数据传递关系
- C函数与汇编函数之间参数及返回值传递方法
- 作用域、链接属性、存储类型示例——文件之间变量、函数的关系
- 虚函数和多态之间的关系
- linux-0.11调试教程,task2的参数,copy_strings()函数和create_tables()函数的关系
- 秒懂JS对象、构造器函数和原型对象之间的关系
- javascript的变量、传值、传址、参数之间关系
- C函数关于qsort最后一个函数指针参数指向的函数的返回值和升序排序的关系
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
- 应用程序调用dll组件,及dll组件之间的关系,dll中类及函数的导入导出;dll的导出方式和链接方式分析(一)
- Window系统、主函数和窗口函数这三者之间的关系
- 秒懂JS对象、构造器函数和原型对象之间的关系