物理地址

        CPU在访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称之为物理地址。

  • CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。

  • 16位结构的CPU:8086

    • 16位机、字长位16位等常见说法,与16位结构的含义相同

      • 运算器一次最多可以处理16位的数据

      • 寄存器的最大宽度为16位

      • 寄存器和运算器之间的通路为16位

    • 在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。

  • 8086给出物理地址的方法:8086有20位地址总线,可以传送20位地址,达到1MB寻址能力。但是从8086的内部结构来看,它只能送出16位的地址,寻址能力只有64KB。
    8086采用内部用两个16位地址合成的方法来形成一个20位的物理地址。

  1. CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个是偏移地址;

  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件

  3. 地址加法器将两个16位地址合成一个20位的物理地址

  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路

  5. 输入输出控制电路将20位物理地址送上地址总线

  6. 20位物理地址被地址总线送到存储器

  • 地址加法器采用物理地址 = 段地址 * 16 + 偏移地址的方法用段地址和偏移地址合成物理地址。为什么要乘以16,很简单,16位和20位,差了4个位,一位16进 制,那么乘以16即可。

    • 例如要访问123C8H的内存单元时,在地址加法器上传入段地址1230、偏移地址00C8,那么1230*16+00c8=123C8H
  • ‘段地址16’有一个更为常用的说法是左移4位二进制。左偏移1位,那么相当于该数据乘以2,一个数据的二进制形式左移N位,相当于数据乘以2的N次方。

    • 一个数据的十六进制形式左移1位,相当于乘以16;十进制则是乘10,那么一个x进制的数据左移1位,相当于乘以X。
  • 段地址16可以看作是基础地址。现在我们来举一个例子,来说明这个基础地址 + 偏移地址 = 物理地址的含义

    • 你要去图书馆,问我地址在哪里,我可以用两种方式来告诉你图书馆的地址:

      • 从学校走2826m到图书馆。这2826m可以认为是图书馆的物理地址

      • 从学校走2000m到体育馆,从体育馆再走826m到图书馆。第一个距离2000m,是相对于起点的基础地址,第二个具体826m是相对于基础地址的偏移地址。

    • 第一种方式是直接给出物理地址2826m,而第二种方式是用基础地址和偏移地址相加来得到物理地址的。第二个比喻就是上面公式的含义。

  •  现在融入到内存地址上再来看看:你问我去往图书馆的具体,要用纸条写下来,但是我必须要由一张可以容纳4位数据的纸条,才能写下2826这个数据。可不巧的是,我没有容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉你2826这个数据。
    • 我们事前约定好,你得到两张纸后,做这样的运算:200(段地址)*10 +826(偏移地址) = 2826(物理地址)

        段的概念:这里的段并不是指内存,内存并没有分段,段的划分来自于CPU,我们可以通过分段的方式来管理内存。假设有一段地址位10000H~100FFH的内存单元组成一个段,可以看出该段的起始地址(基础地址)位10000H,段地址位1000H,大小位100H;

  • 分段看,10000H1007FH、10080H100FFH的内存单元组成两个段,它们的起始地址为(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H
  • 我们可以将若干地址连续的内存单元看作一个段,用段地址16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两个点需要注意:段地址16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力位64KB,所以一个段的长度最大为64KB。

题目

  • 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围是?

    • 00010H~1000FH
  • 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元,则SA应满足的条件是?

    • 根据题意得出:SA * 16 + EA = 20000H,那么当EA为最大的偏移量的时候我们是否就能够取到最小的SA?SA x 10H + FFFFH = 20000H SA x 10H = 10001 SA = 1000.1H? 不 SA=1000十六进制里面不能有小数点。那么将SA=1000带入公式,得出的结果肯定不是20000H,所以最大的SA就不能够取到FFFFH。所以我们知道物理地址、偏移地址,两者的最低位,必须是相同的,EA=FFF0H得到SA = 1001H,当EA = 0000H时SA=2000H。

    • 那么返回就是1001H~2000H

  • 当段地址给定多少,CPU无论怎么变化偏移地址都无法寻到20000H?

    • 不在1001H~2000H范围内就取不到