小言_互联网的博客

汇编笔记---寄存器(CPU工作原理)

436人阅读  评论(0)

前言:

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

寄存器运用

8086CPU有14个寄存器 它们的名称为: AX、BX、CX、DX、SI、DI、SP、BP、 IP、CS、SS、DS、ES、PSW
(1)加法与减法:AX、BX、CX、DX、BP、SI、DI、SP——通用寄存器
(2)乘法与除法:DX、AX(字操作),AX、AL(字节操作)
(3)循环计数:CX
(4)保持段地址:CS,DS,SS,ES
(5)将要取出的指令的偏移地址:IP
(6)压入或弹出堆栈的数据的偏移地址:SP
(7)输入或输出堆栈的数据的偏移地址:BP
(8)可以指示存储器的地址偏移量:BX、BP、SI、DI
(9)作为间接I/O口的地址:DX
(10)数据串指令的操作:CX,SI,DI、ES
(11)存放查表转换指令的首偏移地址:BX
(12)表示运算特征与控制标志:FLAGS
(13)循环指令的操作:CL

字在寄存器器中如何存储

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

  • 字节:byte:一个字节由8个bit组成,可以存在8位寄存器中
  • 字:word:一个字由两个字节组成,这两个字节分为高字节和低字节

    一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中

16位结构的CPU

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

8086CPU给出物理地址的方法

物理地址是:CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
8086有20位地址总线,可传送20位地址,寻址能力为1M。
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
8086CPU采用一种在内部用两个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访问内存单元时,必须向内存提供内存单元的物理地址。
8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址

段寄存器是因为对内存的分段管理而设置的。计算机需要对内存分段,以分配给不同的程序使用(类似于硬盘分页)。在描述内存分段时,需要有如下段的信息:1.段的大小;2.段的起始地址;3.段的管理属性(禁止写入/禁止执行/系统专用等)。需要用8个字节(64位)存储这些信息,但段寄存器只有16位,因此段寄存器中只能存储段号(segment selector,也译作“段选择符”),再由段号映射到存在内存中的GDT(global (segment) descriptor table,全局段号记录表),读取段的信息

在8086中设置4个16位的段寄存器,用于管理4种段:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段

代码段寄存器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是8086CPU中最关键的寄存器, CS为代码段寄存器;IP为指令指针寄存器
CPU将CS:IP指向的内容当作指令执行




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

修改CS、IP的指令

jmp 段地址:偏移地址 功能:用指令中给出的段地址修改CS,偏移地址修改IP
jmp 某一合法寄存器 功能:用寄存器中的值修改IP
Debug的R指令,可以查看和改变寄存器的内容


转载:https://blog.csdn.net/weixin_44955712/article/details/105566899
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场