四时宝库

程序员的知识宝库

什么是汇编语言中的有效地址EA(汇编语言地址表示)

CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。

 每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。

8086有20位地址总线,可传送20位地址,寻址能力为1M。

8086内部为16位结构,其中的寄存器是16位,所以它只能传送16位的地址,表现出的寻址能力却只有64K。

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

因此,段的概念的引入,就是为了解决8086的寄存器只有16位,而寻址能力却是20位之间的矛盾。

段地址×16就等于段地址(16进制)左移一位,右边补0,就像10进制数乘以10一样。

图1中的物理地址生成的规则是:

CS20000

IP +0000

------------------------------------------------------

=20000(有效地址,物理地址,EA)

段地址和偏移地址可以举一个例子:

假设有一个宾馆,一共有10层,每层有100个房间,每一层的房间从00号到99号。

现在假设这个宾馆每一层有一个保安,这个保安只知道楼层号;每层又有一个服务员,每个服务员只知道房间号。现在这个宾馆的管理员要登记这个宾馆的全部客户信息,所以他必须知道宾馆的全部房间的客户信息,为此,他需要对保安的楼层号和服务员的房间号进行处理。

现在,假设管理员登记的房间号是3位,而保安知道的楼层号是1位,比如1层,2层,等等;服务员知道的房间号是2位,比如00号房间,99号房间,等等。那么管理员登记的完整房间号应该是200,215,299等。

这个房间号我们可以认为是这样得来的:

我们可以规定保安的楼层号也是2位,比如10代表第1层,20代表第2层,等等,以便和房间号相统一。

那么管理员登记的3位房间号可以规定按如下规则得出:

200 楼层号左移一位

+18

--------------------------------------

=218

前面的20就是段号,18就是位移量。

由这个例子,我们似乎可以得出段代表的是楼层,位移量代表的是某一层的房间号,意思很明显。

但在计算机的内存里面,内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。也就是说,段的存在仅仅是为了得出实际的物理地址的需要而设计的。

从上面的运算规则我们看到,要产生物理地址,段地址要乘以16,也就意味着,段地址可以是2000(16进制),2001,等等,但生成物理地址的时候,乘以16以后就变成

20000,20010,20020,等等,从这里可以看出,每个段的段地址开始的地方一定是16的倍数。与前面的宾馆例子对应起来,假设保安的楼层号可以是20,也可以是21,22等(我们可以假设每10个房间设置一个保安),那么移位以后就变成200,210,220等等,也就是说,每一段开始的房间号都是10的倍数。

从上面例子还可以看出,如果每层楼设置一个保安,那么相当于一段的大小是100,如果每

10个房间设一个保安,那么段的大小就是10。

这个道理推广到计算机内存,那么,每个段最大就是64k(16位的偏移地址的寻址范围),

比如段号2000,后面4位都可以是变化的偏移量;最小的段就是16个内存单元(4位段地址加上一位偏移地址的变化),比如段号2001,偏移量的变化只能是最后一位。

对于计算机内存来说:

我们可以认为:地址10000H~100FFH的内存单元组成一个段,该段的起始地址( 基础地址)为10000H,段地址为1000H,大小为100H。

我们也可以认为地址10000H~1007FH、10080H~100FFH 的内存单元组成两个段,它们的起始地址( 基础地址 )为10000H和10080H,段地址为:1000H 和1008H,

大小都为80H。

也就是说,同一段内存,我们可以看作是一段,也可以看作两段、三段等等,原因在于,只要其实际地址是16的倍数,我们就可以看作是段的起始地址。至于同一部分地址空间看作是多少段,则视实际情况而定。

综上所述,关于有效地址可以总结如下:

1:计算机内存并没有分段。段的概念的引入,只是为了解决8086的寄存器只有16位,而寻 址能力却是20位之间的矛盾。

2:只要是16的倍数,这个内存单元的地址就可以看作是某一段的起始地址。

3:段的大小是可变的,最大64k,最小16个字节。

4:同一部分地址空间可以看作不同数量的段。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接