C++内存区域分配和段寄存器的理解(143)

些许没玩却也遗忘些了,有空就归纳下吧。

寄存器

附加段ES extra segment

数据段DS data segment->普遍说法是和ES 偏移量配合使用,来对数据的读取进行操作

代码段CS code segment->IP下一指令偏移量配合使用

堆栈段SS stack segment->SP BP;SS记录段通过SP BP来具体压栈;压人SP,压入参数SP随之移动,压人返回值,压入常用寄存器(以上便是堆栈段的压入);压入BP,SP对其MOV,压入局部变量SP动,SP返回,BP POP(以上便是二进制代码)。 SP为了永远在栈顶只要有压入它就减去相应,BP访问用的

全局段GS global segment

标志段FS flag segment 这两个stackoverflower给的解释是:多线程TLS等用的,就是系统级的全局结构体

c++程序内存

也是那些自以的规划罢了,PE文件也确实有描述。实际的访问和执行却要依靠上面的寄存器。

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于
数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与
数据结构中的堆是两回事,分配方式倒是类似于链表,

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静
态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有
系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

PE文件

dos头,看的迷迷糊糊的,倒是第一个结构如果是MZ表示所以dos可执行并兼容

PE头 通过dos头最后一个域用NTSIGNATURE来得到目标系统标志(MZ NE :win 16; LE win 32)

IMAGE_SIZEOF_FILE_HEADER
第一个域:目标机器,表示程序被构建的机器种类
是否调试版本
段实体和大小,方便提前文件大小。

PE可选段
初始堆栈大小,程序入口位置,操作系统版本,段对齐等。
SizeOfCode可执行代码大小
SizeOfInitializedData已初始化数据大小
SizeOfUninitializedData未初始化数据大小
AddressOfEntryPoint程序入口地址

可选段和段体

预定义段:windows NT有9个段,一些程序当然不需要这么多,有的还有特殊段等,所以定义上,表示可用。

可执行代码段:.text

数据段
.bss程序未初始化数据,包括所有函数或源模块中声明为static的变量
.rdata段表示只读数据,比如字符串文字量、常量和调试目录信息。
.data其它变量,出现在栈上的自动变量,和全局变量。
资源段

// //