CPU
第二章 CPU
CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件
组成,这些器件靠内部总线相连。
内部总线;内部总线实现CPU内部各个期间之间的联系。
外部总线:外部总线实现CPU和主板上其他器件之间的联系
寄存器概述
2.1 通用寄存器
AX,BX,CX,DX通常用来存放一半性的数据被称为通用寄存器。
16位的寄存器可以存放一个16位的数据。
例:
AX的低8位0-7位构成了AL寄存器,高8位8-15位构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器,且单独在AL或AH运行的运算不进行进位
。
2.2 字在寄存器中的存储
1字=2字节=2B=2内存单元
而高低位寄存器ALAH组合出来的AX正好为一个字的数据。
2.3 简单汇编指令(MOV,ADD)
练习
那下面这个最后一步应该是多少呢?0158H吗?
但其实并不是这样,上面说过,因为单独看为一个al寄存器,所以不向上进位,为0058H
但这里的丢失并不是真的丢弃这个进位值,只是表示其不能在八位寄存器中保存,会存储在别的地方,在后面会有谈论。
2.4 物理地址
2.5 16位结构的CPU
特征:
- 运算器一次最多可以处理16位的数据。
- 寄存器的最大宽度为16位。
- 寄存器与运算器之间的通路是16位的。
8086有20位地址总线,可以传送20位地址,寻址能力为2^20B=1MB
但8086内部为16位的结构,只能传送16位地址,寻址能力只有64K。
问题:那么如何用16位数据转换成20位地址呢?
可以使用两个16位的地址合成一个20位物理地址。
CPU中提供两个相关部件分别提供两个16位地址,一个称为段地址,另一个称为偏移地址。
具体实现就是将段地址*16,也就是左移一位与偏移地址进行相加。
通过地址加法器对段地址和偏移地址进行相加。
地址加法器合成物理地址方法(极其重要
):
物理地址=段地址16+偏移地址
因为是16进制,所以16等于左移一位。1230*16=12300。
2.7 段地址*16+偏移地址=物理地址
这一个实际意义其实相当于我们只能通过纸条来通信,来告诉CPU要执行命令的所在地址,我们需要四位数据的纸条来传播信息,但不巧只有三位数据的纸条,那么我们只能通过用两张三位数的方法来告诉CPU相应的地址了,三位数的第一个条数据进行左移再相加,就达成了和四位数据纸条一样的效果。
2.8 段的概念
实际上内存并没有被划分为段,段的划分是由CPU来划分的,通过段地址16+偏移地址=物理地址的方式来给出物理地址,使得我们可以用分段的方式管理内存。
通过段地址16定位起始地址,用偏移地址定位内存单元。
偏移地址为16位,16位地址寻址能力为64KB,所以一个段的最大长度也为64KB。
两个问题
2.9 段寄存器
段寄存器就是提供段地址的。
8086CPU有四个段寄存器:CS,DS,SS,ES,其具体作用和区别在后面会详解。
当CPU要访问内存是,由这四个段寄存器来提供内存单元的段地址。
2.10 CS:IP
CS是代码段寄存器,IP为指令指针寄存器。
他们指示了CPU下一步要执行命令的地址在什么地方。
执行命令的流程:
CS,IP中的内容分别当成指令的段地址和偏移地址。
2.11 修改CS、IP的指令
语法:JMP 段地址:偏移地址 即 JMP CS:IP
要修改IP的值,可以先mov ax,数值,然后jmp ax,利用寄存器中的值来修改IP,这种方法只修改IP不修改CS。
例题
先别看答案,写一下CPU正常运行的顺序流程。
正确执行顺序:
mov ax,6622H
Jmp 1000:3
Mov ax,0000
Mov bx,ax
Jmp bx
Mov ax,0123H
2.12 代码段
问题:如何使代码段中的指令执行呢?
CPU只认被CS:IP指向的内存单元中的内容为指令。
所以要将CS:IP指向第一条指令的首地址
2.13 DEBUG模式(重要)
debug可以用WIN+R输入debug使用debug模式。或者使用doxbox小型虚拟机来进行练习。
实例
无法进行修改是因为,这部分是直接写在主板BIOS中ROM存储器的,相当于只读存储,无法进行修改。
底下两行代码这是修改了显存地址空间中的数据,所以在显示器上进行了显示。