嵌入式系统与接口技术

计算机组成

CPU组成

  • ALU 运算器 二进制运算
  • CU 控制单元
    晶体管->逻辑门->加法器->ALU
    晶体管->存储器->锁存器…寄存器,…memory—>RAM
    三态:高电压 低电压 高阻

冯·诺伊曼结构(普林斯顿结构)

指令程序和数据在同一个存储空间

哈佛结构

指令、数据存在不同地方(双存储器)

计算机硬件结构

ALU(Arithmetic Logical Unit)算术逻辑单元

算数、逻辑运算
双输入 单输出

存储器(读、写、访问):容量(字、字节)、字长

  • 位bit 0 or 1

  • 字节byte 1byte=8bit 所有存储器的基本存储数据单元 B

  • 1kB = 1024B;1MB = 1024kB;1GB = 1024MB;1TB = 1024GB

  • 字word 一次可以直接处理的二进制数码的位数,通常取决于微处理器内部通用寄存器的位数和数据总线的宽度
    (地址总线的宽度决定了CPU可以寻址的内存空间大小,而数据总线的宽度决定了CPU可以一次性传输数据的大小。)

  • if 数据总线是32位的,1word ↔ 32bit

  • 字长反映并行运算能力 longer stronger

  • 双字double word、四倍字quad word

  • 字数——存储器的地址范围[地址的个数],决定于所使用的地址总线位数

  • 位数——存储器的数据范围[数据的宽度],决定于所使用的数据总线位数

不同字长存储器的地址安排
16位时同一行两个字节地址的最低1位不同
32位时同一行4个字节地址的最低2位不同

主存 RAM(随机存取 静态SRAM 动态DRAM)+ROM(只读)

  • 高速缓存 Cache CPU内部的小容量局部高速存储器
  • 外存 磁盘 U盘 磁带等

控制器:指令、程序

内部主要功能部件:

  • 指令寄存器:存放由存储器取得的指令。
  • 译码器:将指令中的操作码翻译成控制信号。
  • 时序节拍发生器:产生时序脉冲节拍信号,使计算机有节奏、有次序地工作。
  • 操作控制部件:将控制信号组合起来,控制各个部件完成相应的操作。
  • 指令计数器:计算并指出下一条指令的地址。

控制器对指令进行译码,并根据指令的操作要求指挥所有其它部件的工作,为此它根据指令生成一系列时序控制信号,控制其它单元工作。
控制器不断地从存储器中读取指令,然后分析指令的含义(译码),并执行指令的操作,执行完成以后又从存储器中读取下一条指令。

一条计算机指令的功能有限,完成复杂的运算功能需要将多条指令组合起来构成指令序列。这样一个完成某种功能的指令序列称为程序

  • 通常还把CPU、存储器和输入/输出接口电路和在一起构成的电路系统称为主机(也即微型计算机)

