====== 2.寄存器 ====== 一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等器件组成,这些器件靠内部的总线相连。程序员通过改变各种寄存器中的内容实现对cpu的控制 ^ 器件 ^ 功能 ^ | 运算器 | 进行信息处理 | | 寄存器 | 进行信息存储 | | 控制器 | 控制各种器件进行工作 | | 内部总线链接各种器件,在他们之间进行数据的传输 | | 内部总线:实现的是CPU内部的各个器件之间的联系 外部总线:实现的是CPU和主板上其他器件之间的联系 8086cpu有十四个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW ===== -# 通用寄存器 ===== 8086CPU所有的寄存器都是16位的,可以存放两个字节(2B=2*8位=16位)AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器。 {{ :assembly:16位寄存器的逻辑结构.jpg?nolink&600 |}} 一个16位的寄存器所能存储的数据的最大值为:2的16次-1 ==== - 数据存储 ==== {{ :assembly:16位数据在寄存器中的存放情况.jpg?nolink&600 |}} 为了保证兼容性,这四个通用的寄存器都可以分为两个独立的8位寄存器使用 ^ 寄存器 ^ 高位 | 低位 | | AX | AH | AL | | BX | BH | BL | | CX | CH | CL | | DX | DH | DL | AH和AL寄存器是可以独立使用的8位寄存器,AL寄存器计算溢出,不到进位到AH寄存器 {{ :assembly:16位寄存器分为两个8位寄存器.jpg?nolink&600 |}} 十进制2000为例 {{ :assembly:16位寄存器及所分成的两个8位寄存器的数据存储情况.jpg?nolink&600 |}} ===== -# 字在寄存器中的存储 ===== ==== - 字、字节、比特的关系 ==== 字(word):1个是由2个字节组成=2*8字节=16比特 {{ :assembly:一个字由两个字节组成.jpg?nolink&600 |}} 高位字节低位字节可以堪称是独立的字节数据。 十六进制的1位相当于二进制输的4位 {{ :assembly:十六进制与二进制的关系.jpg?nolink&600 |}} ===== -# 几条汇编语言 ===== 通过汇编语言控制cpu进行工作 {{ :assembly:汇编指令举例.jpg?nolink&600 |}} ==== - 高低8位计算方式 ==== 计算案例 {{ :assembly:表2.2.jpg?nolink&600 |}} AX只能放4位十六进制的数,最高位的1不能在AX保存,所以数据为044CH。满16进1。 计算案例 {{ :assembly:表2.3.jpg?nolink&600 |}} 注意指令的两个操作对象的位数应当一致。 ===== -# 物理地址 ===== 物理地址内存单元在其所在的一个一维的线性空间中的唯一地址 物理地址必须在内部先形成。 ===== -# 16位结构的cpu ===== ^ 结构特性 ^ | 运算器一次最多可以处理16位的数据 | | 寄存器的最大宽度为16位 | | 寄存器和运算器之间的通路为16位 | ===== -# 8086cpu给出物理地址的方法 ===== 8086cpu地址总线20位:1048576个内存单元,寻址能力1M。 8086cpu是16位结构:只能发出16位的地址,65536个内存单元,寻址能力64kb。 8086cpu采用一中在内部用两个16位地址合成方法形成一个20位的物理地址。 {{ :assembly:8086cpu相关部件的逻辑结构.jpg?nolink&600 |}} 地址加法器采用物理地址=段地址*16+偏移地址 {{ :assembly:地址加法器的工作过程.jpg?nolink&600 |}} ===== -# 段地址*16+偏移地址 ===== “段地址×16+偏移地址=物理地址”的本质含义:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。 ===== -# 段地址的概念 ===== {{ :assembly:分段.jpg?nolink&600 |}} 16位的寻址能力为64KB=65536个(0-65535) cpu可以用不同的段地址和偏移地址形成他同一个物理地址。 段地址1000H,用偏移地址寻址,cpu的寻址范围10000H(左移1位) 至 10000H+FFFF(65535)=1FFFFH *16 相当于 末尾左移1位 前位补0 /16 相当于 末尾右移1位替换前位数值 ===== -# 段寄存器 ===== 存放段地址和偏移地址 8086cpu有4个段寄存器:CS DS SS ES,当cpu要访问内存时由这4个段寄存器提供内存单元的段地址。 ===== -# CS和IP ===== 指示了cpu当前要读取指令的地址。 CS:段寄存器 IP:指令指针寄存器。 CS:IPZ指向的内容当做指令执行。 = cs*16+ip单元开始(ip的值根据实际自加),读取一条指令并执行。 {{ :assembly:8086pc读取和执行指令的相关部件.jpg?nolink&600 |}} 从CS:IP指向的内存单元读取指令,读的指令进去指令缓存器。 IP=IP+所读取指令的长度,从而指向下一条指令 执行指令,重复这个过程 ==== - 修改CS、IP的指令 ==== 程序员能后用指令读写的部件只有寄存器,可以通过修改寄存器中的内容实现对cpu的控制。 mov:传送指令 操作寄存器 ==== - jmp 指令 ==== jmp :转移指令 jmp CS:IP 只修改IP的内容,配合寄存器使用。 jmp ax,= ax赋给IP,CS保持不变 {{ :assembly:内存中存放的机器码和对应的汇编指令.jpg?nolink&600 |}} ==== - 工作过程 ==== 1.从CS:IP指向的内存单元读取指令,读的指令进入指令缓存器 2.IP指向下一条指令先做ip自加 然后执行读取到的指令 3.执行指令 ===== -# 代码段 ===== cpu只认被CS:IP指向所定义的内存单元中的内容为指令。