四时宝库

程序员的知识宝库

站在C语言的肩膀上学汇编(1):栈(c语言 栈)

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

站在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进制)
  • 注:栈顶是向内存地址小的方向移动。

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

    从图中可知

    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语言里局部变量的地址是在栈上的。

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

    发表评论:

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言
      友情链接