80x86中的寄存器

寄存器: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位有效。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值