1.首先,什么是地址?
在内存中,每个存储单元相当于一个房间,而地址就是房间号。
就好比你去酒店,酒店里一个一个包间就是一个个空间,这个空间就是内存单元。而酒店每个包间上的门牌号就相当于该内存单元的地址。也叫物理地址。
2.为什么要分段?
这里基于80x86来讲解。
因为80x86CPU提供的地址线为20根,所以寻址空间可达2的20次方个,也就是1MB的大小,用5位16进制的数码表示范围为00000H~FFFFFH。也就是说,这个酒店一共有1MB个包间,每个包间的门牌号就是从00000H~FFFFFH。
然而,80x86CPU的地址寄存器(BX,BP,SP,SI,DI,IP,CS,DS,ES,SS)都是16位的,如果直接从这些寄存器中发出信号,那么寻址空间只能达到2的16次方,也就是64KB。就是说只能标识00000H~0FFFFH个包间,剩下的10000H~FFFFFH个包间居然没有门牌号!显然这是不可以的,因此我们要对内存进行分段。
3.怎么分段?
将存储器划分为若干个逻辑段,每段最大64K个字节单元。逻辑段的大小可变,每段最少16个字节单元,也可以100个,1000个等等。意思就是对包间进行分组,每组最多64K个包间,最少16个包间。
这样,段内单元的地址可用4个16进制的数码表示,称为偏移地址。也就是说,在每组包间中,每个包间的房间门牌号用4位16进制数表示,该组的房间门牌号就叫做偏移地址。在这里需要注意一个问题,是该组的房间门牌号,必须是该组的房间门牌号。先记住这个,下面会详细地讲。
这里回到刚刚讲的00000H~FFFFFH(包间门牌号),这些门牌号(地址)是物理地址:
上图所示的是部分存储单元,其中“7B040H”和“FFFF0H”为两个段首地址,就是两组包间中第一个包间的门牌号(物理地址),而“7B041H”和“FFFF1H”(图中未给出,是“FFFF0H”的下一个单元)是两组包间中第二个包间的门牌号(物理地址)。以此类推,就有“7B042H、7B043H、7B044H......”“FFFF2H、FFFF3H、FFFF4H......”就是第三、四、五等等个包间的门牌号,也就是第三、四、五等等个存储单元的物理地址。
计算机里每个段的首地址的末尾是0;也就是每组包间中,第一个包间的门牌号末尾是0。
因此,省去末尾0,就可以用4位16进制的数来表示每个段的首地址,也就是16位2进制数,这样就对应了80x86的16位地址寄存器。于是,我们用段寄存器(CS,DS,ES,SS)来存放这些段的首地址。也就是各个段的起始地址。