受限于制造工艺,如集成电路密度和引脚数,8086的基本结构有如下特点:
- 引脚复用。如数据可双向传输
- 单总线、累加器结构
- 可控三态电路(oc电路)
- 总线分时复用
8086 CPU框图
上图只是简化图。分成左右两个单元:处理单元(Execution Unit)和 总线接口单元(Bus Interface Unit)。各个部件为:
- 算数逻辑单元 ALU. A 即 Algorithm,L 即 Logic。它只能做二进制加减乘除、清零置一等操作
- 通用寄存器。左上角就是通用寄存器。具体作用后面会细讲。
- 内部寄存器(段寄存器) Internal Comm. Registers 用来形成数据和地址
- 地址加法器 Σ 用来形成地址
- 右下角的123456 指令队列
下面是根据功能来进行更细的划分:
- 总线接口部件:管理地址、数据和控制总线,完成指令预取、读写数据等总线操作
- 指令预取部件:指令预取队列,通过总线接口部件从存储器中读取指令,放入指令队列
- 指令译码部件:从指令队列中读取指令并译码
- 指令执行部件:由 ALU、通用寄存器、桶形移位器等组成,完成算术逻辑运算
- 段管理部件:对存储器进行分段管理,将逻辑地址转化成线性地址
- 页管理部件:对存储器进行分页管理,将线性地址变换成物理地址
- 高速缓冲部件:加速指令和数据的访问
- 浮点运算部件:用于浮点运算
寄存器
临时放二进制的数据的部件就是寄存器,寄存器分为:
- 基本寄存器
- 通用寄存器
- 指令指针寄存器
- 标志寄存器
- 段寄存器
- 系统级寄存器
- 调试和测试寄存器
- 浮点寄存器
基本寄存器
- 通用寄存器
- 数据寄存器 16位 分成高H、低L各8位
- AX 累加器 Accumulator
- BX 基址~ Base
- CX 计数~ Count
- DX 数据~ Data
- 变址寄存器
- 源变址~ Source Index
- 目的变址~ Destination Index
- 指针寄存器
- 基址指针~ Base Point
- 堆栈指针~ Stack Point
- 数据寄存器 16位 分成高H、低L各8位
- 段寄存器
- 数据段 Data Segment
- 附加段 Extra Segment
- 堆栈段 Stack Segment
- 代码段 Code Segment
- 控制寄存器
- 指令指针~ Instruction Pointer
- 状态标志~ Processor Statue/Flag
别看这一堆东西这么多,我们逐个分析。
通用寄存器
数据寄存器特好记,ABCD四个16位,每个又分成高八位、低八位两个8位寄存器,于是就有 AH/AL、BH/BL、CH/CL、DH/DL。当作为16位用时,可以放数据,也能放地址;作为8位用时,只能放数据,地址就放不下了。
- AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据.
- BH&BL=BX(base):基址寄存器,常用于地址索引;
- CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
- DH&DL=DX(data):数据寄存器,常用于数据传递。
变址和指针寄存器,看名字就知道是和地址相关的,一个个说:
- SI 和 DI,一个源,一个目的,很显然是组合一起用的。比如字符串操作,一个指向开头,一个指向结尾;
- SP 堆栈指针,指向栈的顶部,栈底由 SS 段寄存器来提供;
- BP 基址指针,这个看不出是啥用的,总之指向地址,至于指向哪个地址,我们后面再讲。
这三个都是“偏移地址”,需要配合段寄存器才知道真正的地址。
段寄存器
段是个什么玩意呢?打个比方,查字典,咱不能直接翻到那一页,要先看开头字母是啥,然后再看后面的字母。这个开头字母就是段首,也就是段寄存器存的东西;而后面的字母也就是段内的偏移地址。两个合起来,咱才能查到地址。
代码段 CS,就是放要执行程序的段首地址。CS«4+IP=代码地址(«即左移)
数据段 DS,就是放数据的段首地址。DS«4+代码中的地址=数据地址
堆栈段 SS,就是放堆栈的栈底地址。 SS«4+SP=栈顶
附加段 ES,就是给用户自己玩的。
指令指针 IP
CS«4+IP=代码地址
用户不能直接访问 IP,但可以通过其他方法修改 IP,比如中断、跳转、返回等。
状态标识寄存器 Flag
我们从右到左逐一介绍:
CF:进位标志(最高位加法进1/减法借1时为1)
PF:奇偶标志(低8位中有偶个1时为1,反之为0,用来偶校验,与51相反)
AF:辅助进位标志(低4进位时为1,用于BCD码)
ZF:零标志(判断结果是否为0,防止除以0)
SF:符号标志(判断正负,即最高位0/1)
TF:陷阱标志/单步标志(单步执行)
IF:中断标志()
DF:方向标志(正着数+1/倒着数-1)
OF:溢出标志(防止两正相加/两负相减超出最大数)
在这里我们要掌握的是加法与减法时的标志位,即 ZF、AF、OF、SF、PF、CF(口诀:早上跑操)。下面举个例子:
运算
0110 0011 0100 0101
+ 0101 0010 0001 0110
= 1011 0101 0101 1011
标志位
最高位是1,所以 SF=1
结果非零,所以 ZF=0
低8位有5个1,所以 PF=0
第3位没有进位,所以 AF=0
最高位没进位/借位,所以 CF=0
两个正数相加产生了负数,所以 OF=1
判断溢出主要看:
- 正+正有无产生负
- 负+负有无产生正
- 正-负有无产生负
- 负-正有无产生正
也有另一种方法判断溢出,即最高位和次高位必须同时进位或同时借位,比如:如果最高位进位,但次高位没进,则为溢出。
系统级寄存器
浮点寄存器
说实话,上俩部分书上没有,所以咱也暂时不讲。