令C语言中还使用堆栈进行 参数的传递 >局部变量的使用 1958 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
❖C语言中还使用堆栈进行 ➢参数的传递 ➢局部变量的使用
小程序 #inc lude <stdio. h> void pl(char c) printf("cⅦn",c); 源文件: test. c int p2 (int x, int y) 这是一个很简单的C程序 main函数中调用了函数p和 return x+; D2 int(main oid) 首先使用gc成 itest. c的可执行 char cs'a' 文件 int x,y, Zi 然后使用 objdump-S获得test的 X=1 反汇编文件 ④pI(C); p2(X, y) printf("od=od+od\n",z,x,y) 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
一段小程序 源文件:test.c 这是一个很简单的C程序 main函数中调用了函数p1和 p2 首先使用gcc生成test.c的可执行 文件test 然后使用objdump –S获得test的 反汇编文件
观察程序运行时堆栈的变化 el p p2 p2 1958 esp p2堆栈 main elp. elp e p1(c) main X,Y e esp p2(x,y) main堆栈 elp 堆栈 程序的代码段 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
eip eip eip eip 观察程序运行时堆栈的变化 main … p1(c) … p2(x,y) … p1 p2 main p2 p1 程序的代码段 堆栈 eip esp main堆栈 c eip eip eip p1的堆栈 esp eip eip eip x,y eip p2堆栈 eip
另一救小程序 和前一段小程序稍有不同 #inc lude <stdio h> void pl(char c) printf("%cⅦn",c); 在这个小程序中,main函数中 int p2(int x, int y) 调用了函数p2,而在p2的执行 过程中又调用了函数p1 char p1(c); return x+y; int main (void) int x,y, z X=1; y=2; Z甲p2(x,y) printf ("od+od=od\n",x,y,) q 嵌入式系统实验室 return EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
另一段小程序 和前一段小程序稍有不同 在这个小程序中,main函数中 调用了函数p2,而在p2的执行 过程中又调用了函数p1
观察程序运行时堆栈的变化 ep→n1 esp elp p1堆栈 2 eip→ elp eli pP21958 p1(c) elp. esp p2堆栈 el elp main ep X esp maIn p2 x, y) main堆栈 el 堆栈 程序的代码段 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
观察程序运行时堆栈的变化 eip eip eip eip main … p2(x,y) … p1 p2 … p1(c) … main p2 p1 程序的代码段 堆栈 eip esp main堆栈 esp eip eip x,y eip p2堆栈 eip eip eip eip c eip p1堆栈 esp