脑筋一时转不过来,请大家帮忙理解一下!

yiruirui0507 2010-07-28 12:27:06
最近看汇编,20位的地址线最大可寻址控件为1M,但是CPU是16位的,里面的寄存器也是16位的,所以寄存器能寻址的最大范围是64K,那如何用寄存器来访问1M的空间呢?采用了分段的方式,到这里就不理解了?书上说段地址+偏移量=物理地址

这里就不太了解了,为什么分段就能让寄存器访问1M的内存呢?理解不来?请高手帮忙理解一下,有图最好了。呵呵。
还说段地址最后4位都为0,那偏移量为什么就是16位呢,偏移量不也是在内存中吗?也该是20位才对啊?这里也理解不了。
最后就是这个公式了段地址+偏移量=物理地址,更理解不了了,说什么CPU访问的是物理地址,程序员用的是逻辑地址等等,都很模糊,请高手帮忙解决一下,先谢谢了!
...全文
365 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
guzhijie1981 2010-07-30
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20091116/09/69d3fb65-62c7-4e99-8bd2-a0bdf538cda7.html
我的帖子,最开始一段解释了
zhangweiit 2010-07-28
  • 打赏
  • 举报
回复
“说什么CPU访问的是物理地址,程序员用的是逻辑地址等等”

这个与第一个段地址的问题,是两回事

程序员用的逻辑地址,就是虚拟内存地址
一个PC,只有一要256M的内存条,但是,却可以使用4G的内存
那是因为操作系统的虚拟内存
我们同时开启的N个程序,他们分布在这4G内存中的各个区域

因为同时时间,只有一个或是几个程序在物理内存
所以,只有当需要的时候,这些数据才会从虚拟内存到物理内存
这些事,操作系统都帮我们做好了,就是物理虚拟的映射
zhangweiit 2010-07-28
  • 打赏
  • 举报
回复
段地址+偏移量=物理地址
这个公式应该是这样的吧:段地址*16+偏移量=物理地址
这是我原来的理解
16位cpu,只能一次性访问到64k的地址,
但要表示1M的内存怎么办呢?
于是,就要用两个寄存器来表示一个地址
一个用于段地址,另一个用于表示低位的4个地址

可以这样来比喻
两个数字,A只能以100为单位,B只能表示1-100以内的数
要表示235怎么办呢?那A就是2,B就是35

段地址就类似于只能以16为单位
所以,他的后四位都是0000
为什么都是0呢,因为实际的后四位,在另一个寄存器表示
AAA20090987 2010-07-28
  • 打赏
  • 举报
回复
学汇编之前,学一下计算机组成原理比较好
brookmill 2010-07-28
  • 打赏
  • 举报
回复
对不起楼主,刚才3楼的前两篇博客贴错了,说的不是你这个问题,不用看了。
严重抱歉。
brookmill 2010-07-28
  • 打赏
  • 举报
回复
我当时学这个也很费劲,把书翻来覆去看了无数遍也弄不明白。
楼主看看这些吧
http://blog.csdn.net/littlehedgehog/archive/2008/02/13/2089504.aspx
http://blog.csdn.net/haoahua/archive/2008/06/27/2591742.aspx

我觉的这个系列的“80386ASM程序设计基础”写的不错
http://blog.csdn.net/kingcaiyao/archive/2003/03.aspx
yiruirui0507 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
那偏移量为什么就是16位呢,偏移量不也是在内存中吗?也该是20位才对啊

通常段地址和偏移量都是在寄存器里的,所以都是16位
[/Quote]

这两个16位是如何表示一个20位的呢?段寄存器首地址CS+偏移量IP=物理地址就是CPU真正访问的地址
brookmill 2010-07-28
  • 打赏
  • 举报
回复
那偏移量为什么就是16位呢,偏移量不也是在内存中吗?也该是20位才对啊

通常段地址和偏移量都是在寄存器里的,所以都是16位
眼睛猥琐男 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 selooloo 的回复:]

就像一个手只能数到5,两个手就可以数到10,一个道理
一个寄存器是16位,两个寄存器就是32位,但这里只需要20位,所以需要偏移量,多余的12位没用到
然后有了公式, 段地址*16+偏移量=物理地址,段地址*16就是左移4位,也就是右边会空出4个零
所以寄存器的寻址范围是2^16=64K,内存的寻址范围是2^20=1M

偏移量是在寄存器里的,不在内存中,所以是16位

程序员不能……
[/Quote]

