以CPU的16位寄存器为基础,每个段的最大长度可以是64K字节。通常,一个程序可以拥有自己的代码段、数据段、堆栈段和扩展段,它们的段的基地址分别存放在CS、DS、SS和ES这4个寄存器中。要计算一个存储单元的物理地址,先要将它的段寄存器的16位地址值左移4位得到20位的基地址,再将这20位地址值加上16位的偏移量,便得到了存储器的物理地址。偏移量可以存放在指令指针寄存器IP、堆栈指针SP、基址指针BP或者变址寄存器SI、DI当中。 虽然段的大小都可以为64K,但在实际应用当中,由于程序较短,这些段之间可以互相覆盖。 在8086取指令或取操纵数时,CPU就会选择代码段寄存器CS内容乘以4,再和指令指针IP的内容相加,形成指令所在单元的20位物理地址;当往内存写数据或者从内存读数据时,CPU就会选择数据段寄存器DS,然后和变址寄存器SI、DI或者通用寄存器BX中的值计算出操作数所在存储单元的物理地址;而当进行堆栈操作时,CPU就会选择堆栈段寄存器SS,再和堆栈指针SP或者基址指针BP形成20位堆栈地址。 |