8086是Intel公司于1978年推出的第一款16位的处理器,是整个IA32架构的开山鼻祖。后续的处理器全部向前兼容8086,所以我们学习汇编语言和处理器体系结构,必须要从8086这款芯片开始。
x86体系中:
一个字节是八个比特位【1Byte=8Bits】一个字(Word)是两个字节【1Word=2Bytes】一个双字(DWord)是两个字,即四个字节【1DWord=4Bytes】一个四字(QWord)是两个双字,四个字,即八个字节【1QWord=8Bytes】在内存中,指令和数据一模一样,都是无差别的数。如图2-6所示,假如处理器访问内存时是按照低端字节序的,那么,从地址0x0008处取出一个字时,该字的值为(0xA3D8)。
8086属于CISC架构,所以其内部的通用寄存器个数不多,只有8个16位的通用寄存器(AX、BX、CX、DX、SI、DI、BP、SP),如下图所示:
CPU若要访问内存单元,最终使用的都是真实的内存地址,这种地址我们称之为物理地址。在8086处理器上,提供了20位地址线。换句话说,8086CPU的物理地址是20位的。为解决重定位问题,采用了分段机制。一个内存单元的物理地址被表示为“段地址:偏移地址”,而这种组合形式就被称之为逻辑地址。
8086CPU在硬件一级上为逻辑地址提供了支持,共有4个段寄存器:代码段寄存器(Code Segment, CS)、数据段寄存器(Data Segment,DS)、附加段寄存器(Extra Segment)和堆栈段寄存器(Stack Segment,SS)。在访问内存中的数据之前,必须先设置好DS寄存器。而CS和IP共同形成逻辑地址去获取待执行的指令。
两个16位的寄存器组合,如何形成一个20位的物理地址呢?8086CPU在形成物理地址时,首先将段寄存器的内容左移4位,形成20位的段地址,之后再加上16位的偏移地址,最终得到20位的物理地址。
由于8086是20位的地址线,所以其可访问的物理地址空间大小为1MB。由于段寄存器的内容占据20位地址的高16位,所以在段空间不重叠的情况下,最多可以将1MB的内存空间分成65536个段。此时每一个段的大小为16个字节。
由于偏移地址也占16位,所以每一个段的最大长度是216=64KB。这样的话,如果不允许段之间重叠,那么1MB的内存空间只能被划分为16个段。
同时需要指出的是,由于段寄存器左移4位形成段基址,所以每个段都是按16字节对齐的。此外,由于段的划分非常自由,所以同一个物理地址,实际上对应着多个逻辑地址。
