站在C语言的肩膀上学汇编1栈

  1. C语言函数的局部变量保存在栈上;
  2. C语言函数的调用信息保存在调用栈上

https://m.toutiao.com/is/J7R7f85/

站在C语言的肩膀上学汇编(2):'运行时栈'上的调用信息

  1. C语言利用栈溢出攻击;

站在C语言的肩膀上学汇编(3):栈溢出攻击

C语言中很多概念都与'运行时栈'相关,但它对C层是透明的,要想真正了解这些概念, 就需要去汇编层了解'运行时栈'的实现。

1. C语言函数的局部变量保存在栈上

栈示意图

  1. 这是汇编中的栈示意图,rsp是汇编里的寄存器,像C语言里的指针变量一样存储的是内存地址,rsp里存的一直是栈顶的内存地址。
  2. 栈的操作有:
  • 压栈伪代码:push 0x02
  • 压栈示意图

  • 出栈伪代码:pop param, 同理会导致rsp往上移动, 并把栈顶的元素赋值给param;
  • 增加栈大小:sub $0x10,$rsp, 类似于C语言中'*rsp=*rsp-0x10'向下移动16个字节(0x10为16进制)
  • 注:栈顶是向内存地址小的方向移动。

    验证'函数局部变量保存在栈上。'

    源码示意图

    main函数对应的汇编代码

    验证局部变量保存在栈上

    从图中可知

    1. 给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处。

    1. 用p &a打印出a的地址,p $rbp-0x4打印出栈上的地址, 比对这两个地址均为0x7fffffffde3c, 说明c语言里局部变量的地址是在栈上的。

    创作不易,若帮助到了您,求点赞、转发。 谢谢!

    https://m.toutiao.com/is/J7R7f85/

    (0)

    相关推荐