Intel各代CPU寄存器与存储模式
8088,8086代 CPU
Intel 最初的 cpu 型号, 这种 cpu 只提供 16bit 的寄存器, 分别是: AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS. 改 cpu 一共有 20 根地址线, 且只能工作在实模式中, 在这种模式下, 程序可以访问任意的内存地址, 但是每个程序被分成段, 每一段不超过 64KB, 也就是 16位的偏移.
数据寄存器: AX, BX, CX, DX, 这些寄存器可以被分成两个 8bit 的寄存器, 例如 AX 可以分成 AH 和 AL, 但是我们要意识到, AH 和 AL 并不是单独的寄存器, 改变 AX , AH 和 AL 的值都会改变.
指针寄存器: SI 和 DI 是一般的指针寄存器, BP 和 SP 是栈指针寄存器,
段寄存器: CS, DS, SS 和 ES 是段寄存器, 根据内存中程序地址的划分, 程序被分为, 数据段, 代码段, 未分配段, 堆, 以及栈, 用寄存器表示分别是 DS(Data Segment), CS(Code Segment), SS(Stack Segment), ES(Extra Segment)
与MIPS 不同的是, 在X86 中指令的寻址不是通过一条寄存器实现的, 而是 Instruction Pointer (IP), 与 CS 寄存器共同实现的,
80286代CPU
在这一代中, intel 引入了 16bit 的保护模式, 我们先来介绍一下16bits 保护模式:
保护模式内存访问最大的特点就是引入了虚拟内存的概念的与机制, 而 X86 采用的是段式虚拟内存方式, 所以在虚拟内存向物理内存映射的过程中, 需要段表, 同时上述的段寄存器存放的不再是物理内存中的段地址了. 段表在这个结构中称为全局描述符表(GDT), 表项称为段描述符, 存储着物理内存中的段基址、段界限、内存段类型属性(比如是数据段还是代码段,注意一个段描述符只能用来定义一个内存段)等许多属性. 而此时段寄存器中存储的仅仅是段描述符的索引.
全局描述符表(GDT)位于内存中,需要用专门的寄存器指向它后, CPU 才知道它在哪里。这个专门的寄存器便是GDTR(一个48位的寄存器),专门用来存储 GDT 的内存地址及大小。这和页表的机制差不多, GDTR类似于页表寄存器.
80386代CPU
新引入的寄存器有: 32bits 的 (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP) 以及两个 16bits 的FS 与 GS. 这两个是额外的临时寄存器, EAX 等表示 expanded AX, 是扩展的 32bits 的AX 寄存器, 为了向下兼容, 仍然可以使用 AX 访问 EAX 的低16bits.
而32bits 的保护模式中的数据也变成 32bits, 比如段内偏移就是 32位, 此时段也被分成了更小的块存储形式, 也就是页.