. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(CPU工作原理)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  写给新人小白的  关于"段"完全解析!  [待解决] 回复[ 6次 ]   点击[ 480次 ]  
zhenglxd
[帖 主]   [ 发表时间:2009-05-04 16:51 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
一般而言学到后面的技术对于前面部分的学习会比较深厚的理解,这里说下我对“段”的看法
以不同的角度去看“段”这个概念,得到的答案都是不同的。下面我详细说明

从内存本身的角度来看,他是一窜地址连续的内存单元,内存地址是内存单元的索引,不同部分的连续的内存单元可能有不同的用处,就内存单元里面的东西来看是一窜纯粹的二进制信息,但是cpu通过不同的寄存器指向不同的段地址来对这些二进制信息进行不同的处理,比如被cs:指向的被当作代码,被ss:指向的被当作栈,被ds指向的被当作数据,等
或者说cpu通过段来得知己访问这段内存的方式。
即以cpu的角度来看,他通过段来知道这部分的信息他该派什么用处。
从物理内存角度看内存就是地址连续的内存单元。
如果以人的角度来看,你可以把地址0~2作为1段,3~4作为一段,但是这些毫无意义,这仅仅是你的习惯。我们最终的目的是让cpu去处理内存中的信息,由于8086cpu的特性
他的 物理地址=基础地址+偏移地址,段地址=基础地址/16,所以他可以用作段的基础地址必须是16的倍数。你可以理解为段地址最小为1最大为ffff。
为什么我说基础地址必须为16的倍数呢?像17这样的基础地址可以作为一个段吗,答案是可以,但是段是有长度概念,17这个物理地址的段地址为1 同时长度为16 哪怕 你这段地址只存放一个数据,这段地址的长度最小也必须是16。这不是我规定者是8086cpu特性就这样。当你像cpu申请一段内存来存放你的数据的时候他总是 提供给你16的的整数倍个 内存单元大小的容量。
你可以把多个段寄存器指向一段长度为16byte的地址给,但你无法把他们区分为2个段,为什么呢?因为段地址必须为整数,也就是基础地址必须是16的倍数。 你可以通过不同段地址和偏移地址来表示同一个物理地址。但是你无法用这个方法对付段地址,因为没有这种方法。

作为我们只要记住在8086cpu中段有最小的不可分割的长度 为16byte,段地址必须为整数,基础地址必须是16的倍数。即可。
xiaomeng008
[第1楼]   [ 回复时间:2009-05-08 00:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-04-07 09:03
顶了!!!
谢谢分享
simon8410
[第2楼]   [ 回复时间:2009-05-13 22:58 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-05-13 21:48
还不完全明白你要表达的意思,希望三天后能有进一步的理解。
simon8410
[第3楼]   [ 回复时间:2009-05-13 23:00 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-05-13 21:48
回复:[贴 主]
------------------
我不知道你说的基础地址指的是什么,劳驾您解释一下。
zhenglxd
[第4楼]   [ 回复时间:2009-05-14 09:32 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
物理地址=基础地址+偏移地址
基础地址和 段地址都是概念上的东西

比如说 1万2千这个数字 可以理解为 1万+2千 1万是基础 2千就是偏移

但是内存中的寄存器是16位的 他不能表示超过他位数的数值 所以引入了段地址 *16+偏移地址 来表示一个物理地址, 在内存中 你看到的是段地址 段地址他不是个实体的地址 段地址只是为了描述 物理地址而引申的一种表示方法 基础地址也不是一个实体地址基础地址的概念是一个地址的起始段 段地址*16 就是物理内存中的基础地址 
基础地址 表示了一个段的概念 基础地址加一个 具体的 偏移地址 构成了一个 物理地址 这个物理地址才是实体的,因为偏移地址表示的数值范围是有限的 所以一个物理地址段的范围也是有限的
物理地址段在内存中的具体 反映 就是 段地址+偏移地址 
而段地址是由 基础地址决定的 因为 基础地址必须是16倍数 

好比 为了表示 10002 可以用 1X1万+2 或者10X1000+2 内存中一个地址就是唯一的一个地址 但是他受到物理硬件限制 只能以这样的形式表现
aiker
[第5楼]   [ 回复时间:2009-05-28 12:21 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-05-27 12:04
但是段是有长度概念,17这个物理地址的段地址为1 同时长度为16 哪怕 你这段地址只存放一个数据,这段地址的长度最小也必须是16
这段话不怎么懂 希望解释下 谢谢
zhenglxd
[第6楼]   [ 回复时间:2009-05-29 11:28 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
段是有长度概念的 只要是段这个单位 长度必须是16的倍数 
段是 连续物理地址的集合 系统为一段代码分配内存空间的时候 根据物理地址的长度 来决定分配的空间长度 如果长度为17 分配的 空间是 32  如果是 33 分配的空间是 48 总之 分配的都是16的倍数。
在后面我们会学到这一点 如果你像系统申请了 1b的空间 他会为你这1b的空间分配一个段 这个段长度是16 并且最少是16
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved