目录
一、8086 CPU 概述
1.基本信息
8086 是 16 位微处理器,在微机发展史上具有重要地位。
它的出现推动了个人计算机的广泛应用和发展。
2.特点
具有较高的处理能力和运算速度,能够满足当时多种应用场景的需求。
16 位的数据总线和地址总线(20 位物理地址通过特殊方式形成),可寻址 1MB 的内存空间,为程序和数据的存储提供了相对较大的空间。
二、功能结构
1.执行单元(EU)
(1)算术逻辑单元(ALU):执行算术和逻辑运算,是数据处理的核心。例如进行加法运算10 + 20,ALU 会完成实际的计算操作。
(2)通用寄存器组:包括 AX、BX、CX、DX 等,用于暂存操作数和中间结果。如 AX 寄存器在乘法和除法运算中有特殊用途,BX 可作为基址寄存器用于寻址。
(3)标志寄存器(FLAGS):存储运算结果的状态信息,如进位标志 CF、溢出标志 OF 等。在进行有符号数加法运算结果超出范围时,OF 会被置位。
2.EU 控制器:
负责指令译码和控制 EU 内部各部件协同工作,从指令队列中取指令并安排执行。
(1)工作原理
EU 从总线接口单元(BIU)的指令队列中获取指令,译码后利用 ALU 和寄存器进行数据运算,根据运算结果设置标志位。例如执行指令ADD AX, BX,EU 会将 AX 和 BX 中的数据相加,结果存回 AX,并根据运算情况更新标志寄存器。
3.总线接口单元(BIU)
(1)段寄存器:CS(代码段寄存器)、DS(数据段寄存器)、SS(堆栈段寄存器)、ES(附加段寄存器),用于确定内存段的基址。在程序执行时,CS 和 IP(指令指针寄存器)共同确定下一条要执行的指令的地址;DS 用于数据存储的寻址。
(2)指令指针寄存器(IP):指示下一条要取的指令在代码段中的偏移地址,随着指令的读取自动递增。
(3)地址加法器:将段寄存器提供的段基址和偏移地址组合生成 20 位物理地址,实现对 1MB 内存空间的寻址。例如,当要访问数据段中偏移地址为 100H 的存储单元时,地址加法器会将 DS 中的段基址与 100H 相加得到物理地址。
指令队列:6 字节的先进先出队列,用于预存指令。BIU 提前从内存中取指令放入队列,EU 可快速获取指令,提高 CPU 执行效率。
4.总线控制逻辑:
管理 CPU 与外部总线的通信,负责数据传输、地址输出和控制信号的收发,确保 CPU 与内存、I/O 设备等之间的正确数据交换。
(1)工作原理
BIU 根据 EU 的需求或自动地预取指令存入指令队列。当 EU 需要执行指令时,从队列中提供指令。同时,在 EU 进行数据读写操作时,BIU 负责生成物理地址并与内存或 I/O 设备进行数据传输。例如,当 EU 要读取内存中的数据时,BIU 根据相关段寄存器和偏移地址生成物理地址,然后从内存中读取数据并传送给 EU。
三、寄存器结构
1.通用寄存器
通用寄存器
(1)AX(累加器):常用于算术和逻辑运算,尤其是乘法和除法指令中。例如,在执行乘法指令MUL BX时,结果会存放在 AX(如果是 16 位乘法)或 DX:AX(如果是 32 位乘法)中。
(2)BX(基址寄存器):常作为存储器寻址时的基址寄存器,可用于数组、结构体等数据结构的寻址。例如,在访问数组元素时,BX 可以存储数组的基地址,通过加上偏移量来访问不同的数组元素。
(3)CX(计数器):常用于循环控制和移位操作。在循环指令中,CX 通常用来指定循环次数。例如,在LOOP指令中,每次循环 CX 的值会减 1,当 CX 为 0 时循环结束。
(3)DX(数据寄存器):在某些乘法和除法运算中与 AX 配合使用,也可用于 I/O 端口寻址等。例如,在进行 32 位除法时,DX 存储被除数的高 16 位,AX 存储被除数的低 16 位,商存放在 AX 中,余数存放在 DX 中。
指针和变址寄存器
(1)SP(堆栈指针寄存器):指示堆栈段中当前栈顶的位置。在进行压栈(PUSH)和出栈(POP)操作时,SP 会自动增减来更新栈顶位置。例如,执行PUSH AX指令时,AX 中的数据会被压入堆栈,SP 的值会减 2(假设堆栈以字为单位操作)。
(2)BP(基址指针寄存器):在堆栈操作中可用于访问堆栈中的数据,也可作为通用寄存器使用。例如,在函数调用中,BP 可以用来保存函数调用前的栈帧基址,方便访问函数的参数和局部变量。
(3)SI(源变址寄存器)和DI(目的变址寄存器):常用于字符串操作和数组访问等指令中,用于指定源操作数和目的操作数的偏移地址。例如,在执行字符串复制指令MOVSB或MOVSW时,SI 指向源字符串的地址,DI 指向目的字符串的地址,每次执行指令后,SI 和 DI 会根据操作的数据类型自动增减。
段寄存器
(1)CS(代码段寄存器):存储当前正在执行的程序的代码段的段基址。CPU 从 CS:IP 所指向的内存单元读取指令并执行。
(2)DS(数据段寄存器):用于存储数据段的段基址,程序中的数据操作通常基于 DS 进行寻址。
(3)SS(堆栈段寄存器):指定堆栈段的段基址,堆栈操作(如压栈、出栈)使用 SS 和 SP 来确定堆栈的位置。
(4)ES(附加段寄存器):可作为附加的数据段寄存器使用,在一些字符串操作指令中,ES 可与 DI 寄存器配合使用,用于指定目的字符串所在的段。
2.标志寄存器(FLAGS)
状态标志
(1)CF(进位标志):在进行无符号数运算时,如果最高位产生进位或借位,则 CF 置 1,否则置 0。例如,执行无符号数加法1000H + 1000H,结果为2000H,此时 CF 会被置 1,因为最高位产生了进位。
(2)PF(奇偶标志):若运算结果中 1 的个数为偶数,则 PF 置 1,否则置 0。常用于数据传输的校验。
(3)AF(辅助进位标志):在字节运算时,低半字节向高半字节有进位或借位时置 1,否则置 0;在字运算时,低字节向高字节有进位或借位时置 1,否则置 0。
(4)ZF(零标志):当运算结果为 0 时,ZF 置 1,否则置 0。例如,执行指令SUB AX, AX后,AX 为 0,ZF 会被置 1。
(5)SF(符号标志):运算结果为负数时置 1,正数时置 0。对于有符号数运算,SF 反映了结果的符号。例如,有符号数减法10 - 20,结果为-10,SF 会被置 1。
(6)OF(溢出标志):在有符号数运算中,当结果超出了数据所能表示的范围时置 1,否则置 0。例如,对于 8 位有符号数,范围是-128到127,执行加法120 + 10,结果为130,超出范围,OF 会被置 1。
控制标志
(1)DF(方向标志):用于控制字符串操作指令中地址指针的增减方向。当 DF 为 0 时,字符串操作指令执行后,源变址寄存器 SI 和目的变址寄存器 DI 自动递增;当 DF 为 1 时,SI 和 DI 自动递减。例如,在执行字符串复制指令时,如果 DF 为 0,每次复制一个字符后,SI 和 DI 会加 1;如果 DF 为 1,SI 和 DI 会减 1。
(2)IF(中断允许标志):IF 为 1 时,CPU 允许响应外部可屏蔽中断请求;IF 为 0 时,则禁止响应。可以通过指令来设置或清除 IF 标志,例如CLI指令用于清除 IF 标志,禁止中断,STI指令用于设置 IF 标志,允许中断。
(3)TF(陷阱标志):也称为单步标志。当 TF 为 1 时,CPU 处于单步执行方式,每执行一条指令后就产生一个单步中断,用于调试程序。在调试过程中,可以利用单步执行来逐句检查程序的执行情况,观察每一步执行后寄存器和内存的变化。
四、存储器组织
1.存储单元的编址
8086 的内存空间采用字节编址方式,每个存储单元都有一个唯一的 20 位物理地址。
地址范围从00000H到FFFFFH,共 1MB。
2.存储器分段
为了便于管理和使用内存,8086 将 1MB 的内存空间分为若干个逻辑段,每个段最大长度为 64KB(2^16字节)。
程序可以使用代码段存放指令,数据段存放数据,堆栈段存放堆栈数据等。
段的起始地址由段寄存器(CS、DS、SS、ES)提供的段基址和偏移地址共同确定。物理地址 = 段基址 ×16 + 偏移地址。例如,CS 的值为1000H,IP 的值为2000H,则要执行的指令的物理地址为1000H*16+2000H=12000H。
3.堆栈的操作
堆栈是一种特殊的数据存储结构,遵循 “先进后出” 的原则。
8086 中,堆栈操作主要通过堆栈指针寄存器 SP 和堆栈段寄存器 SS 来实现。
(1)压栈操作(PUSH):将数据压入堆栈时,先将 SP 的值减 2(以字为单位操作时),然后将数据存入 SP 指向的堆栈单元。例如,执行PUSH AX指令,会先将 SP 减 2,然后将 AX 中的数据存入 SS:SP 所指向的内存单元。
(2)出栈操作(POP):从堆栈中弹出数据时,先将 SP 指向的堆栈单元的数据弹出到指定寄存器或内存位置,然后将 SP 的值加 2。例如,执行POP BX指令,会将 SS:SP 所指向的内存单元的数据弹出到 BX 中,然后 SP 加 2。
五、工作模式
1.最小模式
是 8086 系统中一种较为简单的工作模式,主要用于小型系统或对系统资源需求较少的应用场景。
在最小模式下,系统中只有一个 8086 微处理器,所有的控制信号都由 8086 CPU 直接产生,不需要外部的总线控制器。
例如,在一些简单的嵌入式系统或教学实验平台中,可能会采用 8086 的最小模式来实现基本的功能,如简单的数据处理和控制任务。
2.最大模式
适用于较大规模的系统,在这种模式下,系统中可能包含多个处理器或其他设备,需要更复杂的总线控制和协调机制。
8086 CPU 将部分控制信号输出到总线控制器(如 8288),由总线控制器产生系统所需的各种控制信号,如存储器读写控制信号、I/O 读写控制信号等。
例如,在一个多处理器的工业控制系统中,8086 可能工作在最大模式下,与其他处理器和设备协同工作,通过总线控制器来管理和协调总线的使用,实现更复杂的控制和数据处理任务。
六、指令系统
1.指令格式
8086 指令一般由操作码和操作数两部分组成。
(1)操作码:规定了指令要执行的操作类型,如加法、减法、数据传送等。例如,MOV指令的操作码表示数据传送操作。
(2)操作数:可以是立即数、寄存器操作数、存储器操作数等,用于指定操作的对象或数据来源。例如,MOV AX, 10中,10是立即数操作数,AX是寄存器操作数,指令的功能是将立即数 10 传送到 AX 寄存器中。
2.寻址方式
(1)立即寻址:操作数是立即数,直接包含在指令中。例如,MOV AX, 100H,指令执行时,将立即数100H直接传送到 AX 寄存器中。
(2)寄存器寻址:操作数在寄存器中,指令中指定寄存器名。如ADD BX, CX,将 BX 和 CX 寄存器中的内容相加,结果存回 BX 寄存器。
(3)直接寻址:指令中直接给出操作数的有效地址(偏移地址)。例如,MOV AX, [2000H],将内存地址为2000H处的字数据传送到 AX 寄存器中。
(4)寄存器间接寻址:操作数的有效地址存放在寄存器中,寄存器可为 BX、BP、SI、DI。例如,MOV AX, [BX],若 BX 的值为1000H,则将内存地址为1000H处的字数据传送到 AX 寄存器中。
寄存器相对寻址:有效地址是寄存器内容与一个位移量之和。例如,MOV AX, [BX + 100H],将内存地址为(BX + 100H)处的字数据传送到 AX 寄存器中。
(5)基址变址寻址:有效地址是基址寄存器(BX 或 BP)与变址寄存器(SI 或 DI)内容之和。例如,MOV AX, [BX + SI],常用于数组和结构体的寻址。
基址变址且相对寻址:有效地址是基址寄存器、变址寄存器与位移量之和。例如,MOV AX, [BX + SI + 100H],提供了更灵活的寻址方式,适用于复杂的数据结构访问。
3.数据传送指令
(1)MOV 指令:用于数据的传送,可在寄存器之间、寄存器与存储器之间、立即数与寄存器或存储器之间进行数据传送。例如,MOV AL, BL将 BL 寄存器中的 8 位数据传送到 AL 寄存器中;MOV [DI], AX将 AX 寄存器中的 16 位数据传送到以 DI 寄存器内容为偏移地址的内存单元中。
(2)PUSH 和 POP 指令:用于堆栈操作。PUSH 指令将数据压入堆栈,POP 指令从堆栈中弹出数据。例如,PUSH AX将 AX 寄存器中的数据压入堆栈,POP BX将堆栈顶部的数据弹出到 BX 寄存器中。
4.算术运算指令
(1)ADD 指令:实现加法运算,可对寄存器、立即数和存储器中的数据进行加法操作。例如,ADD AX, 10将立即数 10 与 AX 寄存器中的数据相加,结果存回 AX 寄存器;ADD [BX], CX将 CX 寄存器中的数据与以 BX 寄存器内容为偏移地址的内存单元中的数据相加,结果存回该内存单元。
(2)SUB 指令:执行减法运算,用法与 ADD 指令类似。例如,SUB AX, BX将 AX 寄存器中的数据减去 BX 寄存器中的数据,结果存回 AX 寄存器。
(3)MUL 和 DIV 指令:分别用于乘法和除法运算。MUL 指令在进行无符号数乘法时,如果是 8 位乘法,操作数为 AL 和另一个 8 位操作数,结果存放在 AX 中;如果是 16 位乘法,操作数为 AX 和另一个 16 位操作数,结果存放在 DX:AX 中(DX 存放高 16 位,AX 存放低 16 位)。DIV 指令在进行除法运算时,如果是 8 位除法,被除数在 AX 中,除数为 8 位操作数,商存放在 AL 中,余数存放在 AH 中;如果是 16 位除法,被除数在 DX:AX 中,除数为 16 位操作数,商存放在 AX 中,余数存放在 DX 中。
5.逻辑运算指令
(1)AND 指令:实现按位与运算,用于对操作数进行逻辑与操作,结果存放在目标操作数中。例如,AND AX, BX将 AX 和 BX 寄存器中的数据按位进行与运算,结果存回 AX 寄存器。常用于清除某些位(将需要清除的位与 0 进行与运算)或保留某些位(将需要保留的位与 1 进行与运算)。
(2)OR 指令:执行按位或运算,对操作数进行逻辑或操作,结果存于目标操作数。例如,OR AX, 0FH将 AX 寄存器中的数据与立即数0FH按位进行或运算,结果存回 AX 寄存器。可用于将某些位置 1(将需要置 1 的位与 1 进行或运算)。
NOT 指令:对操作数进行按位取反操作,结果存放在目标操作数中。例如,NOT AX将 AX 寄存器.