寄存器:CPU内部的存储单元,用于暂存运算结果、地址信息、转态标志等。在CPU内部寄存器的数量有限,但是速度非常快。
8086处理器总共包含14个16位寄存器,如下图所示:
通用寄存器
从80386开始,进入了32位处理器时代,通用寄存器扩展到了32位,段寄存器仍然是16位的。
- eax: 通常用来执行加法,函数调用的返回值一般也放在这里面
- ebx: 数据存取
- ecx: 通常用来作为计数器,比如for循环
- edx: 读写I/O端口时,edx用来存放端口号
- esp: 栈顶指针,指向栈的顶部
- ebp: 栈底指针,指向栈的底部,通常用
ebp+偏移量
的形式来定位函数存放在栈中的局部变量 - esi: 字符串操作时,用于存放数据源的地址
- edi: 字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
到64位处理器时代 ,相应的,将通用寄存器扩大到64位: rax rbx rcx rdx rsp rbp rsi rdi
状态标志寄存器
标志寄存器也扩大到64位,标志位没有变化,高32bit留作未来使用。
- CF:进位标志,最高位有进位或借位时 置1,否则为0
- PF:奇偶标志,低8位中1的个数,若为偶数 置1,否则为0
- SF:符号标志,与结果的最高位相同
- AF:辅助进位
- ZF:结果为0,置1,否则置0
- OF:溢出标志,最高位和次高位都有进位或借位时不溢出,如若异或,则溢出
- DF:方向标志,字符串操作时控制方向,DF=0,变址寄存器地址递增,DF=1,变址寄存器地址递减
- IF :中断允许标志,IF=1,可响应可屏蔽中断,IF=0,不响应可屏蔽中断 (NMI是不可屏蔽中断,INTR是可屏蔽中断)
段寄存器
在实模式下,段寄存器中保存的是段基址。在保护模式下,段寄存器保存的是段选择子,用于索引GDT或者LDT
其中高13位是段表索引,也就是说段表中一共有8K个段描述符,每个描述符是64bit
TI = 0,指GDT,TI = 1,指LDT
RPL:请求特权级
段描述符中包含了段基址、段限、属性等信息,在这里就不展开讲GDT的查询过程,先挖个坑。
指令寄存器 EIP
它指向了下一条要执行的指令所存放的地址,CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令。
通用寄存器、段寄存器、标志寄存器、指令寄存器,这四组寄存器共同构成了一个基本的指令执行环境,一个线程的上下文也基本上就是这些寄存器,在执行线程切换的时候,就是修改它们的内容。
控制寄存器
32位处理器共有4个控制寄存器CR0-CR4,这里只是简介一部分
CR0的1-4位 控制浮点协处理器的操作,CR1保留。
CR2和CR3 用于分页管理:
当发生页异常时,处理器把引起页异常的线性地址存在CR2中,操作系统可以通过查找CR2值,发现是哪一页异常。CR3用于保存页目录表的起始物理地址,因为是按页(4k)对齐的,所以低12位保留,高20位有效。