硬盘上有个程序,运行时要装进内存,但程序代码被装入内存的什么位置,是由什么决定的?

还有,8086汇编的数据/代码段有啥用,能建立多少个,能否通俗的概述一下。学了半天汇编,到头来来怎么一回事都不懂。。。。。。51单片机到明白,程序放在rom里,cpu从r... 还有,8086汇编的数据/代码段有啥用,能建立多少个,能否通俗的概述一下。学了半天汇编,到头来来怎么一回事都不懂。。。。。。
51单片机到明白,程序放在rom里,cpu从rom里读取,执行,也没啥段的概念。80x86内存到底分配使用,是在迷糊。。。。

基本咋回事不条理,具体也不大会问,就请高手看着给我概述一下吧。满意的话再加100分。

谢拉!!!!
=======既然内存分配是操作系统完成的,那么汇编时还要分什么数据段,代码段什么的干嘛,还要cs,ds干嘛??==========
展开
 我来答
Fixend
2006-11-13 · TA获得超过1978个赞
知道小有建树答主
回答量:710
采纳率:0%
帮助的人:1060万
展开全部
程序代码被装入内存的什么位置,是由操作系统决定,没有操作系统的电脑是不能运行软件的。操作系统拥有管理内存的能力。

一个程序在系统内存中是这样表示的:
/------------------\ 内存低地址
| |
| 文本 |
| |
|------------------|
| (已初始化) |
| 数据 |
| (未初始化) |
|------------------|
| |
| 栈 |
| |
\------------------/ 内存高地址

文本区域是由程序确定的, 包括代码(指令)和只读数据. 该区域相当于可执行文件的文本段. 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误。

数据区域包含了已初始化和未初始化的数据. 静态变量储存在这个区域中. 数据区域对应可执行文件中的data-bss段. 它的大小可以用系统调用来改变.如果bss数据的扩展或用户栈把可用内存消耗光了, 进程就会被阻塞住, 等待有了一块更大的内存空间之后再运行. 新内存加入到数据和栈段的中间.

栈是一个在计算机科学中经常使用的抽象数据类型. 栈中的物体具有一个特性:最后一个放入栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列.调用一个C函数就在这里发生一大堆的操作,如传递参数。。。。

这些和单片机有区别,很难简单说清楚,可以写一本书的了。

你学了<<操作系统原理>>,同时学习一下windows的编程就懂了。

注意了,程序在很多现代操作系统里都只能操作逻辑地址,不能操作物理地址,如A程序的0xFF地址和B程序的0xFF地址是不同的,大家都影射到不同的物理地址。这是为了防止程序错误地影响其他程序。

也就是将数据错误地写入其他程序的重要区域,从而使其他程序结束在现在的多数操作系统是不会发生。

要资料就给我发邮件,我给你发一份。Fixend@163.com
s903s
2006-11-13 · TA获得超过2181个赞
知道小有建树答主
回答量:424
采纳率:0%
帮助的人:0
展开全部
=======既然内存分配是操作系统完成的,那么汇编时还要分什么数据段,代码段什么的干嘛,还要cs,ds干嘛??==========

内存中可存放数值的储存位置为地址。8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS的有效控制范围,早期CPU的寄存器都是16位的,仅限于处理16位数据,即只有0到64K,如果内存不大于64K, 问题就简单了。但是计算机的发展很快就突破了64K内存。为了访问大于64K的内存,出现了段的概念,即将内存分为大小为64K的段。所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment):16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553。
在16位编程中,段是必不可少的。幸运的是,这个问题已经在32位Windows(95及以上)中得到解决。32位编程可以不用考虑段的概念了,可以直接寻址4GB。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sdyredwolf
2006-11-21 · TA获得超过209个赞
知道小有建树答主
回答量:170
采纳率:0%
帮助的人:144万
展开全部
问题没那么复杂,楼主是希望得到原理层次上的回答吧。

1、硬盘程序装入内存,其位置由操作系统决定,也就是写操作系统程序的人,来决定。

2、8086数据段存数据,代码段存代码,以示类型的分别。
比如,同样00010001,计算机怎么知道是数据11H,还是汇编指令的机器码呢?

3、“51单片机到明白,程序放在rom里,cpu从rom里读取,执行”。这只是程序代码的情况,其实里面也分数据段、代码段。

4、“有了操作系统,还要汇编中的数据段、代码段,CS、DS干什么?”
因为汇编是转成机器码以后直接执行的,这些是让你直接指挥机器干活的工具啊。

5、你用C/C++等语言的话,则是由编译器来把它们转换成汇编程序。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dakiler
2006-11-13 · TA获得超过456个赞
知道小有建树答主
回答量:324
采纳率:0%
帮助的人:346万
展开全部
可能是存储管理中有用
1.早期的操作系统只支持单进程 所以几乎所有的内存都分配给这个进程.
2.操作系统支持多道程序设计时,最先的存储管理方法是静态地将内存分割成几块.例如1000K的内存
分为 100K 200K 300K 400K
当一个进程需要250K的内寸时,分配300K的给它
这种管理方法不是很有效,因为不能刚刚好,会有浪费
3.动态分配
事先并不分割,操作系统只是维护一张表,用于标记未用的区域
(起始地址,长度)
当分配或释放时,修改这张表的内容
4.分页系统,操作系统将内存分为大小相同的若干块(比如4K),是否已用只需用一个BitSet就能记录.注意到123的管理,进程内存空间是连续的,而这里,可以不连续,将进程的需要的空间划分成几页,就向操作系统申请多少.再完成映射(应该是在载入的时候).
5.分段系统, 同样将一个进程需要的内存空间划分,不同的是,大小不一定相同,分段系统能更好地支持进程间的存储空间共享和动态申请.

还有内存的分配并不是直接由CPU决定的,主要是操作系统,当然CPU中的某些寄存器用来辅助进行存储管理.就象楼上说的逻辑地址而不是实际地址的方法,来避免进程之间的干扰(同一内存地址被两个进程访问).

还忘记说了分段系统能更好的支持虚拟存储,将暂时不用的内存中的数据复制到硬盘,需要的时候再复制回来.段就是这样的复制的最小单位.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式