
进程控制块(PCB)在系统内存中,可以和其他进程同步执行
数据段存在静态内存,用于保存程序已经初始化的变量
代码段紧接着数据段,也在静态内存中
另外还有保存局部变量的栈和保存动态分配空间的堆
在内存中它们如下关系:
========高地址 =======
程序栈 堆栈段
向下增长
空内存
向上增长
堆
------ 数据段
BSS
------
非零数据
========= =======
代码 代码段
========= =======
=========低地址 =======
栈(存放着局部变量和函数参数等数据),向下生长 (可读可写可执行)
堆(给动态分配内存是使用),向上生长 (可读可写可执行)
数据段(保存全局数据和静态数据) (可读可写不可执行)
代码段(保存代码) (可读可执行不可写)
较好的编程习惯是代码段放代码、数据段放数据、栈段用来保存环境恢复环境以及存放少量的局部变量。
但这些分段并不是绝对的,早期的程序并没有这些规矩,代码、数据是容许混放的,16位的com格式的程序代码、数据段、附加数据段、栈段是容许同段的。
单独拿数据来说,数据是可以放在内存中的任何地方,只要容许你访问。数据可以放在代码段中,可以放在栈中,也可以放在系统的堆内存中。
你说的堆栈 是指内存中的 堆和栈吧, 有些人也喊栈叫 堆栈, 堆和栈是 *** 作系统为应用程序在内存中分配的一部分空间,栈通常是用来保存局部变量等,d栈压栈 *** 作等, 而堆通常是用来存储程序员申请的空间,比如new *** 作,通常需要程序员自己去delete,不然就形成僵尸内存,
而堆栈段 应该是汇编里面的 堆栈段寄存器中的一个说法吧?
堆栈段寄存器在汇编中称为 SS, Stack Segment, 是一种寄存器 。是cpu的组件吧。
以下是copy的
为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器;
DS(Data Segment):数据段寄存器;
SS(Stack Segment):堆栈段寄存器;
ES(Extra Segment):附加段寄存器。
当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。
以上纯属个人见解~ 不要拍我
你的程序并没有定义栈段。
若定义了,则应:
mov ax,seg sdeg
mov ss,ax
mov sp,top ------因为栈结构是从高地址向低地址生长的,要把栈段的最高处的偏移赋给sp
直接写 MOV AX, [BX] 是可以的,因为通过寄存器ax可以确定是传送的“字”
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)
由编译器自动分配释放
,存放函数的参数值,局部变量的值等。其 *** 作方式类似于数据结构中的栈。
2、堆区(heap)
一般由程序员分配释放,
若程序员不释放,程序结束时可能由OS回收
。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
-
程序结束后有系统释放
4、文字常量区
常量字符串就是放在这里的。
程序结束后由系统释放
5、程序代码区
存放函数体的二进制代码
汇编代码中的数据段、堆栈段、代码段、附加段具体指:
代码段,数据段,分别存入程序和数据
堆栈段是一块空白的空间用来为堆栈 *** 作作准备
附加段是对数据段的补充
数据
有字节DB,字DW,双字DD,长字DQ和十字节变量DT
希望对你有所帮助,望采纳!!!
以上就是关于进程控制块,数据段,程序段各自在内存的什么地方全部的内容,包括:进程控制块,数据段,程序段各自在内存的什么地方、汇编语言 数据段 代码段 堆栈段 数据怎么看、堆栈和堆栈段的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)