说的很不错。 程序员用逻辑地址,主要考虑到内存利用率和屏蔽底层。表面上程序员拥有整个物理内存。实际上只是按需分配。
buzaiyouyu001 2010-07-28
  • 打赏
  • 举报
回复
继续学习
ysd19850101 2010-07-28
  • 打赏
  • 举报
回复
说下我的理解

就像一栋楼,房间的编号可以从1然后一直编,当然也可以按规则编:比如803,是8楼第三个房间

而计算机CPU的寻址,先把地址分段,就像大楼的层,然后再把每段的地址编码。这样地址就分为了两部分:段地址和偏移量,计算机可以用两个16位来表示,高16位来查找段地址(就像寻找大楼的楼层,比如8楼),低16位用来查找偏移量地址(再找具体房间的编号,比如3号房间),这样可以解决16位寄存器寻址空间不到1M的问题。
algorithms_memo 2010-07-28
  • 打赏
  • 举报
回复
段地址放在20位地址线的高16位线上。偏移量加在低16位线上。即可。
selooloo 2010-07-28
  • 打赏
  • 举报
回复
就像一个手只能数到5,两个手就可以数到10,一个道理
一个寄存器是16位,两个寄存器就是32位,但这里只需要20位,所以需要偏移量,多余的12位没用到
然后有了公式, 段地址*16+偏移量=物理地址,段地址*16就是左移4位,也就是右边会空出4个零
所以寄存器的寻址范围是2^16=64K,内存的寻址范围是2^20=1M

偏移量是在寄存器里的,不在内存中,所以是16位

程序员不能直接操作CPU,只能通过改写寄存器和内存的方式来操作CPU。CPU作为执行单位当然需要物理地址,而程序员不能直接访问物理地址,所以用逻辑地址
bobo364 2010-07-28
  • 打赏
  • 举报
回复
哦,我明白了,上面的作废,你是说16位数寄存器要存20位的数,那就是计算机组成原理里说的两个寄存器和成一个数,或这多个标记位,把一个数拆成几段,到运算是在去掉标记位,重组
bobo364 2010-07-28
  • 打赏
  • 举报
回复
寄存器和内存有映射的关系吧,需要的时候会释放一部分旧的东西,从内存得到一部分东西,分段也是为了快速映射吧
zdyiamdd 2010-07-28
  • 打赏
  • 举报
回复
按理来说,你看的应该是在模拟DOS下的程序,实模式下的DOS程序的内存是址是实实在在的物理内存地址,也就是说不存在保护模式所谓的逻辑地址,好了,假如当地址总线是20位的时候,其它总线是16位,现在我们在找一个地址是20位,那我们应该怎么去找到那个地址呢?要知道,就像你说的那样,寄存器也只是16位而已,那我们该如何利用16位去找20位的地址呢。答案就是用两个16位的数拼湊成一个20位的去找一个20位的地址。(很多人都对8086这种架构有些不满。。),你这些东西了解下就可以了,还是放心思在32位上。。
maoxing63570 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zecard_fu 的回复:]
段寄存器16位 0x1000 <= 这是16位
IP寄存器16位 0x00AB <= 这也是16位

那先前有规定 段寄存器*16 + 偏移量 看下面

0x1000*16+0x00AB 那是不是就等于 0x100AB <==观察这个数,他不就是20位的了吗?

假设我们从宿舍去图书馆,中间要经过食堂!如下图

宿舍—————---——————食堂———-———图书馆
0M 1……
[/Quote]
解释的比较形象,顶个,正解,计算机组成原理上的内容
yxqyrh 2010-07-28
  • 打赏
  • 举报
回复
这个多看看书吧,书读百遍,其义自现
你看两三遍估计就行了
geochway 2010-07-28
  • 打赏
  • 举报
回复
不要被它的概念所迷惑,你不妨这样理解,因为地址空间有20位,而寄存器只有16位,怎么办?
只能用2个寄存器合起来描述地址(32位),现在无非就是把低16位的寄存器称为偏移量,高16位的称为
段寄存器而已。

但是有一点需要注意,这个合起来的32位地址,它只是一个逻辑上的地址,并非是真正的物理地址编号。
至于真正的物理地址指向哪儿,由硬件和操作系统来处理。

至善者善之敌 2010-07-28
  • 打赏
  • 举报
回复
上面解释的很形象,无非是16+4组成20位的地址总线来访问1M内存,
详情你看这里
http://www.feiesoft.com/asm/02-2.html
加载更多回复(18)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