站在C语言的肩膀上学汇编1栈
- C语言函数的局部变量保存在栈上;
- C语言函数的调用信息保存在调用栈上
https://m.toutiao.com/is/J7R7f85/
- C语言利用栈溢出攻击;
C语言中很多概念都与'运行时栈'相关,但它对C层是透明的,要想真正了解这些概念, 就需要去汇编层了解'运行时栈'的实现。
1. C语言函数的局部变量保存在栈上
栈示意图
- 这是汇编中的栈示意图,rsp是汇编里的寄存器,像C语言里的指针变量一样存储的是内存地址,rsp里存的一直是栈顶的内存地址。
- 栈的操作有:
压栈示意图
注:栈顶是向内存地址小的方向移动。
验证'函数局部变量保存在栈上。'
源码示意图
main函数对应的汇编代码
验证局部变量保存在栈上
从图中可知
- 给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语言里局部变量的地址是在栈上的。
创作不易,若帮助到了您,求点赞、转发。 谢谢!
https://m.toutiao.com/is/J7R7f85/
赞 (0)