在线等高手,如何理解物理地址和偏移地址?请高手指点!

gongshuanglan 2006-02-15 03:36:26
书上这样写着:
在1M字节的存储器里,每一个存储单元都有一个唯一的20位
地址,称为该存储单元的物理地址.
20位物理地址由16位段地址和16位偏移地址组成,段地址是指每一段
的起始地址,由于它必须是小段的首地址,所以其低4位一定是0,
这样就可以规定段地址只取段地址的高16位,偏移地址则是
指在段内相对于段起始地址的偏移值.这样物理地址的计算方法可以表示如下:
16d*段地址+偏移地址=物理地址
据我认为:把存储器分段的话,应该分为64K个段,每个段有16个存储空间,每个空间可存一个16位的数据,这样理解对吗?偏移地址我理解为应该是4位,从0000到1111,但书上说是16位,我不知道怎么理解,我的理解错在哪?
...全文
577 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1M可以表示为16个64K的段还是64K个16字节的段还是什么其他尺寸,完全取决于需要。
但是在x86的实模式和16-bit保护模式下,一个段最小16字节,最大64K字节。
zyl910 2006-02-19
  • 打赏
  • 举报
回复
// 哦,好像明白了,是不是段地址就是存储在存储单元里的数据,而偏移地址就是相对于该段起始地址到存储该段处的偏移量呀?


只需记住“物理地址 = 段基址 + 偏移地址”
偏移地址 = 物理地址 - 段基址

只要段基址选的不同,偏移地址就不同
jijun0418 2006-02-18
  • 打赏
  • 举报
回复
核心思想:
地址的编码方式,简单的理解,就是数字的编码方式。
举例,学汇编总知道二进制和十进制吧!
(3)10=(11)2
如果物理地址为3,
那么可以写成3:十进制表示,
也 可以写成11:二进制表示。可以认为段地址为1,偏移地址为1。即3=1*2+1*1
iceuct 2006-02-18
  • 打赏
  • 举报
回复
学会接受现实,到罗马的路很多,但别人走的不是你走的那一条
Peter_Cheung 2006-02-18
  • 打赏
  • 举报
回复
virtual address -> (segmentation) -> linear address -> (paging) -> physical address
edwardhq 2006-02-18
  • 打赏
  • 举报
回复
简单点,就是偏移地址是原址偏移的差值,物理地址就是偏移后的合值。
zyl910 2006-02-16
  • 打赏
  • 举报
回复
分段是逻辑意义上的

由于实模式下偏移地址只有16位
所以最大段长是64KB

只要记住:物理地址 = 段地址<<4 + 偏移地址
以下地址是同一个物理地址
0h:417h
1h:407h
……
40h:7h


注意“物理地址 = 段地址<<4 + 偏移地址”这个公式不能逆转
在实模式下,逆转后容易引起逻辑混乱(一个物理地址 对应多个 段地址:偏移地址)
在保护模式下,“物理地址 = 段基址 + 偏移地址”。由于存在段权限保护,该公式逆转后就错了


为什么会逻辑混乱呢
这是由于人习惯接受非单调函数(即在不同的x下,f(x)可以为相同值。如f(x)=x^2,2^2 = (-2)^2 = 4)
但是一般人不习惯多值函数(如f(x)=±x^(1/2),f(4)的结果就是2和-2)
gongshuanglan 2006-02-16
  • 打赏
  • 举报
回复
哦,好像明白了,是不是段地址就是存储在存储单元里的数据,而偏移地址就是相对于该段起始地址到存储该段处的偏移量呀?
大熊猫侯佩 2006-02-15
  • 打赏
  • 举报
回复
存储器分段的话, 每个段的大小可以是不同的,但最大不能超过 64kb,所以
最大只要 16 位的偏移即可描述了。
danny 2006-02-15
  • 打赏
  • 举报
回复
8086 CPU只有20根地址线,所以只能访问1M内存,寄存器有16位.

为使用16位的寄存器访问20位的内存地址(访问内存时,大多情况下需将内存地址放到寄存器中),8086 CPU将1M内存分成多个段.

每个段有自己的段地址,每个段的最大长度为64K,2^16.

当我们访问一个内存单元时,必须告诉CPU所访问的内存单元的段地址以及该单元距段首的距离(多少字节),该距离称为段内偏移地址。所以在同一个段(16位宽)内,偏移量的变化范围是0000H~FFFFH。

由于左移4位后,段地址的低4位一定是0H.

表示同一个物理地址时可以有近2^16种段地址和偏移量的组合.

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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