系统总线 各部件之间传送信息(BUS

  • 地址总线 Address Bus
    CPU用来向存储器或I/O端口传送地址 CPU单向发出
    位数n—>可直接寻址的内存,IO接口容量$2^n$

  • 数据总线 Data Bus
    CPU与存储器及外设交换数据的通路
    双向、三态
    位数与微处理器的位数相同

  • 控制总线 Control Bus
    用来传输控制信号
    由两种方向的单向控制信号组成

总线:计算机中连接各个功能模块的纽带,是计算机各模块之间进行信息传输的公共线路

发射模块、接收模块
主设备:能启动总线服务的设备(如CPU)
从设备:只能等待启动命令的被动型设备

按物理特性分类:
- 电缆式:通常采用扁平电缆连接线路板
- 主板式:在主机板上采用插槽方式供功能板插入。
- 背板式:在机箱中设置一个专门的总线插槽板。

按连线数量分类:
- 串行总线:一条数据线进行数据传输
- 并行总线:8位、16位、32位、64位

按连接的对象分类:
- 片总线:用于集成电路内部各功能单元的信息通路,属芯片级总线
- 系统总线(也称内总线):用于计算机内部各插件板(部件)之间的互连,属板级总线。常用的总线标准有ISA、EISA、PCI、PCI-E等
- 外总线:用于计算机之间或主机与外设之间的通信,属设备级总线。常用的总线标准有RS-232C、RS-485、IEEE-488、USB总线等

数据传输方向
- 单工:单向传输总线。
- 双工:双向传输总线。
- 半双工:只能在两个方向上轮流传输信息。
- 全双工:可在两个方向上同时传输信息。

定时(时钟)特征

  • 同步:数据传输速率是固定的。
  • 异步:数据传输速率是可变的

总线结构

单总线结构

image.png

  • 各模块之间的信息传递都通过单总线进行。
  • 优点:控制简单,易于扩充配置I/O设备。
  • 缺点:所有设备都连在一组总线上,总线只能分时工作,使数据传输量受限。

面向CPU的双总线结构

image.png

  • 通过存储总线使CPU对主存进行读/写操作。通过I/O总线让CPU与I/O设备进行数据交换。
  • 优点:提高了微机系统数据传输效率。
  • 缺点:外设和主存之间没有直接通路,要通过CPU进行信息交换,降低了CPU的工作效率。

面向主存的双总线结构

image.png
结合了以上2种结构的特点。提高了信息传送效率,同时也不降低CPU的工作效率。

微机的性能指标

  • 主频:计算机的晶振频率,反映时钟周期的大小。
  • 字长:CPU的数据位数,反映CPU并行处理能力。
  • 内存容量:能存储信息的字节数。
  • 存取周期:主存储器完成一次读写所需的时间。
  • 响应时间:用户向计算机系统发出一个请求后,到系统对该请求做出响应并获得其结果所需的等待时间。
  • 吞吐率:系统响应用户请求的速率。
  • 运算速度:微机每秒所能执行的指令数。
  • MIPS(Million Instruction Per second):反映计算机每秒可执行的指令数。

输入输出设备

基本输入输出方式:设备的编址、数据的传送方式

IO设备与CPU之间的连接:IO接口
解决:速度、信号电平、信号格式、时序等不匹配问题

image.png

统一编址法

  • 存储器映像的外设寻址
  • 将接口中的控制寄存器、数据寄存器、状态寄存器和内存单元一样看待
  • 接口与存储器采用不同的地址
  • 可以利用访存指令进行输入输出操作

单独编址法

两个地址空间
访问存储器/外围设备采用不同的指令

中断方式

  • 中断——在发生了一个外部的事件时调用相应的处理程序的过程
    中断服务程序
  • 中断服务程序与中断时CPU正在运行的程序是相互独立的,相互不传递数据。
  • 中断处理中的问题
    设备识别方式
    中断处理程序入口地址的形成
    中断裁决
    中断屏蔽
    image.png
    多重中断
  • 中断服务程序也可以被中断
  • 中断嵌套
    实现方法
  • 给CPU及中断请求都设置优先级
  • 多级中断

嵌套中断响应过程:

  1. 保存现场
  2. 关中断
  3. 识别中断
  4. 形成服务程序入口地址
  5. 执行服务程序
    [可关中断阻止其他中断]
    ……
  6. 恢复现场
  7. 开中断

计算机软件系统

  • 系统软件
    • 操作系统
      • 交互操作系统
      • 实时操作系统
      • 嵌入式操作系统 Embedded Operation System,EOS
    • 编译程序
    • 解释程序
  • 应用软件
  • 虚拟机 在实际硬件以上的机器层次都称为虚拟机,是由软件构成的外部特性

层次化结构

image.png
Firmware:固定不变的常用软件固化在硬件中 (ROM) 成为固件

计算机语言

  • 机器语言 二进制代码
  • 汇编语言 助记符
  • 高级语言 与计算机结构无关 C等
  • 应用语言 应用程序中使用 SQL HTML

定点数编码

数制

二进制——后缀B 1101.1010B
八进制——后缀Q或O 625.71Q
十进制——后缀D或省略 3.1415
十六进制——后缀H 0AE.3FH

$$
(𝑥){𝑁}=𝑥_𝑛 𝑥{𝑛−1}⋯𝑥1 𝑥_0 𝑥{−1}⋯𝑥_{−𝑚}=∑_{𝑖=−𝑚}^𝑛(𝑥_𝑖×𝑁^𝑖 )
$$

  • 定点数:小数点位置固定不变的数
  • 定点整数:小数点定在最低位数的右面
  • 定点小数:小数点固定在最高位数的后面,即纯小数表示

0: 30h 48D
A:41h 65D
a: 61h 97D
回车(CR):0DH
换行(LF):0AH

计算机以二进制数的形式存储数据,称为机器数

  • 无符号数
  • 有符号数
    原码、反码、补码、移码
    1位符号位

原码 (Sign-magnitude representation)

  • 表示方法:原码使用二进制的最高位作为符号位(0代表正,1代表负),其余位
  • 表示数值的绝对值。
  • 例子:+7 的原码为 0111,-7 的原码为 1111(假设使用4位表示)。

反码 (Ones’ complement)

  • 正数的反码与原码相同。
  • 负数的反码是对原码除符号位外的所有位取反(0变1,1变0)。
  • 例子:+7 的反码为 0111(与原码相同),-7 的反码为 1000(4位表示)。

补码 (Twos’ complement)

  • 正数的补码与原码相同。

  • 负数的补码是其反码加1。

  • 转换方法:无论正负数,将一个数的补码再次取补码可以得到其原码。

  • 例子:+7 的补码为 0111(与原码相同),-7 的补码为 1001(4位表示)。

  • 原码转反码和补码

    • 正数:原码、反码、补码相同。
    • 负数:反码是原码非符号位取反;补码是反码加1。
  • 反码转原码

    • 正数:直接转换。
    • 负数:反码非符号位取反。
  • 补码转原码

    • 正数:直接转换。
    • 负数:补码减1后,非符号位取反。
      移码:在补码基础上加$2^n$
      -5 1011(补) 0011(移)

补码可直接相加、减
$$
[x]_补+[y]_补=[x+y]_补
$$
$$
[x-y]_补=[x]_补-y_补=x_补+[-y]_补
$$
字节存储顺序

  • 大数端(big Endian):高位字节置于低地址,低位字节置于高地址
  • 小数端(little Endian):低位字节置于低地址,高位字节置于高地址
地址 数据
4H 00H
5H 11H
6H AAH
7H BBH

小数端:BBAA1100H
大数端:0011AABBH
Intel,ARM均小端格式 摩托罗拉古早为大端

浮点数编码

  • 组成:阶码E,尾数M,符号位S
  • E的编码:移码或补码
    • 移码:将数据的二进制编码加上一个常数(通常是 $2^{n-1}$)后的二进制代码作为该数据的编码。移码的特点:保持了数据原有的大小顺序,便于数据比较。
  • S与M的编码:原码或补码
S 符号位 0/1 E 阶码 移码表示 M 尾数

$$
N=(-1)^S\times M \times R^E
$$
R进制:多个二进制位构成一组,代表一个R进制位

规范化浮点数(IEEE754)编码

$$
N=(-1)^S\times 1.M \times 2^e
$$
S and M :原码 S=0为正
E=e+127(单精度) E=e+1023(双精度)

  • 在单精度浮点数中,指数位偏移量为127。
    • 对于一个非负指数,真实指数值加上偏移量就是该指数的编码值
    • 对于一个负指数,真实指数值加上偏移量的补码就是该指数的编码值。
      单精度 32bit
S E M
31 30 (8) 23 22 (23) 0

双精度 64bit

S E M
63 62 (11) 52 51 (52) 0

浮点数的表示范围

  • 浮点数的溢出表现为阶码的溢出。浮点数的上溢:数据太大,以至于大于阶码所能表示的数据;浮点数的下溢:数据太小,以至于小于阶码所能表示的数值
  • 浮点数表示法可以扩大数值表示的范围;浮点数表示法未增加表示数值的个数;绝对值越大,浮点数分布越稀疏;
  • 阶码位数越多,数据表示的范围就越大;尾数位数越多,数据表示的精度越高
    image.png

8086微机系统原理和结构

8086 CPU特性

  • Intel公司于1977年推出
  • 数据总线:16位
  • 地址总线:20位
  • 引脚功能复用
  • 单总线、累加器结构
  • 可控三态电路
  • 总线分时复用

流水线技术

从8086/8088开始,CPU采用了一种新的结构来并行地完成这些工作。执行单元负责执行指令,总线接口单元负责取指令、取操作数和写结果。它们独立地、并行地完成各自相应的工作。当EU执行指令时,BIU便“预取”下一条要执行的指令,所以大多数情况下取指令的时间可“省掉”,从而加快了程序的运行速度。这种结果称为流水线结构。

image.png

寄存器结构

image.png

一般而言:寄存器数量越多,CPU功能越强

通用寄存器

16位 可将高8位 低8位分别作为两个独立的8位寄存器使用。

  1. AX:常用于存放算术逻辑运算中的操作数。所有的I/O指令都使用累加器与外设接口传送信息。
  2. BX:常用来存放访问内存时的基地址。
  3. CX:在循环和串操作指令中用做计数器。
  4. DX:在寄存器间接寻址的I/O指令中存放I/O端口的地址。
  5. 在做双字长乘/除法运算时,DX与AX合起来存放一个双字长数(32位),DX存放高16位,AX存放低16位。

指针和变址寄存器

SP:在堆栈操作中用来存放栈顶的偏移地址,永远指向堆栈的栈顶。
BP:一般也常用来存放访问内存时的基地址,通常是与SS配对使用(BX通常是与DS配对使用)。
SI、DI:常在变址寻址方式中作为索引指针。在字符串操作指令中,要求用SI作为源变址寄存器,存放源操作数的偏移地址;DI作为目标变址寄存器,存放目标操作数的偏移地址。

段寄存器

CS: 代码段 内容是当前执行程序的指令代码段(的段基地址) 它和指令指针IP一起决定下一条所要执行指令的物理存储地址。
DS: 数据段 存放数据字符(的段基地址)
ES:附加段 在字符串操作时作为目标地址使用
SS:堆栈段 用于存放需要保存的数据和地址。如在子程序调用或响应中断时保存返回主程序的地址和进入子程序后将要改变其值的寄存器的内容。

每一个存储单元的地址都是由它所在逻辑段的段基地址和段内的偏移地址两部分构成。

段基地址:逻辑段起始地址的高16位

堆栈的操作遵循先进后出的原则,操作的地址由SS(堆栈段基地址寄存器)和SP(堆栈指针寄存器)的内容指定。

指令指针寄存器

IP: 用来存放下一条要执行指令的==偏移地址==

当CPU从CS段偏移地址为(IP)的内存单元中取出指令代码的一个字节后,IP自动加1,指向指令代码的下一个字节。

用户程序不能直接访问IP (指令的操作数不能是IP)。

物理地址 = 段地址 x 16 + 偏移地址
Physical Address=(CS×16)+IP

标志寄存器

也称程序状态字(PSW),16位寄存器,但只使用了其中9位
6 个状态标志 + 3个控制标志

image.png

状态标志

CF: 进位标志 有进/借则1 无则0
PF: 运算结果低8位中1的个数 偶则PF=1 奇则PF=0
AF: $AF=D_{3CY}$ 低四位向高四位有仅为或借位,则AF=1,否则AF=0 BCD运算则应调整
ZF: 当运算结果各位均为零时ZF=1,否则ZF=0
SF: $D_7=1$(byte) or $D_{15}=1$(word) 则为1 反映符号位(负为1)
OF: 算术运算的结果超出了带符号数的范围,即溢出时OF=1
8位带符号数的范围是-128+127,16位带符号数的范围是-32 768+32 767。
$OF=D_{7CY}\oplus D_{6CY}$ or $OF=D_{15CY}\oplus D_{14CY}$
机器把所有数都当无符号数运算,把结果都当有符号数来设置标志

无符号数加法 CF判断溢出
有符号数加法 OF判断溢出

  • 比较大小:
    • 对有符号数:
      • 无溢出时(OF=0):
        • 若 ZF=1,则两数相等
        • 若 ZF=0 且 SF=0,则被减数大
        • 若 ZF=0 且 SF=1,则减数大
      • 有溢出时(OF=1):
        • 若 SF=1,则被减数大
        • 若 SF=0,则减数大
    • 对无符号数:
      • 若ZF=1,则两数相等
      • 若CF=0,则被减数大
      • 若CF=1,则减数大

控制标志

控制CPU状态
DF: 控制字符串操作中地址的步进方向
DF=0 地址增址; DF=1 地址减址
IF: IF=1,允许CPU响应外部可屏蔽中断。IF=0,禁止CPU响应外部可屏蔽中断。
TF: TF=1,CPU处于单步工作方式,即CPU每执行一条指令就自动地发生一个内部中断,CPU转去执行一个中断程序,常用于程序调试,又称为陷井标志。TF=0,CPU正常执行程序。

8086引脚定义及功能

image.png

概述

8086和8088都具有40条引出线、采用双列直插式封装的集成电路芯片。
8086的许多引脚都具有双重定义和功能,采用分时复用方式工作,即在不同时刻,引脚上的信号具有不同的意义。

  • 每根引脚只传送一种信息
  • 引脚电平的高低代表不同的信号,如$M/\overline{IO}$ ,在为低电平时,表示当前访问的是存储器;为高电平时,则表示访问输入/输出接口。
  • 在不同的时间范围,引脚传送不同的信息,即分时复用。如 $AD0\sim AD15$,在某一时刻传送地址的低16位信号;另一时刻则传送16位数据。
  • 在引脚作为输入端或输出端时传送不同的信息。如$RQ/\overline{GT_0}$ 端,作为输入端时,输入的是总线请求信号;为输出端时,则输出总线请求允许信号。
  • 当CPU工作在不同模式时,引脚具有不同的名称和定义。8086微处理器有两种工作模式,最大模式最小模式。两种工作模式下的引脚定义有一些区别,上图所示右边括号中的引脚名称就是CPU工作在最大模式时对应引脚的含义。

地址/数据总线

  • 20位地址线 16位数据线 分时复用 共同占用20根引脚
  • AD0~AD15地址、数据分时复用的双向信号线,三态。当 $ALE=1$ 时,这些引脚上传输的是地址信号;当 $\overline{DEN}=0$  时,这些引脚上传输的是数据信号。
  • A16A19/S3S6 分时复用的地址/状态信号线,三态输出。在8086访问存储器时,读/写总线周期的第一个机器周期T1,从这4个引脚上送出最高4位地址A16A19。而在总线周期的其他机器周期,这4个引脚送出状态信号S3S6。这些状态信号里,S6始终为低电平;S5指示标志寄存器的中断允许标志位IP的状态;S4、S3的组合指示CPU当前正在使用的段寄存器。
  • CPU访问I/O端口时 这四根引脚不适用,全为低电平。
S4 S3 正在使用的段寄存器
0 0 ES
0 1 SS
1 0 CS or 未使用
1 1 DS

控制总线

  • 总共16根 2种工作模式共用的有8根

  • $MN/\overline{MX}$工作方式控制输入。为高电平时,表示CPU工作在最小模式;为低电平时,表示CPU处于最大模式。

  • $\overline{RD}$ 读选通信号,三态,低电平有效。有效时,表示CPU正在对存储器或I/O接口进行读操作。

  • $READY$ 高电平有效。有效时,表示存储器或I/O设备已准备好,CPU可以进行数据传送。

    • 若存储器或I/O设备未准备好,则READY信号为低电平。CPU在T3周期采样READY信号,若其为低电平,CPU自动插入等待周期Tw(1个或多个),直到READY变为高电平后,CPU才脱离等待状态,完成数据传送过程。
  • $INTR$ 可屏蔽中断请求输入信号,高电平有效。CPU在每条指令的最后一个周期采样该信号,以决定是否进入中断响应周期。可用软件屏蔽

  • $\overline{TEST}$ 测试信号输入引脚 低电平有效。当CPU执行WAIT指令时,每隔5个时钟周期对此引脚进行一次测试。若为高电平,CPU则继续处于空转状态进行等待,直到引脚变为低电平后,CPU才结束等待状态,继续执行下一条指令。

  • $NMI$ 非屏蔽中断请求输入信号,上升沿触发。这个引脚上的中断请求信号不能用软件屏蔽,CPU在当前指令执行结束后就进入中断过程。

  • $RESET$ 系统复位输入信号,高电平有效。为使CPU完成内部复位过程,该信号至少要在4个时钟周期内保持有效。当RESET返回低电平时,CPU将重新启动。

  • $\overline{BHE}/S_7$ 分时复用的控制 / 状态信号线,三态输出。在总线周期的第一个时钟周期输出 $\overline{BHE}$  信号,其他时钟周期输出状态信号 S7。$\overline{BHE}$信号的意义是:当$\overline{BHE}$ 为低电平时,表示可使用高 8 位数据线 AD8∼AD15;否则只使用低 8 位数据线 AD0~AD7。$\overline{BHE}$ 信号和地址信号一样需要锁存,它同最低位地址信号 A0 的状态组合在一起表示的功能见下表。

操作 $\overline{BHE}$ A0 使用的数据线
读或写偶地址的一个字 0 0 AD15~AD0
读或写偶地址的一个字节 1 0 AD7~AD0
读或写奇地址的一个字节 0 1 AD15~AD8
/ 1 1 无效

两种工作模式

最小模式:单微处理器模式,小系统所需全部控制信号都由CPU直接提供。
最大模式:多微处理机模式,系统中除了有8086 CPU之外,还可接其他处理器构成多微处理器系统。
当$MN/\overline{MX}=1$ :最小模式;
当$MN/\overline{MX}=0$:最大模式。
两种工作模式下的部分引脚具有不同的功能。
image.png

最小模式

  •  $\overline{INTA}$中断响应输出端。当 CPU 响应从 $\overline{INTA}$ 端输入的中断请求时,由 $\overline{INTA}$端输出两个连续的负脉冲,可用做外部中断源的中断向量码的读选通信号。
  • $ALE$ 地址锁存允许信号,三态输出,高电平有效。当它为高电平时,表明 CPU地址线上有有效地址。可利用它的下降沿将地址信号 $A0\sim A19$ 和 $\overline{BHE}$信号锁存到地址锁存器中。
  • $\overline{DEN}$数据允许信号,三态,低电平有效。该信号有效时,表示数据总线上有有效数据。它在每次访问内存或 I/O 接口以及在中断响应期间有效。它常用做数据总线驱动器的片选信号。
  • $DT/\overline{R}$数据传送方向控制信号,三态。用于确定数据传送的方向。高电平时,CPU 向存储器或 I/O 端口发送数据;低电平时,CPU 从存储器或 I/O 接口接收数据。此信号用于控制总线收发器的传送方向。
  • $M\overline{IO}$ 输入 / 输出 / 存储器控制信号,三态。用来区分当前操作是访问存储器还是访问 I/O 端口。引脚输出为高电平时,表示访问存储器;为低电平时,则表示访问 I/O 端口。
  • $\overline{WR}$写信号输出,三态。此引脚输出为低电平时,表示 CPU 正在对存储器或 I/O 端口进行写操作。
  • HOLD 总线保持请求信号输入,高电平有效。当某一总线主控设备要占用系统总线时,通过此引脚向 CPU提出请求。
  • HLDA 总线保持响应信号输出,高电平有效。这是CPU 对 HOLD 请求的响应信号,当 CPU 收到有效的 HOLD 信号后,就会对其做出响应:一方面使 CPU 的所有三态输出的地址信号、数据信号和相应的控制信号变为高阻状态 ( 浮动状态 );同时还输出一个有效的 HLDA,表示处理器现在已放弃对总线的控制。当 CPU 检测到 HOLD信号变低电平后,就立即使 HLDA变低电平,同时恢复对总线的控制。

image.png
image.png
image.png

8086存储器组织

存储容量的表示:表示存放二进制代码的个数,用包含多少个存储单元,而每个单元又包含多少位来表示。微机中常以:字(节)数×字(节)的位数来表示,如:1024×8b->1K×8b->1KB
字节数据:一个数存放一单元如:11H->00010H单元
字数据:用二个连续单元存放,规定由2个单元中地址较小的一个确定。 “低对低、高对高”的存放规律(小数端)
**机器指令(机器码)**:按字节顺序存放
如:MOV BX,AX 89C3H->00015H
字符串:从低地址开始,以ASCII码顺序存放如:‘ABC’->00017H

存储器访问

地址存储器与数据总线8位相连,地址存储器与数据总线8位相连。(小端模式)
image.png

存储器分段结构

  • 分段管理:内部寄存器都是16位,不能直接输出20位地址。把1M分成许多个段,每一段最多可寻址216=64K个单元。
  • 规定每个段的基地址的低4位为0,即能被16整除。段地址和偏移地址都是16位无符号数,所以分段并不是唯一的,可以相互重迭
  • CPU内部仅有四个段寄存器,所以在某个特定时刻仅能访问四个段。
  • 8086/8088存储器的分段结构:逻辑段长$2^{16}$=64k字节
    image.png

每个存储单元都可用地址的两种形式来表示

  • 物理地址:用唯一的20位二进制数表示,CPU访问时用物理地址。
  • 逻辑地址:段地址:偏移地址,程序中使用逻辑地址。如:03C0:0010
    段基址(段起始地址)=段地址<<4
    20位物理地址=段地址<<4+偏移地址
内存访问类型 默认段寄存器 可指定段寄存器 段内偏移地址来源
取指令 CS IP
取栈操作 SS SP
源串 DS CS,ES,SS SI
目的串 ES DI
BP用作基址寻址 SS CS,ES,DS 按寻址方式计算得到的有效地址
一般数据存取 DS CS,ES,SS 按寻址方式计算得到的有效地址

Exx 某可执行程序长度为2kB,已知CS=1063H,IP=0000H,该程序的末地址(物理地址)为

末地址=程序长度− 1=2K − 1=2048−1=0800H − 1=07FFH 末地址为:10630H+07FFH=10E2FH

数据存取

数据对准
当CPU读/写一个字时,若字单元地址从偶地址开始,只需访问一次存储器;若字单元地址从奇地址开始,则需访问两次存储器。

堆栈
堆栈(STACK)是由若干个连续存储单元组成的、操作时遵循先进后出(FILO) 原则的一个存储器区,主要用于暂存中断和子程序调用时的现场数据及返回地址。(保护现场)

入栈和出栈都必须是**双字节数据(16位)**。进行一次入栈操作,SP减2;进行一次出栈操作,SP加2
image.png

8086CPU时序

  • 微处理器是在统一的时钟信号CLK控制下,按照一定的时序来工作的。
  • 8086时钟频率为5 MHz,一个时钟周期等于200 ns。
  • CPU的时序分为两种:时钟周期总线周期
  • 8086CPU与内存或接口间的通信都是通过总线来进行的。通过总线对存储器或I/O接口进行一次访问所需的时间叫做一个总线周期,一个总线周期包括多个时钟周期
  • CPU每执行一条指令至少要访问一次存储器(取指令),即至少要进行一次读存储器操作,占用一个读总线周期。
  • 一条指令的执行需要若干个总线周期才能完成。而一个总线周期又由若干个时钟周期构成。
  • 每个时钟脉冲的持续时间就称为一个时钟周期。8086 CPU的一个读(或写)总线周期至少包括4个时钟周期。
  • 时钟周期越短,CPU执行的速度就越快。

image.png

  • 8086 的数据总线和部分地址总线是分时复用的。在一个总线周期内,先利用总线传送地址,将地址锁存后,再利用同一总线传送数据。
  • 8086 的数据总线和部分地址总线是分时复用的。在一个总线周期内,先利用总线传送地址,将地址锁存后,再利用同一总线传送数据。
  • 在 T1 期间,BIU 部分将要访问的存储单元或输入/输出端口地址送上总线
    • 若为读周期,则在第二个时钟周期将总线置为高阻缓冲状态,以使 CPU 有时间从输出地址方式转换为输人数据方式。之后在 T3 到 T4 期间从总线读入数据到 CPU
    • 若为写周期,则 CPU 就不必转换工作方式,在地址锁存后直接输出数据到总线上。
  • 只有在指令流队列出现2个以上空单元时要填补指令流队列或在执行指令的过程中需要申请一个总线周期时,BIU 部分才会进入执行总线周期的状态。在两个总线周期之间,有时可能会出现一些总线上没有信息传送的时钟周期,此时的总线状态称为空闲状态

image.png
最小模式下工作时序

  • 在 T1 期间,地址/状态复用信号线 A19/S6A16/S3 和地址/数据复用信号线 AD15AD0 分别送出地址 A19A16 和 A15A0,与此同时送出地址锁存允许信号 ALE。$\overline{BHE}$的状态由 $\overline{BHE}/S7$端输出。
  • 外部电路在 T1 后期利用 ALE 的下降沿把地址信号锁存到地址锁存器中,从而在锁存器的输出端得到完整的 20 位地址信号 A19~A0。
  • 读总线周期中,CPU 在 T3 到 T4 期间读入总线上的数据。在写总线周期中,CPU 从 T2 开始把数据送到总线上并维持到 T4。
  • 某些情况下,当内存或接口的速度比较慢,使得在 4 个时钟周期里不能完成读/写操作时,可通过时钟发生器产生一个低电平信号送到 8086 的 READY 端。8086 在每个总线周期的 T3 开始处都要检查 READY 的状态。若此时 READY 为低电平,则CPU不执行 T4,而是在 T3 之后插入一个等待时钟周期 Tw,以等待存储器或 I/O 接口完成读/写操作。
  • 在 Tw 的开始时刻,CPU 还要检查 READY 状态,若仍为低电平,则再插入一个 Tw。
  • 此过程一直进行到某个 Tw 开始时,READY 已经变为高电平,这时下一个时钟周期就是总线周期的最后一个时钟周期 T4。
  • 利用 READY 信号,CPU可以插入若干个 Tw,使总线周期延长,达到可靠地读/写内存和 I/O 接口的目的。

image.png
最大模式下工作时序

8086CPU寻址方式和指令系统

编程语言分:

  • 机器语言 二进制代码串
  • 汇编语言 指令助记符、符号地址和标号等
  • 高级语言

汇编语言程序开发过程:

  1. 编辑源程序生成*.ASM EDIT *.ASM
  2. 汇编生成目标程序*.OBJ: ML *.ASM;
  3. 连接生成可执行程序*.EXE: LINK *;
  4. 调试: DEBUG *.EXE
  5. 执行: 可执行文件名

操作数寻址方式

寻址方式:指令中给出操作数的方法。

立即数操作数: 立即寻址
寄存器操作数: 寄存器寻址
存储器操作数:
直接寻址
寄存器间接寻址
寄存器相对寻址
基址变址寻址
相对基址变址寻址

  1. 立即寻址
    操作数以常数的形式直接表示在指令中
1
2
3
MOV AL,5      ;AL<-5
MOV AX,1234H ;AX<-1234h
;AH=12H,AL=34H

image.png
立即数在内存的代码段内,指令执行时不需再存取存储器。
不能直接对段寄存器用立即数赋值
立即数不能作目的操作数
给存储器操作数[默认段寄存器为DS]用立即数赋值时,要指明WORD PTR或者BYTE PTR

1
MOV	BYTE PTR [300H], 5FH

以A~F打头的数字出现在指令中时,前面要加数字0,以免与变量名等符号混淆

1
MOV	BX, 0F77H
  1. 寄存器寻址
    (1) 格式:操作数是通用寄存器或段寄存器中的内容。
    寄存器可以是通用寄存器(AX,BX,CX,DX,SP,BP,SI,DI, AH,AL,BH,BL,CH,CL,DH,DL)、段地址寄存器( CS,SS,DS,ES)、标志寄存器
    1
    2
    3
    INC CX		;CX<-CX+1
    MOV SS,AX ;SS<-AX
    ADD CL,BH ;CL<-CL+BH
    注意点:
  • 操作数在CPU内的寄存器中,执行时间短;只访问寄存器,不访问内存
  • CS一般不要求用户赋值。否则语法无错,执行错
  • 两个操作数的长度必须一致

操作数在内存中除代码段以外的存储区中。
物理地址=段寄存器<<4bit+EA(有效地址或偏移地址)
确定物理地址的关键:从指令中找出EA(由若干部分合成),再确定用哪个段寄存器。

  1. 直接寻址
    格式:操作数表示成[立即数]、[变量名]或变量名
    MOV AX,[3000H]
    MOV AX,VALUE 或MOV AX,[VALUE]
    MOV AX,[VALUE+2] 或MOV AX,[VALUE]+2
    也可指明段寄存器(称段超越):
    MOV AX,ES:[2000H] ;“:”称修改属性运算符
    MOV AX,CS:VALUE

AX一般不用于间接寻址
物理地址
$$PA=DS(或段超越指定的段寄存器)<<4+立即数或变量的偏移$$

  1. 寄存器间接寻址
    格式:操作数表示成[BX]、[BP]、[SI]或[DI],寄存器内容是操作数的有效地址。

    1
    2
    3
    4
    5
    MOV	BX,[DI]
    MOV [SI],DS
    MOV [BP],AX
    MOV ES:[DI],AX
    MOV DX,DS:[BP]
  2. 寄存器相对寻址
    格式:操作数表示成[BX/BP/SI/DI+立即数/变量名],是直接寻址和寄存器间接寻址的组合。注意:变量的值是偏移地址。

    1
    2
    3
    4
    5
    6
    MOV	BX,[SI+1003H]
    MOV AL,[DI+TABLE]
    MOV AL,TABLE[BX]
    MOV AL,[BP]+TABLE
    MOV BX,ES:[SI+1003H]
    MOV TABLE[BP],AX

    物理地址:
    $$
    PA=DS<<4+(BX/SI/DI)+立即数或变量的偏移
    $$
    $$
    PA=SS<<4+(BP)+立即数或变量的偏移

$$

  1. 基址变址寻址
    格式:操作数表示成[BX/BP+SI/DI]

    1
    2
    3
    MOV	AX,[BX][DI]
    MOV CL,[BP+DI]
    MOV ES:[BX][SI],AH ;或 MOV [SI][BX],AH

    物理地址:(段寄存器缺省的情况)

    1
    2
    PA=DS<<4+BX+SI/DI
    PA=SS<<4+BP+SI/DI
  2. 相对基址变址寻址
    (1) 格式:操作数表示成[BX/BP+SI/DI+立即数/变量名]

    1
    2
    3
    4
    5
    6
    MOV	AX,COUNT[BX][SI]
    MOV AX,COUNT[SI][BX]
    MOV AX,[BX+COUNT][SI]
    MOV AX,[BX+SI+COUNT]
    MOV AX,[BX]COUNT[SI]
    ADD VALUE[BX][DI],DX;

    (2) 物理地址:(缺省情况)
    PA=DS<<4+BX+SI/DI+立即数或变量的偏移
    PA=SS<<4+BP+SI/DI +立即数或变量的偏移

  3. I/O端口寻址
    直接寻址:指令中直接给出8位端口地址,只能寻址256个端口
    IN AL/AX,8位立即数(PORT)
    OUT 8位立即数(PORT),AL/AX
    间接寻址:将16位端口地址放入DX
    MOV DX,16位立即数
    IN AL/AX,DX
    OUT DX,AL/AX
    IN AL, 20H ; [20H]->AL
    MOV DX, 210H
    OUT DX, AL ;AL->[210H]

  4. 隐含寻址
    将一个操作数隐含在指令码中的寻址方式就称为隐含寻址。

    例: 指令“MUL BL”的功能是把AL中的内容与BL中的内容相乘,乘积送到AX寄存器。即(AL)×(BL)→AX。这条指令隐含了被乘数AL及存放结果的累加器AX。

转移地址寻址

  1. 段内直接(相对)转移寻址
    短转移:8位偏移
    近转移:16位偏移

(1)格式:操作码 [SHORT 或NEAR PTR] 近标号。
JMP NEXT ;NEXT是一个短标号或近标号
CALL SUB ;SUB是一个段内子过程名
在DEBUG中不能用标号和过程名:
JMP 110H ; 执行CS:110处的指令
(2)转移的目标地址:
CS不变;IP=当前IP+指令中的8/16位偏移量
(3)注意:条件转移只能段内直接短转移。

  1. 段内间接转移寻址:

(1)格式:操作码 16位通用寄存器操作数/字类型存储器操作数
JMP BX
JMP AX
JMP SI
JMP TABLE[BX] ;TABLE是字变量
JMP WORD PTR[BP][DI]
JMP [BX] ;缺省表示是字

(2)转移的目标地址:
CS不变;IP=寄存器或连续2字节存储单元的内容

  1. 段间直接转移寻址:
    (1) 格式:操作码 [FAR PTR] 远标号
    JMP LABEL ;LABEL为远标号
    (2) 转移的目标地址: CS=标号的段地址;IP=标号的偏移地址

  2. 段间间接转移寻址:
    (1) 格式:操作码 FAR [PTR]或DWORD PTR 存储器操作数
    JMP DWORD PTR[BP][SI]
    JMP VAR ;VAR是双字变量

(2) 转移的目标地址:
CS=高2字节存储单元的内容;IP=低2字节存储单元的内容。

指令介绍

image.png

MOV

(1)格式:MOV DST(目的操作数),SRC(源操作数)
(2)执行:DST<-SRC
(3)操作数类型:立即数,寄存器操作数和存储器操作数

  • 使用 mov 指令读取内存时,只需提供偏移地址,而段地址是由 DS 寄存器提供的
  • 8086CPU 不支持直接把数据放进段寄存器,对 DS 赋值需要用通用寄存器中转,比如
    1
    2
    mov bx, 1000H
    mov ds, bx
  • 两个操作数不能全为存储器
  • 两个操作数不能全为段寄存器
  • DST不能是立即数
  • 源和目的类型必须一致
  • MOV 不影响标志位
  • 读写内存操作可以这样写:
    1
    2
    mov ax, [0]
    mov [0], cx

PUSH、POP

  • 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为$N(N≤64KB)$、地址连续、起始地址为16的倍数的内存单元当作栈空间来使用,从而定义了一个栈段
  • 栈底放在高地址处,栈顶在低地址处。
  • CPU 并不会知道我们将一段内存当作栈空间,CPU只认被 SS:SP 指向的内存单元中的值作为栈顶。
  • 栈里的数据是16位的,占两个内存单元
  • push指令执行时,先将SP=SP-2,再将要入栈的内容送入SS:SP指向的内存处,此时SS:SP指向新栈顶
  • pop指令执行时,先将SS:SP指向的数据送出,再SP=SP+2,此时SS:SP指向新栈顶
  • 8086CPU 不保证我们对栈的操作不会超界。这也就是说,8086CPU 只知道栈顶在何处,而不知道我们安排的栈空间有多大。这点就好像CPU只知道当前要执行的指令在何处,而不知道要执行的指令有多少。
  • 我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。
  • 每次传送的数据为16位,16位数据在堆栈中的存放顺序按照“高高低低”原则。
  • 用于保护数据:PUSH和POP指令保护和恢复寄存器和内存内容;CALL和RET或INT和IRET指令自动保护和恢复主程序断点处的段和偏移地址
  • 不影响标志位。

XCHG

image.png
格式:XCHG OPR1,OPR2(字节/字)
执行:OPR1<–>OPR2

Others

LEA(取有效地址)
LDS、LES (将双字指针送寄存器和DS/ES)
LAHF、SAHF(字节)
PUSHF、POPF(字)

算数

加法 ==ADD ADC INC== DAA AAA
减法 ==SUB SUBB DEC NEG CMP== DAS AAS
乘法 MUL IMUL AAM
除法 DIV IDIV CBW CWD AAD

上述指令基本上都影响标志位

逻辑

逻辑运算 AND OR XOR NOT TEST
移位 算术移位 SAL SAR
逻辑移位 SHL SHR
循环移位 ROL ROR
带借位的循环移位 RCL RCR

串操作

控制转移指令

无条件跳转 JMP
条件跳转 JZ/JE JNZ/JNE JS JNS JO JNO JP/JPE JNP/JPO
(无符号数比较) JC/JB/JNAE JNC/JNB/JAE JBE/JNA JNBE/JA
(有符号数比较) JL/JNGE JNL/JGE JLE/JNG JNLE/JG JCXZ
循环 LOOP
过程调用和返回 CALL RET
软件中断和返回 INT IRET

(1)格式:
JMP 短标号/近标号/远标号/字寄存器/字存储器/双字存储器
(2)不影响标志

例:JMP SHORT LABEL ;段内直接转移
JMP BX ; 段内间接转移 ,IP←BX
JMP [BX]; 段内间接转移 ,IP←(BX)
JMP FAR PTR LABEL ;段间间接转移
JMP DWORD PTR [BX] ;段间间接转移

处理器控制

标志位操作 CLC STC CMC CLD STD CLI STI
空操作 NOP
外同步操作 HLT ESC WAIT LOCK

指令周期

8086指令的执行速率是由晶振控制产生的时钟决定的,每条指令执行都需要几个时钟周期。
8086CPU的工作频率5MHZ,一个时钟周期T=1/5MHZ=0.2µs

复杂指令系统计算机( CISC)和精简指令系统计算机 (RISC)

复杂指令系统计算机(CISC)
Complex Instruction Set Computer
指令系统复杂:指令数目大于200条,寻址方式多,指令格式多。
指令串行执行:执行步骤多,需要多个时钟周期。
各种指令都可访问存储器。
有较多专用寄存器。
编译程序难以进行高效的代码优化。

精简指令系统计算机(RISC)
Reduced Instruction Set Computer
简化的指令系统
以寄存器-寄存器方式工作
采用流水技术
使用较多的通用寄存器以减少访存
采用优化编译技术
image.png

8086CPU的中断

中断的概念
CPU在正常执行程序的过程中,由于某种原因,使CPU暂停当前程序的执行,转去处理临时发生的事件,处理完毕再返回继续执行暂停的程序。 ——该过程称中断
image.png

  • 8086CPU具有一个简单而灵活的中断系统,可处理256种不同的中断请求。

  • 根据中断源是来自CPU内部还是外部,通常将所有中断源分为两类:外部中断源和内部中断源,对应的中断称为外部中断内部中断
    内部
    INT n 指令中断
    CPU执行INT n 指令后,产生中断类型号N=n 的中断;中断向量表地址=4×n
    例如:INT 21H,产生中断类型号为21H的中断,并从中断向量表的4×21H(即0:84H)单元取出中断服务程序的入口地址,转去执行
    除法错中断:除数为0或商超出寄存器范围。中断类型号N=0
    溢出中断指令INTO:在算术运算指令之后紧跟INTO指令,可检查溢出标志OF 。中断类型号N=4
    例如:测试加法的溢出
    MOV AX,0009H MOV AX,9000H
    ADD AX,0080H ADD AX,8000H
    INTO INTO
    : :
    无溢出,不中断,顺序 溢出,中断,转移

    单步中断
    当标志位TF=1时,每执行一条指令,CPU便产生中断类型号N=1的单步中断。单步中断用于 Debug调试程序
    断点中断
    当程序设置了断点时,CPU执行到断点处便产生中断类型号N=3的断点中断,并显示寄存器及单元内容,供Debug调试程序使用

  • 外部中断中,通过可屏蔽中断请求引脚输入的中断请求信号称作可屏蔽中断请求,对这种中断请求CPU可响应,也可不响应,具体取决于标志寄存器中IF标志位的状态。通过不可屏蔽中断请求引脚输入的中断请求信号称作非屏蔽中断请求,这种中断请求CPU必须响应。
    非屏蔽
    由引脚NMI引入,边沿触发,上升沿之后维持两个时钟周期高电平有效,中断类型号N=2;不受中断标志位IF影响
    引起原因:RAM奇偶校验错误、I/O通道扩展板奇偶校验错误、协处理器8087中断请求
    可屏蔽
    引脚INTR引入,电平触发,高电平有效
    中断标志位IF=1时允许中断;IF=0时禁止中断
    可用STI指令置位IF状态(开中断),CLI指令复位(关中断)
    引起原因:外部设备的中断请求

  • 硬件中断软件中断是指引起中断的原因,硬件中断是由外设引发的,软件中断是执行中断指令产生的

  • 中断响应:CPU在每条指令的最后一个周期检测中断信号引脚,当条件满足时,CPU响应中断,向外设发中断响应信号,并保护断点,转向中断服务程序

  • 中断向量表:中断服务程序的入口地址存放处

  • 中断优先级:为了解决多个中断同时申请时响应的先后顺序问题,系统将所有的中断划分为四级,以0级为最高,依次降低,不同级别的中断同时申请时,CPU根据级别高低依次决定响应顺序。

    • 0 级——除单步中断以外的所有内部中断。
    • 1 级——不可屏蔽中断。
    • 2 级——可屏蔽中断。
    • 3 级——单步中断。
  • 在实际系统中,常常遇到多个中断源同时请求中断的情况,这时 CPU 必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是排好中断处理的优先次序,即优先级,又称优先权。先响应优先级最高的中断请求。

  • 另外,当 CPU 正在处理中断时,也要能响应优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求即所谓多重中断的问题。

中断处理过程

可屏蔽中断

CPU响应可屏蔽中断的条件:

  • 外设提出中断申请
  • 本中断位未被屏蔽
  • 中断允许
    image.png

(1) CPU响应可屏蔽中断
当中断接口电路中中断屏蔽触发器未被屏蔽时,外设可发出中断请求信号
CPU在每条指令的最后一个机器周期的最后一个T状态采样INTR引脚,若有中断请求信号且CPU内部中断允许触发器是开放的(IF=1),则CPU响应中断
CPU向外设接口发两个中断响应信号INTA;外设收到第二个INTA,往数据线送中断类型号

(2) CPU转入中断服务过程

  • 从数据总线读取由外设输入的中断类型号
  • 标志寄存器PSW的值入栈;PSW中的中断允许标志IF和单步标志TF清0
  • 保护断点,下一条指令的段地址CS和指令指针IP的值入栈
  • 取中断向量表的中断入口地址,转入中断服务子程序;中断处理程序结束后,从堆栈依次弹出IP、CS和PSW,返回主程序断点处继续执行

非屏蔽中断请求NMI

CPU检测有NMI,不必判断IF标志,内部自动产生中断类型号N=2,并转入相应中断服务过程

软件(内部)中断INT n

由软件设定,不受IF标志影响,CPU内部形成中断类型号N=n ,并转入相应中断服务过程
image.png

中断向量表

也称中断服务程序入口地址表
中断向量表安排在内存的前1KB,即00000H~003FFH
每个服务程序入口地址CS:IP占用4个字节$(256*4=1KB)$,高字节存放段地址CS,低字节存放段内偏移IP,按中断类型号顺序存放
image.png

0~7->系统专用,
8~FH->八级硬件中断,
10H~1FH-> BIOS调用,
20H~3FH-> DOS使用,
40H~0FFH->可由用户程序使用。
image.png
(👆👆👆中断处理程序的STI可能是CLI)

主程序的编程

  1. 主程序中的初始化
    设置中断向量
    设置8259A的中断屏蔽寄存器的中断屏蔽位
    设置CPU中断允许位标志IF

  2. 硬件(外设接口)和CPU自动完成
    外设向CPU INTR端发中断请求
    执行完当前指令CPU发两个中断响应信号$\overline{INTA}$
    CPU取中断类型号n
    CPU将当前PSW、CS、IP入栈保护
    清IF、TF,禁止外部中断和单步中断
    从中断向量表取[4n]→IP,[4n+2]→CS
    转向中断服务子程序

中断服务子程序

中断服务子程序的编写

  • 保护现场,用PUSH指令将各寄存器值入栈
  • 若允许中断嵌套,则用STI开中断(置IF=1)
  • 执行中断处理程序
  • 用CLI关中断(清IF=0)
  • 给中断命令寄存器送中断结束命令EOI【仅针对8259】
  • 恢复现场,用POP指令将各寄存器值退栈恢复
  • 用中断返回指令IRET返回主程序

中断响应时序

image.png

中断优先级和中断嵌套

image.png

多中断源的中断流程增加了屏蔽本级和低级中断开中断以允许嵌套
image.png

软件查询确定中断优先级

软件查询中断方式,是将各个外设的中断请求信号通过或门后,送到 CPU 的 INTR 端,同时把几个外设的中断请求状态位组成一个端口,赋以端口号,如下图所示。任一外设有中断请求,CPU 响应中断后进入中断处理子程序,用软件读取端口内容,逐位查询端口的每位状态,查到哪个外设有请求中断,就转入哪个外设的中断服务程序。查询程序的次序,决定了外设优先级别的高低,先测试的中断源优先级别最高。当然在软件查询程序中也可用移位或屏蔽法来改变端口各位的测试次序,但查询时间较长,对中断源较多的情况不合适。
image.png

硬件查询确定优先级——菊花链法

越靠近CPU的外设,优先级越高
image.png
image.png

矢量中断优先级

由优先级管理逻辑判别最高优先级中断请求
image.png

中断嵌套

高优先级的中断源能中断低优先级的中断处理
image.png

中断实验编程说明

  1. 中断初始化
    1
    2
    MOV  BL, IRQNum; 	取得中断矢量号
    CALL INT_INIT; 初始化中断向量表
1
2
3
4
5
6
7
8
9
10
11
12
13
INT_INIT   PROC [FAR]	;FAR可省略
CLI
MOV AX, 0
MOV ES, AX
XOR BH, BH
SHL BX, 1
SHL BX, 1
MOV AX, OFFSET MYIRQ
MOV ES:[BX], AX
MOV AX, SEG MYIRQ
MOV ES:[BX+2], AX
RET
INT_INIT ENDP
  1. 中端服务程序
    1
    LEDON	   DB	00000001b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MYIRQ 	PROC [FAR]
PUSH DX
PUSH AX
; 读取C口数值,并把LEDON的值输出到PC7。
MOV DX, L8255PC ; DX指向C端口
IN AL, DX ; 读取C口数值
AND AL, 01111111b ; 清除PC7
XOR [LEDON], 00000001b ; LED灯状态取反
JZ ISROut
OR AL, 10000000b ; 置位PC7
ISROut: OUT DX, AL ; 更新PC端口
POP AX
POP DX ; 取回DX
IRET
MYIRQ ENDP

8086汇编语言程序设计

汇编语言程序格式

  1. 两种汇编程序开发模板
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	.MODEL  SMALL
    .8086
    .data
    DA1 DB 'Welcome to this course!',0DH,0AH
    DB 'This is a sample program.','$'
    .stack 100h
    .code
    .startup ;初始化指令
    MOV AH,9 ;DOS 9号功能调用
    MOV DX,OFFSET DA1
    INT 21H
    .EXIT 0 ;程序结束,形成返回DOS指令
    END

  • .MODEL SMALL 指定了程序的内存模型为小型,适用于小型程序。
  • .8086 指定了程序目标处理器为8086。
  • .data 段定义了要显示的字符串数据。
  • .stack 100h 指定了堆栈段的大小为256字节。
  • .code 段包含了程序的主要执行代码。
  • .startup 是一个宏指令,用于初始化程序。
  • MOV AH,9 和 MOV DX,OFFSET DA1 准备了DOS的9号功能调用,用于显示字符串。
  • INT 21H 执行DOS调用。
  • .EXIT 0 结束程序并返回DOS。
  • END 指示程序结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DATA SEGMENT ;数据段
DA1 DB 'Welcome to this course!',0DH,0AH
DB 'This is a sample program.','$'
DATA ENDS ;数据段结束
STACK SEGMENT ;堆栈段
ST1 DB 100 DUP(?) ;在数据段中定义一个名为 `ST1` 的数组,该数组包含100个字节,每个字节的初始值都是括号内的内容
STACK ENDS ;堆栈段结束
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
START: MOV AX,STACK ;送堆栈段段地址
MOV SS,AX
PUSH DS ;返回DOS用
MOV AX,0
PUSH AX
MOV AX,DATA ;送数据段段地址
MOV DS,AX
MOV AH,9 ;DOS 9号功能调用
MOV DX,OFFSET DA1
INT 21H
RET
MAIN ENDP
CODE ENDS ;代码段结束
END START ;程序结束

  • DATA SEGMENT 开始数据段,定义了要显示的字符串数据。在8086汇编语言中,SEGMENT 和 ENDS 指令用于定义一个段的开始和结束。DB 指令用于定义字节型数据,意味着“Define Byte”。在这里,DB 后面跟着的是要存储的字符串 'Welcome to this course!',后面紧跟两个特殊字符 0DH 和 0AH
  • 另一个字符串 'This is a sample program.',并在字符串的末尾添加了一个 '$' 字符。在DOS中断调用中,'$' 被用作字符串的结束标志,特别是在使用DOS的9号功能调用(即显示字符串)时。这意味着当DOS遇到 '$' 字符时,它知道字符串已经结束,不会继续读取更多的数据。
  • 'Welcome to this course!' 是一个字符串常量,存储在数据段中。
  • 0DH 和 0AH 是两个十六进制数,分别代表回车(Carriage Return, CR)和换行(Line Feed, LF)字符。在DOS和Windows系统中,这两个字符组合用来表示新的一行的开始。在ASCII码中,0D 对应13(CR),0A 对应10(LF)。
  • STACK SEGMENT 定义了堆栈段,为堆栈预留了100字节的空间。
  • CODE SEGMENT 开始代码段,包含程序的主要执行代码。
  • ASSUME 指令关联了段寄存器和相应的段。
  • MAIN PROC FAR 定义了一个远过程。
  • MOV AX,STACK 和后续指令初始化堆栈。
  • MOV AX,DATA 和后续指令设置数据段地址。
  • MOV AH,9 和 MOV DX,OFFSET DA1 准备DOS的9号功能调用。
  • INT 21H 执行DOS调用。INT 是中断的缩写,21H 是DOS中断的编号。当这条指令执行时,CPU会暂停当前程序的执行,转而执行与21H 中断号相关联的中断处理程序,即DOS的内部功能。在这个例子中,由于AH 寄存器的值为9,DOS会执行显示字符串的功能,字符串的地址则通过DX 寄存器提供。
  • RET 返回到DOS。
  • END START 指示程序结束。
  1. 指令性语句

指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码。语句格式为:

标号:指令助记符  操作数,操作数;注释

标号——符号地址,后跟“:”,使用英文大小写字母阿拉伯数字和特殊字符,第一个非数字,≦31个
助记符——与指令对应,不可省
操作数——参加运算的数据,用常数、变量、标号、寄存器名或表达式
注释——说明一指令或程序功能。可省略。用“ ;”隔离

  1. 伪指令语句

伪指令语句无对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,它可完成数据定义,存储区分配,段定义,段分配,指示程序结束等功能。语句格式为:

名字  伪指令指示符  操作数,操作数;注释

名字——赋予伪指令的名称,名字后不允许带冒号“:”,可省略。名字常为变量名、段名、过程名、符号名等。
指示符——汇编程序MASM规定的符号,各种定义语句后详述。
操作数——按伪指令要求可有可无,操作数可以是常数、变量、字符串、表达式等。
注释——功能和使用与指令性语句相同。

Clip_2024-03-27_16-19-53.png

  1. 数据项

常数、变量和标号是三种基本数据项。

1.常数——二进制 (B)、八进制 (Q或O) 、十进制 (D) 、十六进制(H) 、 ASCll码字符串(用单引号‘abcd ’)。
2.变量
常指存放在M中的数值,程序运行中可修改。包含三个属性:
**段值(SEGMENT)**——变量所在段的段基址。
**段内偏移地址(OFFSET)**——变量地址与所在段首地址之间的地址偏移字节数。
**类型(TYPE)**——变量中每个元素包含的字节数,有字节变量(BYTE),字变量(WORD)及双字变量(DWORD)等
3.标号
指令语句的地址的符号表示,可作为JMP指令和调用指令CALL的目标操作数,以确定程序转向的目标地址。包含三个属性:
**段值(SEGMENT)**——标号所在段的段基址。
段内偏移地址(OFFSET)——标号地址与所在段的段首址之间的偏移地址字节数
**类型(TYPE)**——指转移指令中标号可转移的距离。近标号(NEAR),远标号(FAR)。
NEAR—指针长度2字节; FAR —指针长度4字节

MASM中的表达式

表达式(运算对象、运算符)→汇编运算→结果作为语句中操作数

运算对象:常数、变量、标号
运算结果:常数或存储器地址(变量或标号)

8086汇编语言中的运算符
算术运算符 逻辑运算符 关系运算符 分析运算符 综合运算符
+(加法) AND(与) EQ(相等) SEG(求段基址) PTR
-(减法) OR(或) NE(不相等) OFFSET(求偏移量) THIS
*(乘法) XOR(异或) LT(小于) TYPE(求变量的类型) SHORT
/(除法) NOT (非) GT(大于) SIZE(求字节数) HIGH
MOD(取余) LE(小于或等于) LENGTH(求变量长) LOW
SHL(左移) 逻辑左移 GE(大于或等于)
SHR(右移) 逻辑右移
所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。若对地址运算,通常是在标号上加/减某一个数字量,对地址乘是没有意义的

逻辑运算符是按位运算的,只能对常数进行运算,得到结果也是常数。
区分逻辑运算符、指令运算符
image.png

关系运算符所连接两操作数必为两数据或同一段内的两个存储单元的地址
运算结果:真—0FFFFH,假—0

类型/距离  PTR  变量或标号

将PTR左边的类型属性赋给右边的变量或标号。PTR本身并不分配存储单元,仅给已分配的存储单元赋予新的属性,这样可以保证运算时操作数类型的匹配,常与类型BYTE、WORD、NEAR、FAR等连用。

优先级 运  算  符
1 ( ),[ ],< >,•,LENGTH,WIDTH,SIZE,MASK
2 PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:
3 HIGHT,LOW
4 *, / , MOD, SHL, SHR
5 +, -
6 EQ, NE, LT, LE, GT, GE
7 NOT
8 AND
9 OR, XOR
10 SHORT

伪指令语句

一、数据定义语句
格式1:变量名 助记符 操作数,操作数,.. ;注释
格式2:变量名 助记符 n DUP (操作数,操作数,..);注释
助记符—— DB 定义字节 DW 定义字
DD 定义双字 DQ 定义四字
DT 定义十字节
变量名——符号表示,可省略。作其后第一字节符号地址。
操作数——常数,字符串,变量,标号,表达式
n DUP() ——n为整数,表示括号中操作数重复次数。

注意:
定义多字节字符串用DB,DW只允许包含两个字符。
操作数用“?”定义不确定值变量,以保留存储空间存放运算结果。新版Proteus支持“?”
用DW和DD可以将变量或标号逻辑地址存入存储器。当用DD来定义时,原变量或标号的偏移地址存入低位字中,原变量或标号的段基址存入高位字中。

二、表达式赋值语句

  1. 赋值语句EQU
    格式: 符号 EQU 表达式

用来给变量,标号,常数,指令,表达式等定义一个符号名,在同一个程序模块中不能重新定义。

PURGE语句可以解除对某一标号的赋值,使它在后面可以重新定义。

COUT EQU CX ;将COUT作为寄存器CX的同义名
PURGE COUNT ;COUNT不再代替CX

  1. 等号语句 =
    等号语句“=”与EQU语句具有相同功能,区别仅在于EQU中左边的标号不允许重新定义,而用“=”定义的语句允许重复定义。

三、段定义、分配语句

1
2
3
.stack 100h   ;100h为堆栈空间的大小
.code
.startup ;初始化指令

四、过程定义语句
格式:过程名 PROC 属性
….
RET N
过程名 ENDP
定义一个过程,主程序可以用CALL指令调用它。
过程名——不可缺省。过程名具有三种属性:

  • (1) 段属性:为该过程所在段的段基址。
  • (2) 偏移地址属性:指该过程第一个字节与段首址之间距离字节。
  • (3) 距离属性:为NEAR或FAR。
    PROC…ENDP——成对出现,不可缺省。
    RET N——过程内部的返回指令。RET后面的N为弹出值,可以缺省,表示从过程返回以后,堆栈中应有N个字节的值作废(从栈顶开始),N必须为正偶数

五、程序开始和结束语句

  1. NAME 程序名 ;为源程序目标模块赋名
  2. TITLE 文本名 ;文本名赋予目标模块,作用通NAME
  3. ORG 表达式 ;设置地址指针,指定下个语句起始偏移地址
  4. END 标号名 ;标记汇编程序结束,位于源程序最后一行

DOS和BIOS调用

软件中断指令 功  能
INT 20H 程序正常退出
INT 21H 系统功能调用
INT 22H 结束退出
INT 23H Ctrl+Break处理
INT 24H 出错退出
INT 25H 读磁盘
INT 26H 写磁盘
INT 27H 驻留退出
DOS系统功能调用(INT 21H)分别实现设备管理、文件读写、文件管理和目录管理等功能。每个子程序对应一个功能号,所有的系统功能调用的格式是一致的,按下面4步进行:
(1) 系统功能号送到AH寄存器中
(2) 入口参数送到指定寄存器中
(3) 由INT 21H指令执行功能调用
(4) 根据出口参数分析功能调用执行情况
AH 功   能 入口参数 出口参数
2 显示一个字符,检测Ctrl-Break DL=字符 光标随字符移动
6 直接控制台I/O,不检测Ctrl-Break DL=FF(输入)

DL=字符(输出)
光标随字符移动
9 显示字符串 DS:DX=串地址;’$’结束字符串 光标随字符移动

存储系统

存储器基本原理

RAM:随机访问存储器

  • SRAM:静态存储器(Static random access memory)
  • DRAM:动态存储器(Dynamic random access memory)
    ROM:只读存储器(Read only memory)

SRAM

  • T1~T4构成双稳态触发器
  • 数据读出时,X、Y译码线为高
  • 数据写入时,I/O数据准备好,然后X、Y译码线为高
  • 特点:速度快、电路复杂
    image.png
    引脚信号
    image.png
    ADD
  • 地址信号,在芯片手册中通常表示为A0,A1,A2,…
    $\overline{CS}$
  • 芯片选择,低电平时表示该芯片被选中
    $\overline{WE}$
  • 写允许,低电平表示写操作,高电平表示读操作
    Dout
  • 数据输出信号,在芯片手册中通常表示为D0,D1,D2,…
    Din
  • 数据输入信号,也表示为D0,D1,D2,…
    $\overline{OE}/\overline{G}$
  • 数据输出允许信号
    image.png

读周期:

  • 地址有效->$\overline{CS}$有效->数据输出->$\overline{CS}$ 复位->地址撤销
    写周期:
  • 地址有效->$\overline{CS},\overline{WE}$有效->数据有效->$\overline{CS},\overline{WE}$复位(数据输入)->地址撤销

DRAM

动态RAM是以MOS管源极电容是否充有电荷来存储信息的,其基本单元由T管寄生电容Cs组成。

由于只用一个MOS管,所以功耗很低,存储容量可做得很大。

电容通过MOS管的栅极和源极会缓慢放电而丢失信息,因此必须定时对电容充电——刷新

ADD:地址信号,在芯片手册中通常表示为A0、A1、A2、…
$\overline{CS}$:芯片选择,低电平时表示该芯片被选中。
$\overline{WE}$ :写允许,低电平表示写操作,高电平表示读操作
Dout:数据输出信号,在芯片手册中通常表示为D0、D1、D2、…
Din:数据输入信号,也表示为D0、D1、D2、…。
OE:数据输出允许信号。
$\overline{RAS}$:行地址选通信号。
$\overline{CAS}$:列地址选通信号

image.png
Intel2164内含64k地址单元,通过行、列两部分地址,只需8位地址线。

无片选信号,行选通信号可认为是片选信号:先行8位、再列8位选通,可选中216=64k存储单元。

读周期:
行地址有效->行地址选通->列地址有效->列地址选通->数据输出->行选通、列选通及地址撤销

写周期:
行地址有效->行地址选通->列地址、数据有效->列地址选通->数据输入->行选通、列选通及地址撤销

刷新周期:(only $\overline{RAS}$ refresh)
刷新行地址有效->$\overline{RAS}$有效->刷新行地址和$\overline{RAS}$撤销

刷新周期:($\overline{CAS}$ refresh before $\overline{RAS}$)
$\overline{CAS}$有效->$\overline{RAS}$有效->$\overline{CAS}$撤销->$\overline{RAS}$撤销

刷新周期:(隐含式刷新)

(在访存周期中)$\overline{RAS}$撤销->$\overline{RAS}$有效

EPROM

  • 可擦除可编程只读存储器
  • 顶部开有一个圆形的石英窗口,用于紫外线透过擦除原有信息
  • 一般使用专门的编程器(烧写器)进行编程
  • 编程后,应该贴上不透光封条
  • 出厂未编程前,每个基本存储单元都是信息1,编程就是将某些单元写入信息0

EEPROM/E2PROM

  • 电可擦除可编程只读存储器
  • 在系统中是电可擦除的,擦写的电压比读入电压要高,通常为12V,擦写速度在毫秒量级,但仍比普通的RAM慢很多
  • 不同厂家的EEPROM时序会有不同,要选择相应的EEPROM才能与芯片配合

Flash存储器

  • 由E2PROM技术演化而来,读写速度更快、容量更大、成本更低。
  • 必须以块为单位而非以字节为单位进行信息更新
  • 分为NOR型和NAND型
  • NOR型:速度快,适合存储程序代码,支持程序直接在Flash存储器中运行
  • NAND型:容量大,集成度高

存储器的连接

  • 地址总线的连接
    • CPU的地址总线宽度与存储器相同
    • CPU的地址总线宽度大于存储器的地址总线宽度
  • 数据总线的连接
    • CPU的数据总线宽度与存储器相同
    • CPU的数据总线宽度大于存储器的数据总线宽度
  • 控制总线的连接
    • 存储器译码

存储器扩展方法

  1. 位扩展
  • 芯片的地址线数:18
  • 存储器的结构256kb×32
  • 容量:1MB
  • CPU的有效地址位数:20位字节地址
  • 每个芯片的地址范围相同
    image.png
    A0、A1用于选择32位的哪个字节
    $2^{18}=2^8+2^{10}=256*1kb$
    位扩展是让数据位数增加,但是存储单元的个数不变(地址线的条数不增加)
  • 芯片地址线全部并联且与地址总线相应的地址线相连接;
  • 片选信号(CE (Chip Enable))并联,接地址译码器的输出端(这里直接用CPU的M/IO管脚);
  • 芯片的数据线分高低部分,分别与数据总线相应位连接(这里由于是1位扩展到8位所以不用分高低位)。
  1. 字扩展
    存储器芯片引脚数: 18
    存储器结构:$256kB\times8$
    CPU有效地址线数:21
    每个芯片的地址范围不同

image.png

此图中,$A_0\sim A_{17}$ 用来选择一个256K的芯片,$A_{20}\sim A_{18}$ 连接译码器,译码器接受地址线上的型号,并根据信号选择特定的内存芯片,所以能选择8个中的任意一个。

以下说明与图不对应,图A17-0, A20-A18用于片选,备注:A10-A0, A11-A12译码片选

字扩展是存储单元数的扩展,要增加地址线的条数,而与数据线无关
由2K的芯片构成8K的模块,需要四块;相应的,需要多出两根地址线来选择这四块芯片。所以芯片固有地址线并联到地址总线的相应地址线上(A10-A0),扩展地址线(A11-A12)接译码器的输入端产生译码器的输出,用来作为四个芯片的片选信号。芯片的读写控制信号连接总线上的存储器控制信号。

  1. 字位扩展

image.png

存储器译码方法

  • 全译码

    • 所有CPU高位地址线均参与对存储单元的译码寻址
    • 低位地址线对芯片内各存储单元的译码寻址:片内译码
    • 高位地址线对存储芯片的译码寻址:片选译码
    • 每个存储单元的地址都是唯一的:不存在地址重复
  • 部分译码

    • 部分高位地址线参与对存储单元的译码寻址
    • 存在地址段内容重叠:每个单元有多个地址
  • 字选择

    • 以字为单位访问存储器
    • 位数等于存储器的字长
    • 低位地址不需与存储器相连
  • **** 字节选择

    • 可以字节为单位访问存储器
    • 低位地址用于选择字节

image.png

8086CPU的存储器扩展

连接部分主要由三个部分组成:
1.地址线 2.数据线 3.控制线

连接中需要考虑的问题:

  • CPU总线的负载能力
  • CPU的时序和存储器存取速度之间的配合
  • 存储器的地址分配和片选
  • 控制信号的连接

线性选择方式

只有存储芯片的片选信号CS有效,才能对芯片进行操作
连接方式:

  • 地址总线低13位与存储芯片地址线相连
  • CS端与某一位高位地址线(A13)相连
  • 1#芯片地址:0000~1FFFH、4000 ~5FFFH、……
  • 2#芯片地址:2000~3FFFH、6000 ~7FFFH、……
    Clip_2024-03-27_21-15-53.png

全译码

  • 所有的系统地址线均参与对存储单元的译码寻址
  • 包括低位地址线对芯片内各存储单元的译码寻址(片内译码),高位地址线对存储芯片的译码寻址(片选译码)
  • 采用全译码,每个存储单元的地址都是唯一的,不存在地址重复
  • 译码电路可能比较复杂、连线也较多
  • 常用译码器:74LS139、74LS138、74LS154

片选端译码小结

  • 存储芯片的片选控制端可被高位地址线单独选用或经译码而得
  • 在系统中,与地址相关的有:地址空间的选择(接系统的M/$\overline{IO}$)和高位地址的译码选择(与系统的高位地址线相关联)
  • 对存储芯片通过片选无效可关闭内部选通,以降低功耗
  • 芯片$\overline{OE}$与系统的读命令线相连
    • 当芯片被选中、且读命令有效时,存储芯片将开放并驱动数据到总线
  • 芯片$\overline{WE}$与系统的写命令线相连
    • 当芯片被选中、且写命令有效时,允许总线数据写入存储芯片

典型接口芯片原理和应用

简单I/O接口电路及其应用

接口概述

  • 接口的功能

    • 设置数据缓冲器以解决两者速度差异所带来的不协调问题
    • 设置信号电平转换电路
    • 设置信息转换逻辑以满足对各自格式的要求
    • 设置时序控制电路来同步CPU和外设的工作
    • 提供地址译码电路,使CPU在同一时刻只能选中某一个I/O端口
  • 各种接口电路

    • 缓冲器(Buffer)和锁存器(Latch);
    • 可编程中断控制器8259A;
    • 可编程计数器/定时器8253;
    • 可编程外围接口芯片8255A;
    • 串行通信和可编程接口芯片8251A;
    • A/D和D/A转换芯片。
  • 把信息从外部设备送入 CPU 的接口称为输入接口,而把信息输出到外部设备的接口则称为输出接口

  • I/O接口电路是外设和计算机之间传送信息的交换部件,也称界面,它使两者之间很好地协调工作。外设一般都要通过接口电路才能和主机相连。
    CPU<—>接口<—>外设

  • 在需要从外设输入数据时,通常外设的速度相对于 CPU 要慢得多,这意味着数据在外部总线上保持的时间相对较长,所以要求输入接口必须要具有对数据的控制能力,即要在外部数据准备好,CPU 可以读时才允许将数据送上系统数据总线。

  • 大多数外设都具有数据保持能力(即 CPU 没有读取时,外设能够保持数据不变),通常可以仅用三态门缓冲器(简称三态门)作为输入接口。当三态门的控制端信号有效时,三态门导通,该外设就与数据总线连通,CPU 将外设准备好的数据读入;当控制端信号无效时,三态门断开,该外设就从数据总线脱离,数据总线又可用于其他信息的传送。

  • 对没有数据保持能力的外设,可在外设与接口之间增加一个锁存器,用外设提供的数据准备好信号把数据保存到锁存器中。

  • 数据输出时,同样应考虑外设与 CPU 速度的配合问题。要使数据能正确写入外设,CPU 输出的数据一定要能够保持一段时间。一般 CPU 送到总线上的数据只能保持几个微秒甚至更短的时间。相对于慢速的外设,数据在总线上几乎是一闪而逝。因此,要求输出接口必须要具有数据的锁存能力,这通常是由锁存器来实现的。CPU 输出的数据通过总线锁存到锁存器中,并一直保持到被外设取走。

  • 三态门缓冲器和锁存器的控制端一般与 I/O 地址译码输出信号线相连,当 CPU 执行 I/O 指令时,指令中指定的 I/O 地址经译码后即可使控制信号有效,打开三态门(对外设读时)或将数据锁入锁存器(对外设写时)。

简单输入输出接口芯片

三态缓冲器芯片 74LS244 & 74LS245

  • 连接在总线上的缓冲器都具有三态输出能力。
    • 使能→在使能控制端EN(或G)作用一个低电平脉冲→使内部的各缓冲单元[寄存器]接通→数据输出0或1的透明状态[数据被送上总线]。
    • 高阻态:当使能脉冲撤除后,它处于高阻态。这时,各缓冲单元像一个断开的开关,等于将它所连接的电路从总线脱开。
  • 除缓冲作用外,缓冲器还能提高总线的驱动能力

74LS244——单向数据缓冲器
Clip_2024-04-01_10-55-38.png

  • 8个三态缓冲单元,分成两组,分别由门控信号$\overline{1G}$和$\overline{2G}$控制。$\overline{1G}$和$\overline{2G}$为低电平时,数据传送;高电平时,输出高阻态。
  • 单向缓冲器,只能从A端到Y端。

74LS245——双向数据缓冲器

Clip_2024-04-01_11-04-30.png

  • 8个双向、三态缓冲器。
  • 门控信号输入端$\overline{G}$ 。
  • 方向控制端DIR,高电平时,数据从A端传向B端;低电平时,从B端传向A端。

锁存器74LS373

锁存器具有暂存数据的能力,能将数据锁住,在输出控制信号的作用下将数据传送出去。74LS373是一种常用的8D锁存器,它可以直接挂在总线上,并具有三态总线驱动能力

  • 两个控制输入端:输入使能端G和允许输出端$\overline{OE}$。
  • $\overline{OE}$为低时:G为高时,D端数据到O端;G为低时,O端将是前面锁存的数据,不受D端的变化影响。
  • $\overline{OE}$为高时:输出将呈高阻态。
$\overline{OE}$ G D O
X 锁存
X X 高阻态
image.png

I/O端口及其寻址方式

  • CPU与外设通信时,传送的信息主要包括数据信息、状态信息和控制信息。

  • 这些信息分别进入不同的寄存器,通常将这些寄存器和它们的控制逻辑统称为I/O端口(Port),CPU可对端口中的信息直接进行读写。
    image.png

  • 数据端口(Data Port)用来存放CPU与外设之间交换的数据,长度一般为1-2个字节,主要起缓冲作用。

  • 状态端口(Status Port)用来指示外设的当前状态。每种状态用1位表示,由CPU读取。几种最常用的状态位有:

    • 准备就绪位(Ready)
      • 输入端口:1:数据寄存器已准备好数据,等待CPU读取,取走后清0。
      • 输出端口:1:输出数据寄存器已空,可以接收下一个数据;新数据到达后,位清0。
    • 忙碌位(Busy)
      表明外设是否能接收数据。1:外设忙,暂时不允许CPU送新的数据过来。0:外设已空闲,允许CPU发送下一个数据。
    • 错误位(Error)
      1:指示在数据传送过程中出现错误。CPU进行相应的处理,如重新传送或中止操作等。
  • 命令端口(Command Port)也称为控制端口(Control Port),用来存放CPU向接口发出的各种命令和控制字,以便控制接口和设备的动作。

    • 常见的命令信息有启动位、停止位、允许中断位等。
    • 接口芯片不同,控制字的格式和内容是各不相同的,常见的控制字有方式控制字、操作命令字等。
  • 在微机系统中,CPU通过接口和外设交换数据时,只有输入(IN)和输出(OUT)两种指令,所以只能把状态信息和命令信息当作数据来传送,并且将状态信息作为输入数据,控制信息作为输出数据,于是三种信息都可以通过数据总线来传送了(三个不同端口的寄存器)。

  • I/O端口的寻址方法

    • 存储器映像寻址方式(Memory Mapped I/O):
      • 将I/O端口地址作为存储器地址,采用存储器访问指令进行操作
    • I/O单独编址方式:
      • 采用IN、OUT指令操作

CPU与外设间的数据传送方式

软件实现:程序控制方式、中断方式。
硬件实现:DMA方式。

  • 查询方式效率低。查询方式须反复查询外设的状态,查询等待过程会占去CPU的绝大部分时间,而真正用于数据交换的数据却很少,使CPU的利用率变得很低。为了提高CPU的利用率和进行实时数据处理,CPU常采用中断方式与外设交换数据。
  • 中断方式效率高。采用中断方式,CPU执行主程序,只有当输入设备将数据准备好,或输出设备的数据缓冲器已空时,才向CPU发出中断请求。
  • CPU响应中断后,暂停执行当前的程序,转去执行管理外设的中断服务程序,用输入或输出指令在CPU和外设之间进行一次数据交换。
  • 等输入/输出操作完成之后,CPU又回去执行原来的程序。

程序控制方式-无条件方式(同步传送方式)

  • 最简单的传送方式,主要用于对简单的外设进行操作,或者外设的定时是固定的或已知的场合;
  • 程序可以不必检查外设的状态,而在需要进行I/O操作时,直接执行I/O指令。

程序控制方式-条件传送(查询式传送)

  • 一般情况下,CPU在执行I/O时,很难保证输入设备总是准备好数据,或是输出设备已经处在接收数据状态。CPU必须先确认外设已处于准备传送数据状态,才能进行传送。
  • 确认过程:CPU必须先执行一条输入指令,从外设的状态口读取当前的状态。如果外设未准备好或处于忙碌状态,则程序要转回去反复执行读状态指令,不断检测外设的状态;直到外设准备就绪为止,然后CPU才可以进行正常的I/O操作。

查询式输入:

1
2
3
4
5
6
7
8
9
10
11
12
MOV BX,0;XOR BX, BX; 初始化地址指针BX
MOV CX,COUNT_1 ;字节数
READ_S1: IN AL,PORT_S1 ;读入状态位
TEST AL,01H ;数据准备好否?
;TEST按位与 判断最低位是否为1,不为1则ZF=1
JZ READ_S1 ;否,循环检测(Jump if zero) ZF=1时跳转
IN AL,PORT_IN ;已准备好,读数据
MOV [BX],AL ;存到内存缓冲区
INC BX ;修改地址指针
LOOP READ_S1 ;未传送完,继续传送
...

查询式输出:

1
2
3
4
5
6
7
8
MOV CX,COUNT_2	;传送的字节数
READ_S2: IN AL,PORT_S2 ;读入状态位
TEST AL,02H ;bit 1是否为1,如果为1说明设备忙
JNZ READ_S2 ;ZF=0 忙,循环检测
MOV AL,输出数据 ;不忙
OUT PORT_OUT,AL;存到内存缓冲区
LOOP READ_S2 ;未传送完,循环
...

中断方式

  • 查询方式效率低。查询方式须反复查询外设的状态,查询等待过程会占去CPU的绝大部分时间,而真正用于数据交换的数据却很少,使CPU的利用率变得很低。为了提高CPU的利用率和进行实时数据处理,CPU常采用中断方式与外设交换数据。
  • 中断方式效率高。采用中断方式,CPU执行主程序,只有当输入设备将数据准备好,或输出设备的数据缓冲器已空时,才向CPU发出中断请求。
  • CPU响应中断后,暂停执行当前的程序,转去执行管理外设的中断服务程序,用输入或输出指令在CPU和外设之间进行一次数据交换。
  • 等输入输出操作完成之后,CPU又回去执行原来的程序。

可编程外围接口芯片8255A及其应用

概述及结构

  • 并行接口——一次可以同时传送一个数据的所有位
  • 并行接口的数据传送方向——一是单向传送(只作为输入口或输出口),另一种是双向传送(既可作为输入口,也可作为输出口)
  • 并行接口的可编程性
    • 不可编程:简单(如锁存器或三态门)
    • 可编程:复杂,功能完善的并行接口中一般都包括输入/输出数据寄存器、控制寄存器(存控制命令)、状态寄存器(存当前工作状态)和总线缓冲器等部件
  • 8255是Intel公司为80×86系列CPU配套的可编程并行接口芯片。通用性较强;使用灵活;典型的可编程并行接口。
A1 A0 定义
0 0 选择A口
0 1 选择B口
1 0 选择C口
1 1 选择控制寄存器
image.png
内部结构:
C口:分为高4位、低4位两组

image.png
与系统总线的连接
image.png

8255的工作方式

三种基本的工作方式:
方式0:基本输入/输出方式
方式1:选通的输入/输出方式
方式2:双向传输方式

A口:可以工作在方式0、方式1或方式2
B口、C口:只能工作于方式0或方式1。
3个端口的工作方式可通过软件编程来设定。

方式0

  • A口、C口的高4位,B口、C口的低4位可分别定义为输入或输出,它们互相独立,故共有16种不同的组合。
  • 定义为输出:端口均锁存数据的能力。
  • 定义为输入:端口则锁存能力。
  • 在方式0下,C口有按位进行置位和复位的能力
    image.png

应用:

  • 无条件传送方式:传送数据双方无需发控制信号给对方,也无需要查询对方状态。
    • CPU只需直接执行输入/输出指令便可将数据读入或写出。
    • A、B、C 3个口的全部24位都可以用做数据线。
  • 查询工作方式:通信双方需互相了解对方的状态→通常将C口的高4位(或低4位)定义为输入,用来接收外设的状态信号;而将C口的另外4位定义为输出,用来产生控制信号。
    • 此时A、B口可用来传送数据。

方式1

  • 也称为选通的输入/输出方式
  • A、B、C 3个口被分为两组
  • A组:
    • A口:数据口
    • C口高4位:用作A口输入/输出操作的控制和同步信号
  • B组:
    • B口:数据口
    • C口低4位:用作B口输入/输出操作的控制和同步信号
  • A口和B口的输入和输出数据都被锁存
    image.png
    A B设定为输出口:
    利用C口的6根线作为A口和B口的控制信号。控制信号线的安排是固定的,不允许改变:A口使用PC3、PC6和PC7,而B口用PC0、PC1和PC2。

image.png

A B设定为输入口:
利用C口的6根线作为A口和B口的控制信号。控制信号线的安排是固定的,不允许改变:A口使用PC3、PC4和PC5,而B口用PC0、PC1和PC2。

Clip_2024-04-07_13-34-25.png

方式2

  • 双向传输方式。只有A口可以工作在这种方式
  • 外设能利用8位数据线与CPU进行双向通信,此时A口既作为输入口又作为输出口
  • 利用C口的5根线来提供双向传输所需的控制信号
  • 当A口工作于方式2时,B口可以工作在方式0或方式1,而C口剩下的3根线可作为输入/输出线使用或用做B口方式1之下的控制信号线。
    image.png

8255的控制字及状态字

方式控制字
image.png

C口的位控制字:
image.png
方式1时的控制字:
image.png
方式2时的控制字:
image.png
可编程接口8255A端口地址是由其引脚决定的
A1A0=00,代表A端口地址
A1A0=01,代表B端口地址
A1A0=10,代表C端口地址
A1A0=11,代表控制字寄存器端口地址

可编程计数器/定时器8253及其应用

定时信号的产生

  • 软件定时——设计一个延时子程序,子程序中全部指令执行时间的总和就是该子程序的延时时间。
    • 简单,易实现,但需了解延时子程序中每条指令执行时间;定时时间不精确;仅适用于延时时间较短、重复次数有限的场合;占用CPU大量的时间,降低CPU的利用率。
  • 硬件定时——利用专用的硬件定时/计数器,在简单软件控制下产生准确的延时时间。
    • 通过软件确定定时/计数器的工作方式、设置计数初值并启动计数器工作;当计数到给定值时,便自动产生定时信号;成本不高,程序简单,几乎不占用CPU资源;适合长时间、多次重复定时,也适合延时时间较短的场合。

定时/计数器的计数方式

  • 加法计数器和减法计数器
    • 加法计数器是每有一个计数脉冲就加1,当加到预先设定的计数值时,产生一个定时信号
    • 减法计数器是在送入计数初值后,每来一个计数脉冲就减1,减到0时产生一个定时信号输出
  • 可编程定时/计数器8253就是一个减法计数器,它是Intel公司专为80X86系列配套开发的16位可编程定时/计数器芯片。

8253的外部引脚及内部结构

  • 三通道的16位定时/计数器
  • 计数器的工作方式及计数常数分别由软件编程选择
  • 可进行二进制或十进制计数或定时操作
  • 最高计数频率为2 MHz
  • 使用单电源+5 V供电
  • 输入/输出均与TTL电平兼容
    image.png
$\overline{CS}$ $\overline{RD}$ $\overline{WR}$ A1 A0 定义
0 1 0 00 写入计数器0
0 1 0 01 写入计数器1
0 1 0 10 写入计数器2
0 1 0 11 写入控制寄存器
0 0 1 00 读计数器0
0 0 1 01 读计数器1
0 0 1 10 读计数器2
0 0 1 11 无操作
1 × × ×× 禁止使用
0 1 1 ×× 无操作
计数器
  • 计数器0、1和2共3个相同的16位减1计数器互相独立工作;每个计数器都包括一个16位的初值寄存器、一个计数执行单元和一个输出锁存器
  • 计数器工作过程:置入初值→计数执行单元对输入脉冲CLK进行减1计数直至0 →从OUT端输出一个信号;整个过程可以重复进行、可按二进制/十进制计数;计数过程中,计数器还受到门控信号GATE的控制

控制寄存器

  • 存放操作方式控制字,决定计数器的工作方式;控制字是在8253初始化时用输出指令写入控制寄存器的,寄存器只能写入,不能读出
    数据总线缓冲器
  • 8位,双向,三态;8253和CPU数据总线间的接口
    读/写控制逻辑
  • 控制芯片的工作状态。选片有效时,读/写控制逻辑从系统总线接收输入信号,经过逻辑组合,产生对各部分的控制信号;无效(高电平)时, 8253与总线断开

计数启动方法

  • 软件启动——程序指令启动
    • 从CPU写入计数初值到计数结束,实际的CLK脉冲个数比编程写入的计数初值N要多一个,即N+1(不可避免)。(方式2、3 应该+1)
  • 硬件启动——由外部电路信号启动
    • 写入计数初值后并不启动计数,在门控信号GATE由低电平变高后,再经CLK信号的上升沿采样之后在该CLK的下降沿才开始计数。
    • GATE信号与CLK信号不一定同步,极端情况下从GATE变高到CLK采样之间的延时可能会经历一个CLK脉冲宽度,计数初值与实际的CLK脉冲个数间也会有一个时钟脉冲的误差。
      graph TD;
        A(CPU讲计数初值写入初值寄存器)-->B(将初值寄存器中内容送到计数器);
        B-->C(计数器开始减1计数);
        C-->D(减1到0时在OUT端输出一个信号);
      计数方式
  • 不自动重复的计数方式:计数器每启动一次只工作一个周期(即从初值减到0)
  • 自动重复的计数方式:一旦计数启动,只要门控信号GATE保持高电平,计数过程就会自动周而复始地重复下去,这时OUT端可以产生连续的波形输出。
  • 在自动重复计数方式下,达到稳定状态后,因启动造成的实际计数值和计数初值之间的误差就不再存在。

8253的工作方式

方式 启动计数 中止计数 自动重复 更新初值 输出波形
0 软件(写入初值) GATE=0 立即有效 延时时间可变的上跳沿
1 硬件(GATE正跳变) 下一轮有效 宽度为$N\times T_{CLK}$ 的单一负脉冲
2 软件(写入初值)

硬件(GATE正跳变)
GATE=0 下一轮有效 周期为$N\times T_{CLK}$ 、宽度为$T_{CLK}$的连续负脉冲
3 软件(写入初值)

硬件(GATE正跳变)
GATE=0 下半轮有效 周期为$N\times T_{CLK}$ 的连续方波
4 软件(写入初值) GATE=0 下一轮有效 宽度为$T_{CLK}$的单一负脉冲
5 硬件(GATE正跳变) 下一轮有效 宽度为$T_{CLK}$的单一负脉冲

方式0工作波形(计数结束中断方式)

image.png

方式1工作波形(可重复触发的单稳态触发器)
image.png

门控信号GATE由低电平变高后,再经CLK信号的上升沿采样之后在该CLK的下降沿才开始计数。

方式2工作波形(频率发生器)
image.png

当计数器减到零的前一个 CLK ,OUT 输出低电平,即OUT ->0 ,输出一个宽度为一个 CLK 周期的负脉冲,并自动重新装入初始值,自动启动计数。
可以通过 GATE = 0 暂停计数。

方式3工作波形(方波发生器)
image.png

计数器减到1/2初值时,OUT输出一个宽度为 1 / 2 CLK 周期的负脉冲,并自动重新装入初始值,自动启动计数。
可以通过 GATE = 0 暂停计数。

方式4工作波形(软件触发选通)
image.png

计数结束后输出一个CLK周期的低电平,其余为高电平,不能自动循环。

软件5工作波形(硬件触发选通)
image.png

波形特征同方式4,但重置初值和GATE上升沿之后可重新计时

8253的控制字

image.png
$RW_1$ $RW_2$
01 写入低8位时,高8位自动为零。
10 写入高8位时,低8位自动为零。

8253初始化

  • 写入方式控制字
    • 三个通道用的控制字端口地址是相同的
    • 三个控制字写入后存入通道对应的寄存器中
  • 写入计数初始值
  • 读计数值(计时)
    • 以普通对计数器端口读的方法取得当前计数值
    • 锁存计数器的当前计数值

串口通信和可编程接口芯片8251A

串行通信基本概念

image.png

  • DTE- Data Terminal Equipment,常常是计算机。
  • DCE- Data Communication Equipment,常常是MODEM,也可以是计算机。
  • 串行接口 – 主要是8251A、16550、8250等IC,连接DTE和DCE。

数据传送的方向

  • 单工(Simplex)——通信是单向的。
  • 半双工(Half duplex)——半双工指A能发信号给B,B也能发信号给A,但这两个过程不能同时进行,A或B发送完后要切换到接受状态。典型例子就是对讲机。
  • 全双工(Duplex)——在A给B发信号的同时,B也可以给A发信号。典型的例子就是打电话。

传输速率

  • 波特率——单位时间传送的位数,单位bps(bit/s) 。
  • 波特率因子K——每BIT占用的时钟周期数。 K=接收或发送时钟频率/波特率, 可取1,16,32,64
    Exx: 一个异步串行发送器,发送具有8位数据位的字符,在系统中使用一个奇偶校验位和两个停止位。若每秒发送100个字符,则其波特率为多少 ?
    100×(1+8+1+2)=1200 bps
    起始位 数据位 校验位 停止位

信号的调制与解调

  • 数据通信传输的是数字信号,要求传送线的频带很宽,若传输带宽很窄,直接传输数字信号,信号就要发生畸变。 因此,需用调制器将数字信号转换成模拟信号,经传输后再用解调器将其转换成数字信号
  • 根据载波 $Asin(\omega t+\phi)$ 的三个参数:幅度、频率、相位,常用的调制技术:幅度调制 Amplitude-Modulating (AM)、频移键控法 Frequency-Shift Keying (FSK)

串行通信数据格式

  • 在数据通信中,传输的对象是一系列的 0和1 ,这些 0、1 在不同的位置有不同的含义,这些含义都要事先约定好。
  • 在通信中,两种最基本的串行通信方式:异步串行通信(不使用共同的时钟和同步信号)、同步串行通信(使用共同的时钟和同步信号) 。
异步串行通信 同步串行通信
双方使用各自的时钟 双方使用同一时钟
一帧以字符为单位(一个字符帧的长度取决于帧格式) 以数据块为单位(数据块长度可变)
传输效率低 效率高,速度快
应用于传输速率不高时,简单,应用较广 应用于大批量,高速率数据通信场合

串行通信的校验方法

  • 串行通信主要适用于远距离通信,因而噪声和干扰较大,为了保证高效而无差错地传送数据,对传送的数据进行校验就成了串行通信中必不可少的重要环节。
  • 常用的校验方法有:奇偶校验、循环冗余校验(CRC) 。
  • 奇偶校验:主要用于对一个字符的传送过程进行校验;奇偶校验可以检查出一个字节中发生的单个错误;奇偶校验不能自动纠错,发现错误后需“重传”。

串行外设接口(SPI)

SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信。

MOSI:主机输出 / 从机输入数据线(SPI Bus Master Output/Slave Input)。
MISO:主机输入 / 从机输出数据线(SPI Bus Master Input/Slave Output)。
SCLK:串行时钟线(Serial Clock),主设备输出时钟信号至从设备。
CS:从设备选择线 (Chip select)。也叫 SS、CSB、CSN、EN 等,主设备输出片选信号至从设备。

SPI 以主从方式工作,通常有一个主设备和一个或多个从设备。
通信由主设备发起,主设备通过 CS选择要通信的从设备,然后通过 SCLK 给从设备提供时钟信号。
数据通过 MOSI 输出给从设备,同时通过 MISO 接收从设备发送的数据。

image.png
如图所示芯片有 2 个 SPI 控制器,SPI 控制器对应 SPI 主设备,每个 SPI 控制器可以连接多个 SPI 从设备。挂载在同一个 SPI 控制器上的从设备共享 3 个信号引脚:SCK、MISO、MOSI,但每个从设备的 CS 引脚是独立的
image.png


嵌入式系统与接口技术
https://thinler.github.io/2024/02/23/学习笔记/嵌入式系统与接口技术/
作者
Thinler
发布于
2024年2月23日
许可协议