2 yzy4829229 yzy4829229 于 2015.06.02 20:45 提问

关于8086CPU给出物理地址的问题

根据王爽老师书籍中的描述:CPU中把一个16位的段地址和一个16的偏移地址输入进地址加法器,然后段地址×16+偏移地址输出一个20位的物理地址。
那么我的问题是:已经说明了CPU是16位的了,那么寄存器的最大宽度也是16位,也就是说在寄存器中存储的数字最大是65535,那么这20位的地址是怎么保存的?

4个回答

a1193561652
a1193561652   Rxr 2015.06.02 21:37
已采纳

20位的分为两部分保存(段地址和偏移地址),两部分合成的20位的数不保存,直接输出到地址总线。

caozhy
caozhy   Ds   Rxr 2015.06.02 20:46

用两个寄存器保存,64K的地址+偏移量。

caozhy
caozhy 回复易天曦: 不需要移动,两个寄存器
2 年多之前 回复
yzy4829229
yzy4829229 那么段地址在向左移动四位的时候,原来就是16位,它移动4位,那么最前面四位不会丢失吗
2 年多之前 回复
gamefinity
gamefinity   Rxr 2015.06.02 21:11
  • CS:IP
  • 事实上根本没有保存这个地址的地方
  • CS是代码段寄存器,保存了地址的前面16位
  • IP是指令指针,它只在一个段里面起作用。也就是说它是管得到64K里的内容。
  • 每段代码执行的时候,必须先明确CS,然后在CS的控制范围内移动你的IP。如果你的程序大到>64K的话,必须有额外的指令帮你切换CS,才能达到超越64K的目的。
  • 这个就是所谓8086的的实模式
yunfenglw
yunfenglw   2015.06.02 21:17

因为x86处理器地址总线是20位,最大管理1M内存,对应物理地址是00000H-fffffH
而内部数据总线、寄存器都是16位的,能表示的范围为0000H-ffffH

如何用16位寄存器表示20位?想到这样一种方式:
把两个16位寄存器相加得到20位,于是便有了
物理地址=段地址*16+偏移地址
相当于在16位地址后面加4个0,形成20位地址

具体过程如下:
段地址和偏移地址通过内部总线传入到地址加法器的部件;
地址加法器将两个16位地址合并为一个20位的物理地址;

Csdn user default icon
上传中...
上传图片
插入图片