【详细分析C/C++程序运行过程】狂肝120小时,带你速览CSAPP

简介: 【详细分析C/C++程序运行过程】狂肝120小时,带你速览CSAPP

预备知识


  1. 当过程P调用Q,会把返回值压入栈,指明当Q返回时要到Q的哪个地址继续执行;
  2. Q的返回地址作为P的栈帧的一部分,因为他存放的是与P相关的状态;
  3. 调用Q后,Q在此基础上继续扩展自己的栈帧;
  4. 很多过程调用不需要栈帧,只用寄存器足够;
  5. ret就是从栈中弹出之前的那返回地址,然后把pc设为那个返回地址;
  6. 局部变量放在内存中的情况:寄存器不足;局部变量使用地址运算符&,必须为他产生一个地址;某些局部变量是数组或结构,必须能够通过数组或结构被引用访问到;
  7. 大多栈帧都是定长的,有时也要变长的fram;
  8. 通过寄存器过程P最多可传6个整数值(6个指针或者整数);
  9. 如果需要更多参数,P可以在调用Q之前在自己的栈帧存储好这些参数;
  10. 在objdump中产生的反汇编callq 和 retq ,q是64位的意思;
  11. return返回值默认返回rax的值;


函数调用数据传送示例



1668325285979.jpg

1668325303906.jpg


解析


  1. 参数7位于栈顶;
  2. 通过栈传递参数时,所有数据大小都向8的倍数对齐;
  3. 参数到位后,就可以开call了;
  4. P调用Q时,P的代码首先把参数复制到合适寄存器;
  5. P的代码可访问Q返回在rax中的返回值;
  6. 存6个的参数在栈中,我们把第7个参数放在rsp+8中,第八个参数在rsp+16;
  7. 举例把第七个char a4放到%rsp+8,第八个char* a4放到%rsp+16定义为*a4p ;
  8. *a4p+=a4-----------翻译成:先把a4的指针放到rax,movq 16(rsp),rax;
  9. 然后获得a4的值movl 8(rsp),edx放到edx;
  10. 然后计算 addb dl,(rax);用这个取值的符号计算;
  11. 当时栈的分配,因为a4其实就是一个字节的char,他会放到申请的八个字节的栈帧的最后一个字节上;


栈上的局部存储

1668325340449.jpg


看图


第二个例子:

传参数是倒着处理,先给他多的进栈。

不多的那6个进寄存器

1668325351234.jpg

1668325361330.jpg



x86-64实际内存的分配


实际分配图像


x86-64( 又称x64,即英文词64-bit extended,64位拓展的简写)是x86架构的64位拓展,向后兼容于16位及32位的x86架构。

1668325381345.jpg

1668325392442.jpg

1668325400643.jpg


注意:我们可以估计64位机器的地址大小:

通过观察 1024与1000非常接近,同时

2^10 大约等于 10^3


264**-----------**(210)6**乘以16--------------**1018乘以16


内存的限制


现在64位机器只用47位地址-------也就是差不多256TB的地址

1668325422428.jpg


这就是为什么会出现这个地址:

0x 0000 7FFF FFFF FFFF-------最高地址


栈-存放 局部变量

1668325439052.jpg


栈:大小一般限制在8MB

如果去访问一个超过8Megabyte的指针,程序会报Segmentation fault

1668325450969.jpg



文本段-存放exe二进制代码的区域


存放可执行程序的区域—文本段

read-only


executable machine instruction


数据段-存放全局变量,静态变量,字符串常量


声明的全局变量

1668325490840.jpg



堆-存放malloc,new,calloc申请的变量


动态变化

回想高地址不断增长


动态链接

printf函数…

1668325520477.jpg


相关文章
|
23天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
111 0
|
1月前
|
存储 Java 编译器
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
java和c++的主要区别、各自的优缺点分析、java跨平台的原理的深度解析
75 0
|
1月前
|
编译器 Linux C++
3C++程序的编写和实现
3C++程序的编写和实现
17 2
|
17天前
|
人工智能 机器人 编译器
【C++】Windows端VS code中运行CMake工程(手把手教学)
【C++】Windows端VS code中运行CMake工程(手把手教学)
|
24天前
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
65 0
|
25天前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
46 0
|
18天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
24天前
|
算法 Java C++
【C/C++ 内存知识扩展】内存不足的可能性分析
【C/C++ 内存知识扩展】内存不足的可能性分析
12 0
|
24天前
|
存储 监控 Linux
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
Linux 使用getrusage系统调用获取cpu信息:一个C++实例分析
48 0
|
24天前
|
存储 算法 C语言
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
36 0