前提
以下内容使用Visual Studio 2022集成开发环境,配置Windows 11系统,内容仅针对初学者。
目录
四、粗略介绍函数栈帧的创建与销毁(C语言学了80%再看比较好)
一、运行内存与操作系统的关系
Ⅰ,操作系统
市面上常见的有32位和64位操作系统。对于32位操作系统而言,在CPU内部有32根地址线,每一根地址线分为带电和不带电两种,对应1或0。于是就有了32位的二进制序列。
这2^32种二进制就称作地址,每一个地址指向一个字节,所以32位操作系统最高能控制的空间为,2^32byte等于4GB,即最高运行内存为4GB。64位操作系统同理,但在市面上很难看到64位操作系统最高运行内存,原因目前的技术造价特别高,做工也特别复杂,所以很少见运行内存很高的。
Ⅱ、运行内存
运行内存是系统运行时可用的存储空间,当你运行一个软件时系统会给他分配运行内存,用来存储必要的数据。
二、地址
由第一节已知地址是一串二进制序列,每一个地址指向一个字节
每个地址只指向一个字节,把字节看作房间,地址就是房间的门牌号。由此我们可以通过门牌号(地址)访问数据。
三、C语言的内存分布
①栈区:栈区用来存放局部变量、函数的形参、返回值。
②堆区:可用来申请内存空间存储数据(如malloc、calloc、realloc函数申请的空间就在堆上,需要手动申请,用完之后需要释放内存,否则会导致内存泄漏),堆的大小不一,可扩大或缩小。
③方法区:方法区也叫代码区,用来存放二进制形式的函数代码段。
④静态分布区:用来存放全局变量、静态变量。
⑤常量区:用来存放一种字面常量形式。
四、粗略介绍函数栈帧的创建与销毁(C语言学了80%再看比较好)
前提知识:寄存器ebp和esp,这两个寄存器中存放的是地址,用来维护函数栈帧的。具体维护如下。
示例代码:
#include <stdio.h>
int add(int x, int y)
{
int z = x + y;
return z;
}
int main()
{
int a = 5;
int b = 3;
int c = add(a, b);
return 0;
}
用汇编解释栈帧的创建与销毁——><函数栈帧的创建与销毁完整版(创作中)>