问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

8086 CPU寄存器详解:工作原理与应用

创作时间:
作者:
@小白创作中心

8086 CPU寄存器详解:工作原理与应用

引用
CSDN
1.
https://m.blog.csdn.net/weixin_44955712/article/details/105566899

前言

本文将从CPU如何执行指令的角度来讲解8086 CPU的逻辑结构,形成物理地址的方法,相关的寄存器以及一些指令。

寄存器运用

8086 CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

  • 加法与减法:AX、BX、CX、DX、BP、SI、DI、SP——通用寄存器
  • 乘法与除法:DX、AX(字操作),AX、AL(字节操作)
  • 循环计数:CX
  • 保持段地址:CS,DS,SS,ES
  • 将要取出的指令的偏移地址:IP
  • 压入或弹出堆栈的数据的偏移地址:SP
  • 输入或输出堆栈的数据的偏移地址:BP
  • 可以指示存储器的地址偏移量:BX、BP、SI、DI
  • 作为间接I/O口的地址:DX
  • 数据串指令的操作:CX,SI,DI、ES
  • 存放查表转换指令的首偏移地址:BX
  • 表示运算特征与控制标志:FLAGS
  • 循环指令的操作:CL

字在寄存器中如何存储

8086 CPU可以一次性处理两种尺寸的数据:

  • 字节(byte):一个字节由8个bit组成,可以存在8位寄存器中
  • 字(word):一个字由两个字节组成,这两个字节分为高字节和低字节。一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中

16位结构的CPU

  1. 运算器一次最多可以处理16位的数据
  2. 寄存器的最大宽度为16位
  3. 寄存器和运算器之间的通路是16位的

8086 CPU给出物理地址的方法

物理地址是CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。

8086有20位地址总线,可传送20位地址,寻址能力为1M。8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。8086 CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

  1. CPU提供两个16位的地址,一个为段基址,另一个为偏移地址
  2. 段基址和偏移地址通过内部总线送入一个称为地址加法器的部件中
  3. 地址加法器将两个16位地址合成为一个20位的物理地址
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制总线
  5. 输入输出控制电路将20位物理地址送上地址东线
  6. 20位物理地址被地址总线传输到存储器

物理地址 = 段基址 × 16 + 偏移地址 = 基础地址 + 偏移地址

段寄存器

段的理解

  1. 段地址 × 16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数
  2. 偏移地址为16位,16位地址的寻址能力为 64K,所以一个段的长度最大为64K

CPU访问内存单元时,必须向内存提供内存单元的物理地址。8086 CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。段寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下段的信息:

  1. 段的大小
  2. 段的起始地址
  3. 段的管理属性(禁止写入/禁止执行/系统专用等)

需要用8个字节(64位)存储这些信息,但段寄存器只有16位,因此段寄存器中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,全局段号记录表),读取段的信息。

在8086中设置4个16位的段寄存器,用于管理4种段:

  • CS是代码段(Code Segment):存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。
  • DS是数据段(Data Segment):指出当前程序使用的数据所存放段的最低地址,即存放数据段的段基址。
  • SS是堆栈段(Stack Segment):指出当前堆栈的底部地址,即存放堆栈段的段基址。
  • ES是附加段(Extra Segment):指出当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段。

段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。

段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。

通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以通过改变前缀中的“段取代”字段来改变操作数的段寄存器。

CS和IP

CS和IP是8086 CPU中最关键的寄存器,CS为代码段寄存器;IP为指令指针寄存器。CPU将CS:IP指向的内容当作指令执行。

  1. 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
  2. IP = IP + 所读取指令的长度,从而指向下一条指令
  3. 执行指令。转到步骤(1),重复这个过程

修改CS、IP的指令

  • jmp 段地址:偏移地址:功能是用指令中给出的段地址修改CS,偏移地址修改IP
  • jmp 某一合法寄存器:功能是用寄存器中的值修改IP
  • Debug的R指令:可以查看和改变寄存器的内容
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号