些许没玩却也遗忘些了,有空就归纳下吧。
寄存器
附加段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其它变量,出现在栈上的自动变量,和全局变量。
资源段