- C语言函数的局部变量保存在栈上;
- C语言函数的调用信息保存在调用栈上;
- C语言利用栈溢出攻击;
C语言中很多概念都与"运行时栈"相关,但它对C层是透明的,要想真正了解这些概念, 就需要去汇编层了解"运行时栈"的实现。
1. C语言函数的局部变量保存在栈上
- 这是汇编中的栈示意图,rsp是汇编里的寄存器,像C语言里的指针变量一样存储的是内存地址,rsp里存的一直是栈顶的内存地址。
- 栈的操作有:
注:栈顶是向内存地址小的方向移动。
验证"函数局部变量保存在栈上。"
从图中可知
- 给main函数在栈上分配了16个字节;
sub $0x10,%rsp C语言伪代码为*rsp=*rsp-0x10(10进制的16),栈顶向前移动了16字节,也就是给main函数在栈上分配了。
2. 由movl $0x1,-0x4(%rbp) 以及movl $0x2,-0x8(%rbp) 可知,对应的c语言代码为a = 1; b = 2;1保存在$rbp-0x4处; 2保存在$rbp-0x8处。
- 用p &a打印出a的地址,p $rbp-0x4打印出栈上的地址, 比对这两个地址均为0x7fffffffde3c, 说明c语言里局部变量的地址是在栈上的。
创作不易,若帮助到了您,求点赞、转发。 谢谢!