鱼C论坛

 找回密码
 立即注册
查看: 1997|回复: 7

段地址*16+偏移地址=物理地址

[复制链接]
发表于 2012-12-9 13:19:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 汇编不会编 于 2012-12-11 16:30 编辑


段地址为什么要*16 呢?

是不是因为x86CPU是16位的呢?

不太了解这节课,又不想跳过这节课。所以来求助了,希望得到详细的解答 呵呵

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-9 19:25:42 | 显示全部楼层
因为 8086CPU有20位地址总线的,而8086又是16位的,所以要像办法凑成20位的。所以有了
物理地址=段地址*16+偏移地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-9 22:17:33 | 显示全部楼层
因为8086的段寄存器都是16位的,地址线是20条,所以cpu无法直接给出20位的地址,所以就物理地址=段地址*16+16的偏移地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-9 22:18:17 | 显示全部楼层
因为8086的段寄存器都是16位的,地址线是20条,所以cpu无法直接给出20位的地址,所以就物理地址=段地址*16+16的偏移地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-10 12:20:02 | 显示全部楼层
你可以将其化为二进制数,然后将段地址*10000b,看看结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-10 12:24:38 | 显示全部楼层
我是这么理解的,内部连接总线是16位,CPU与外部连接时是20位的总线,其实段地址就如其名,它是对一组地址进行定义,*16(左移4位即2的4次方=16)定义了这个段的长度范围和对段地址的起始点进行了定位,偏移地址则是定义到这个长度内其中一个点,而CPU通过20位的外部总线连接到内存时就将它们合并起来,便于对内存进行分段管理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-11 16:19:05 | 显示全部楼层
我解释给你听:
8086CPU是20根地址线,这样它所能访问的地址范围是2的20次方=1M大小.
因为寄存器是16位的,最多只能访问2的16次方个地址,无法访问1M的全部空间.所以就人为的把1M空间分成若干个段来表示. 也就是说通过改变起点位置的变化就可以表示整个1M内存范围了.
现在的CPU寄存器是32位的,总线也是32位的,都可以直接访问4GB的范围了,所以也就不用以前的表示方法了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-12-11 16:28:41 | 显示全部楼层

谢谢你的解答!呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表