【详细分析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


相关文章
|
2月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
583 2
|
2月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
335 2
|
3月前
|
并行计算 C++ Windows
|
机器学习/深度学习 人工智能 API
如何在c++侧编译运行一个aclnn(AOL)算子?
CANN的AOL库提供了一系列高性能算子API,优化了昇腾AI处理器的调用流程。通过两段式接口设计,开发者可以高效地调用算子库API,实现模型创新与应用,提升开发效率和模型性能。示例中展示了如何使用`aclnnAdd`算子,包括环境初始化、算子调用及结果处理等步骤。
|
程序员 编译器 C++
【C++核心】C++内存分区模型分析
这篇文章详细解释了C++程序执行时内存的四个区域:代码区、全局区、栈区和堆区,以及如何在这些区域中分配和释放内存。
193 2
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
181 0
|
11月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
447 5
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
608 22