微处理器(cpu):它包括运算器、控制器、寄存器阵列和内部总线等部分。用于实现微型计算机的运算和控制,是微型计算机的核心。
8086cpu是Intel系列的16位微处理器,有20位地址总线和16位数据总线,所以其可寻地址的地址空间是2^20个字节=1MB。
利用第16位的地址总线来进行I/O端口寻址,可寻址64K个I/O端口。其中断功能强,可处理内部软件中断和外部中断,中断源可达256个。
从程序员的角度看,8086cpu分为两部分:执行部件(EU)和总线接口部件(BIU)。
功能:执行命令
组成:1.8个通用寄存器:4个数据寄存器(AX、BX、CX 、DX)和4个指针和变址寄存器(BP、SP、SI、DI)。
2.标志寄存器FR:用来保存ALU运算结果的一些特征信息
3.算术逻辑单元ALU(arithmetic logic unit)。
4.内部控制逻辑。
功能:负责cpu与内存或输入输出接口之间的信息传送(根据EU的请求,执行8086 CPU 对存储器或 I/O 接口的总线操作,完成数据传送)
组成: 1 指令队列缓冲器
216位指令指针寄存器IP,段寄存器CS、DS、SS和ES。
3地址加法器
4总线控制逻辑等部件
通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途。
1.数据寄存器:可以存放16位的数据或地址。又可分为8个8位寄存器,即:
AX→AH(高八位)、AL(第八位)
BX→BH(高八位)、BL(第八位)
CX→CH(高八位)、CL(第八位)
DX→DH(高八位)、DL(第八位)
注:8位寄存器只能存放数据而不能存放地址(偏移地址16位)。
下面给出一幅 16 位数据寄存器的结构图:
表示 16 位 寄存器 AX 可以表示成两个 8 位寄存器,
其中 AH 表示高位的 8 位寄存器,AL 表示低位的 8 位寄存器 。
AX (Accumulator):累加器。用于计算,所有I/O指令都通过AX或AL与接口传送信息,中间运算结果也存放AX中。
BX (Base):基址寄存器。在间接寻址中用于存放基地址。
CX (Count):计数寄存器。可以用作数据寄存器,在字符串操作、循环操作、和移位操作时用作计数器,存放计数值。
DX (Data):数据寄存器。在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。
2.SP和BP又称为指针寄存器
SP (Stack Pointer):堆栈指针寄存器。在堆栈操作中存放栈顶的偏移位置。(不能寻址)
BP (Base Pointer):基指针寄存器。常用于访问内存时存放单元的偏移地址。还用作堆栈区的基地址寄存器。(可以寻址)
SI (Source Index):源变址寄存器。主要用于存放地址,在字符串操作中存放源操作数的偏移地址。
DI (Destination Index):目的变址寄存器。同样主要用于存放地址,字符串操作中存放目的操作数的偏移地址。
CS:代码段寄存器。存放当前执行的程序的段地址。
DS:数据段寄存器。存放当前执行的程序所用操作数的段地址。
SS:堆栈段寄存器。存放当前执行的程序所用堆栈的段地址。
ES:附加段寄存器。存放当前执行程序中一个辅助数据段的段地址。
IP:指令指针寄存器。指示存储器指令的位置。随着指令的执行,IP将自动修改以指示下一跳指令所在的存储器位置,IP寄存器是一个专用寄存器,IP寄存器是CS段寄存器联合使用以确定下一条指令的存储单元地址。
FLAGS(PSW):标志寄存器或称为程序状态寄存器。虽然有16位,但是只使用其中9位,其中包括6个状态标志位和3个控制标志,也就是说,FLAG 中的每一个位都表示不同的状态,由于一个位也就能表示 0 和 1 ,自然,FLAG 中的每一个位就是用来描述状态的,
而且 FLAG 寄存器中存储的信息通常又被称作程序状态字(PSW) 。
下面我们就按不同的位来分别介绍这些位所描述的状态,以及它们代表的意义:
1.CF(Carry FLag) - 进位标志(第 0 位): 进位标志是用来反映计算时是否产生了由低位向高位的进位,或者产生了从高位到低位的借位
2.PF(Parity FLag) - 奇偶标志(第 2 位):奇偶标志是用来记录相关指令执行后,其结果的所有的 Bit 位中 1 的个数是否为偶数 。
3.AF(Auxiliary Carry FLag) - 辅助进位标志(第 4 位): 用来辅助进位标志 。
4.ZF(Zero FLag) – 零标志(第 6 位):运算结果为0时ZF=1,否则为 0。
5.SF(Sign FLag) - 符号标志(第 7 位): 符号标志,其记录相关指令执行完以后,其结果是否为负数 。
6.IF(Trap FLag) - 中断允许标志位(第 8 位): 中断允许标志,其决定 CPU 是否能够响应外部可屏蔽中断请求
7.DF(Direction FLag) - 方向标志(第 10 位):方向标志,其用于在串处理指令中,用来控制每次操作后 SI 和 DI 是自增还是自减 。
8.OF(OverFlow FLag) - 溢出标志(第 11 位): 溢出标志,其通常记录了有符号数运算的结果是否发生了溢出 。
9.TF-调试标志位(第8位):当TF值为1时,CPU每执行一条指令就会触发1号中断,典型案例就是MASM的Debug程序。
8086有20根地址总线,这样可以直接寻址的物理地址空间为2^20=1M字节(存储单元以字节为单位),范围是00000H至FFFFFH。但是8086CPU的寄存器都是16位,那么在传输地址时显然一次只能传输16位有效地址,也就是只足够访问2^16=64K字节地址空间。为了实现寻址1M字节物理空间,8086/8088引入了分段的概念。
将1M存储空间分为若干块,称为“逻辑段”。每个逻辑段的容量≤64KB,存放一种类型的数据或者程序。因此1M的存储空间可分成16个逻辑段(0——15)。在段内寻址仍采用传统的16位地址寻址方法。
要访问某个内存单元,根据我们划分的逻辑段,计算存储单元的地址的差值,称段内偏移(简称偏移)。
在整个1M地址空间中,存储单元的物理地址等于段起始地址加上段内偏移。
物理地址计算公式:
物理地址 = 段值*10H + 段内偏移
Eg. 用16进制表示的逻辑地址1234:3456H所对应的存储单元的物理地址为12340H+3456H=15796H
(段值由段寄存器给出,段内偏移可由指令指针IP、堆栈指针SP和其他可作为存储器指针使用的存储器(SI、DI、BX和BP)给出,段内偏移还可以直接用16位数给出。)
8086cpu段寄存器有4个,可以保存四个段值,四个段的分工各不相同。
在取指令时,cpu引用代码段寄存器CS,再加上由IP所给出的16位段内偏移,从而得出实际物理地址。
当涉及堆栈操作时,CPU会自动引用堆栈段寄存器SS,再加上由SP所给出的16位段内偏移,得到堆栈操作所需的物理地址。
若段内偏移涉及BP寄存器时,缺省引用的段寄存器也为堆栈段寄存器SS。
在一般数据存取的情况下,则自动选择数据段寄存器DS或附加段寄存器ES,再加上16位偏移,得到存储器操作数的物理地址。
若是整个程序不超过64K字节,那么使用1个64K字节的段就可以了。