本文仅总结只需记忆等相关知识点,算术运算指令、原反补码等知识点略去。

微型计算机基础知识

简介

微型计算机由微处理器、存储器、输入/输出、总线构成。

算术运算

溢出判断:$C_{n-1} \oplus C_{n-2} =0$ 。

其中 $C_{n-1}$ 表示最高位向前的进位,$C_{n-2}$ 表示次高位向前的进位, $\oplus$ 表示异或。

8086/8088 微处理器

功能结构

8088包含两大功能单元:执行单元 (EU) 和总线接口单元 (BIU) 。

执行单元 (EU)

主要功能:译码分析指令、执行指令、暂存中间运算结果并保留结果特征。

总线接口单元 (BIU)

主要功能:负责CPU与内存或输入/输出接口的信息传送,包括取指令、取操作数、保存运算结果。

引脚及功能

$\rm{MN/\overline{MX}}$切换最小/最大模式,其中最小模式为高电平。

最小模式引脚

  • $\rm{IO/\overline{M}}$:三态输出,选择存储器或IO接口。
  • $\rm{\overline{RD}}$:读控制信号,三态输出。
  • $\rm{\overline{WD}}$:写控制信号,三态输出。
  • $\rm{DT/\overline{R}}$:数据传送/接收信号,三态输出。

最大模式引脚

  • $\rm{\overline{MEMR}}$:存储器读。
  • $\rm{\overline{MEMW}}$:存储器写。
  • $\rm{\overline{IOR}}$:IO接口读。
  • $\rm{\overline{IOW}}$:IO接口写。

存储器组织

8088 CPU 有 $20$ 根地址线,可寻址 $2^{20}=1 \rm{MB}$ 内存空间,地址范围为 $00000\rm{H} \sim \rm{FFFFFH}$。每个存储单元对应一个 $20$ 位的地址(物理地址),每个存储单元物理地址唯一。

存储器分段管理

为什么存储器要分段?

因为 8088 CPU 内部寄存器的宽度为 $16$ 位,只能存放 $16$ 位的二进制数据,而 $16$ 位的寄存器无法存放$20$位的存储单元物理地址,所以对存储器采用分段式管理。

如何给存储器分段?

8088 CPU 将可直接寻址的 $1 \rm{MB}$ 内存空间划分成一些连续的区域,称为段。每段的长度最大为 $64 \rm{KB}$,并要求段的起始地址必须能被 $16$ 整除,形式如 $\rm{XXXX0H}$ 。这种形式的地址最低 $4$ 位二进制数为 $0000\rm{B}$ ,所以只要存储高 $16$ 位就可以据此得到它的 $20$ 位物理地址。

逻辑地址:$\rm{XXXXH:YYYYH}$ 。其中$\rm{XXXXH}$为段基址,$\rm{YYYYH}$为段内偏移地址。

$$ 物理地址=段基址 \times 10\rm{H} + 段内偏移量 $$

编程结构

通用寄存器

共有 $8$ 个,每个 $16$ 位。

AXBXCXDX还可以分为高 $8$ 位和低 $8$ 位寄存器,如AHAL等。

  • SP为堆栈指针寄存器,内容为栈顶的偏移地址,与SS配对使用。
  • BP为基址指针寄存器,常作为堆栈段中数组的基地址。

SIDI都是变址指针寄存器。

  • SI称为源变址指针寄存器。
  • DI称为目的变址指针寄存器。

二者通常用来存放DSES段中操作数的偏移地址。

段寄存器

  • 代码段寄存器CS:存放当前代码段段基址。
  • 堆栈段寄存器DS:存放堆栈段的段基址。
  • 数据段寄存器SS:存放当前程序使用的数据段段基址。
  • 附加段寄存器ES:存放扩展数据段段基址。

控制寄存器

包括指令指针寄存器IP和状态标志寄存器FLAGS

FLAGS

FLAGS称为标志寄存器或程序状态字,是一个 $16$ 位的寄存器,8088 CPU 只使用了其中 $9$ 位。这 $9$ 个标志位分为两类:一类称为状态标志,反映指令执行结果的特征,共有 $6$ 位;另一类是控制标志,用于控制微处理喊的操作,共有 $3$ 位。

状态标志位
  • CF:进位标志。最高位产生进位或借位时置 1
  • PF:奇偶标志。低 $8$ 位含有偶数个 $1$ 则置1
  • AF:辅助进位标志。若低 $4$ 位向高 $4$ 位进位则置1
  • ZF:零标志。若运算结果为 $0$ 则置1
  • SF:符号标志。若运算结果为负则置1
  • OF:溢出标志。当运算结果超出了本条指令所允许的数据范围则置1。溢出判断见上文。

上述标志不符合置1情况时一律置0

控制标志位
  • DF:方向标志。置0时按增量变化,反之按减量变化。
  • IF:中断允许标志。置1时允许微处理器响应可屏蔽中断请求,反之禁止响应。
  • TF:单步标志。置1时 CPU 为单步方式。

8086/8088 指令系统

8086 CPU 寻址方式

获得地址的方法,共 $8$ 种。

立即寻址

操作数为立即数。

一例

1
2
3
mov ax, 2000h
mov ah, 'A'
all al, 6

直接寻址

操作数在内存中,指令中直接给出操作数所在的内存单元的偏移地址。

一例

1
2
mov bx, [3200h]
mov ax, [buff]

通常情况下,存放器操作数默认在数据段,段基址在DS

又一例:段超越

1
mov bl, es:[2000h]

该例物理地址为 $\rm{ES} \times 10\rm{H} + 2000\rm{H}$。

寄存器寻址

操作数在 CPU 内部的寄存器中。

一例

1
mov bl, [2000h]   ;操作数bl(目的操作数)的寻址方式为寄存器寻址

寄存器间接寻址

操作数在内存中,内存单元的偏移地址存放在寄存器中。

一例

1
mov ax, [si]    ;操作数[si]的寻址方式为寄存器间接寻址

只有BXBPDISI能够作为寄存器间接寻址方式使用。BP在作为间接寄存器使用时,段基址默认为SS;其他 $3$ 个的默认段基址为DS。均可段超越。

寄存器相对寻址

操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给定的 $8$ 位或 $16$ 位地址位移量,二者相加相成操作数的有效地址。

一例

1
2
3
4
5
mov ax, [bx+data]  ;将以 bx+data 为首地址的连续两个内存单元的数据传送给 ax
mov al, [si+20h]   ;将以 si+20h 为地址的内存单元的数据传送给 al
;上述指令的书写形式很灵活,也可以如下书写
mov ax, [bx]+data
mov al, 20h [si]

基址变址寻址

操作数在内存中,基址寄存器和变址寄存器想加作为操作数的偏移地址。8086 CPU 中寄存器BXBP为基址寄存器,SIDI为变址寄存器。这种寻址方式中,一个基址寄存器加一个变址寄存器构成操作数,操作数的形式只有 $4$ 种:

1
2
3
4
[bx]    [si]
[bx]    [di]
[bp]    [si]
[bp]    [di]

8086汇编规定以基地址为主,如果基址寄存器为BP,则操作数的段基址默认由SS提供;若BX为基址寄存器,则段基址默认由DS提供。

一例

1
2
mov ax, [bx][di]    ;源操作数的物理地址为 dsX10h+bx+di
mov [bp][si], dx    ;目的操作数的物理地址为 ssX10h+bp+si

基址变址寻址方式要求必须一个基址和一个变址组合,不允许两个基址或两个变址组合,下面指令是错误的。

错误用法

1
2
mov ax, [bx][bp]
mov ax, [di][si]

基址变址相对寻址

操作数在内存中,操作数的地址由基址寄存器加上变址寄存器再加上地址位移量构成。如果基址寄存器为BP,则段基址默认由SS提供;若BX为基址寄存器,则段基址默认由DS提供。

一例

1
2
3
4
5
6
mov ax, data[bx][si]
mov ax, [bp][di]data
;指令也可书写为
mov ax, [data+bx+si]
mov ax, [data+bx][si]
mov ax, data[bx+si]

这种寻址方式主要用于二维数组操作。地址位移量作为数组首地址,基址寄存器寻址行,变址寄存器寻址列,可以很方便地实现数据阵列检索。

注意

基址变址相对寻址方式要求必须一个基址和一个变址组合,不允许两个基址或两个变址组合。

隐含寻址

操作码地指明操作数的地址,例如乘法指令、字符串操作指令。

一例

1
2
mul bl  ; al 乘以 bl,结果存在 ax 中
mov sb  ;把 ds:si 指明的内存单元的数据传送到 es:di 指明的内存单元中

输入/输出与中断技术

I/O 接口概述

I/O 接口功能

  • 地址译码
  • 数据传送
  • 提供握手联络信号
  • 数据格式转换
  • 信号电平转换
  • 错误检测功能

I/O 端口

要求输入端口具有通断控制能力,输出端口具备数据锁存能力。

I/O 端口编址方式

(与存储器)统一编址

将 I/O 端口作为内存单元对待,由 CPU 统一分配地址。

特点

优点:

  1. 访问 I/O 端口和访问内存单元一样,所有访问内存的指令都可以访问 I/O 端口,不用设置专门的 I/O 指令;
  2. 利用数据传送指令就可以实现 CPU 与 I/O 端口的数据交换;
  3. 用测试指令可以测试端口的状态位,了解外设的状态,判断输入/输出操作的执行情况;
  4. 不需要专用的 I/O 端口控制信号,简化了系统总线。

缺点: 占用一部分 CPU 地址空间。

独立编址

CPU 给 I/O 端口分配一个独立的地址空间,这个地址空间与内存地址空间隔离,称为 I/O 地址空间。8088即采用该编址方式

特点

优点:

  1. I/O 地址空间小,地址线根数少,在接口中 I/O 端口地址译码电路较简单;
  2. 不占用内存空间。

缺点: 需要专用的输入/输出控制信号和专用的 I/O 指令。

数据传送控制方式

无条件传送方式

又称同步方式,适合简单外设的数据输入/输出。CPU 可直接与其进行数据交换,数据输入/输出的控制程序很简单。

程序查询传送方式

程序查询传送方式适合外部设备数量不多,而且设备相对简单、速度慢,但速度差异不大、对实时性要求不高的情况。

在有多个外设的环境中,程序查询传送方式的数据输入/输出效率低、实时性差。

中断传送方式

特点

优点:实时性好、节省 CPU 时间、外设具有申请服务的主动权,并且在一定程度上实现设备与 CPU 并行工作。

缺点:

  1. 中断方式仍需要通过 CPU 执行程序实现外设与 CPU 之间的信息传送;
  2. CPU 每次中断都需要花费时间保护断点和现场,无法满足高速 I/O 设备的速度要求。

前三种方式被统称为程序控制下的输入/输出方式,简称 PIO (Programmed Input and Output) 模式。

直接存储器存取(DMA)方式

在内存储器和 I/O 设备之间建立直接的数据通路,使 I/O 设备和内存不经过 CPU 的干预直接交换数据,实现内存与外设之间的快速数据传送。

中断

中断处理的基本过程

基本过程包括中断请求、中断判优、中断响应、中断服务、中断返回 $5$ 个阶段。

中断判优

  1. 软件判优
  2. 硬件判优:
    1. 菊花链判优电路
    2. 中断控制器判优

中断响应

中断响应时, CPU 向中断源发出中断响应信号,同时:

  1. 保护硬件现场。
  2. 关中断。
  3. 保护断点。
  4. 获得中断服务程序的入口地址。

8086/8088 中断系统

8086/8088 含有 $2$ 个中断请求信号输入引脚 $\rm{INTR}$ 和 $\rm{NMI}$,还有一个中断应答引脚 $\rm{\overline{INTA}}$。与中断相关的指令有:INTINTOINT3IRET,还有 $2$ 个与中断相关的标志位 IFTF。其可处理 $256$ 不同类型的中断,每种类型的中断一个编号,称为中断类型码或中断微量码,编号范围为 $0 \sim 255$ 。

中断向量和中断向量表

中断服务程序的入口地址称为中断向量。 $256$ 个中断微量存储在内存中构成了一张表,称为中断向量表。每个中断微量都包括两部分:段基址和偏移地址。因此,存放 $1$ 个中断向量需要 $4$ 个内存单元,$256$ 种中断向量共需要 $1\rm{K}$ 个内存单元。

8086/8088 系统中的中断向量表位于内存起始地址 $00000 \sim 003\rm{FFH}$ 的存储区内。每 $4$ 个单元存放一个中断向量,低地址的两个单元存放中断向量的偏移地址,高地址的两个单元存放中断向量的段基址。

中断向量在中断向量表中的存放首地址称为向量地址,其值为:中断类型码 $\times 4$ 。

执行方法

当 CPU 调用中断类型码为 $n$ 的中断服务程序时,首先把 $n$ 乘以 $4$ ,得到它的向量地址 $4n$ ,然后把 $4n+1:4n$ 两个单元的内容取出并装入 IP寄存器;再把 $(4n+3:4n+2)$ 两个单元的内容取出并装入 CS 寄存器, CPU 就获得了 $n$ 的中断服务程序的入口地址,进而转去执行中断服务程序。

一例

DOS 系统功能调用的中断类型号为 21H,向量地址为 $n \times 4 = 84\rm{H}$ 。

8086/8088 CPU 专用中断类型有 $5$ 个:

类型 $0$

除法错中断,结果溢出或是除以 $0$ 时发生。

类型 $1$

单步中断,也称为陷阱中断。若 TF 标志位为 1,CPU 每执行一条指令后,就停下来等待,并提示 CPU 内部各寄存器的值和一些附带信息。

类型 $2$

非屏蔽中断,该中断不能被软件禁止。该中断由 CPU 之外的硬件产生,通过 CPU 的 $\rm{NMI}$ 引脚输入中断请求信号,上升沿触发。

类型 $3$

断点中断,由一个单字节指令 INT3 引起的中断,指令代码为 0CCH

类型 $4$

溢出中断,INTO 指令的专用向量。若 OF 标志位为 1 则中断,否则不执行任何操作。

硬件中断

8086/8088 有两个硬件中断请求信号输入引脚:$\rm{NMI}$ 和 $\rm{INTR}$,用来接收外部中断源产生的中断请求。前者接收非屏蔽中断请求,后者接收可屏蔽中断请求。

非屏蔽中断

非屏蔽中断,该中断不能被软件禁止。该中断由 CPU 之外的硬件产生,$\rm{NMI}$ 采用上升沿触发,优先级高于可屏蔽中断。CPU 响应该中断时,将所有内部寄存器存于使用电池的备份存储器或 EEPROM 中。该中断用于处理紧急事件。

可屏蔽中断

$\rm{INTR}$ 采用电平触发方式,高电平有效。$\rm{INTR}$ 由外部中断源置位,并在中断服务程序内部被清除。CPU 收到中断请求信号后,检测中断允许标志位 IF,若 IF $= 1$,CPU 响应 $\rm{INTR}$ 请求;若 IF $= 0$, CPU 屏蔽 $\rm{INTR}$ 请求。被屏蔽的中断请求信号可一直保持高电平,直到被 CPU 接收。可屏蔽中断的优先级低于非屏蔽中断。中断允许标志位 IF 可以用指令 STICLI 进行设置。

CPU 响应 $\rm{INTR}$ 请求时,启动中断响应总线周期,发中断应答信号 $\rm{\overline{INTA}}$ 。系统连续产生 $2$ 个 $\rm{\overline{INTA}}$ 脉冲,用于从数据总线接收中断控制器送出的中断类型码。

可编程接口芯片

8255A 控制步进电机

工作在方式0下,控制字起始 $3$ 位一定为 100,输出为0输入为1,无关为0

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
mode equ 082h       ;8255A 控制字
porta equ 0800h     ;端口 a 地址
contrl equ 08003h   ;控制端口地址

;初始化
mov ax, data
mov ds, ax
mov dx, contrl
mov al, mode
out dx, al
mov dx, porta
mov al, 0
out dx, al

;单/双八拍
step8:
mov dx, porta
mov al, 1
out dx, al
call delay
mov al, 3
out dx, al
call delay
mov al, 2
out dx, al
call delay
mov al, 6
out dx, al
call delay
mov al, 4
out dx, al
call delay
mov al, 12
out dx, al
call delay
mov al, 8
out dx, al
call delay
mov al, 9
out dx, al
call delay

;双四拍
step4d:
mov dx, porta
mov al, 3
out dx, al
call delay
mov al, 6
out dx, al
call delay
mov al, 12
out dx, al
call delay
mov al, 9
out dx, al
call delay

;单四拍
step4s:
mov dx, porta
mov al, 8
out dx, al
call delay
mov al, 4
out dx, al
call delay
mov al, 2
out dx, al
call delay
mov al, 1
out dx, al
call delay

可编程定时器/计数器 8253

工作方式

以下工作方式均为软启动。

方式0 —— 计数结束中断

方式2 —— 频率发生器

计数器在 OUT端产生一系列连续的脉冲信号,脉冲宽度为一个时钟脉冲的宽度。脉冲信号的周期为 $N \times T_{CLK}$,其中低电平的宽度为 $1$ 个 $T_{CLK}$。

OUT 端脉冲周期为:$T_{OUT} = N \times T_{CLK}$

脉冲频率:$F_{OUT} = F_{CLK}/{N}$

输出脉冲频率是输入脉冲频率的 $1/N$,因此 $N$ 也常被称为分频系数。

方式3 —— 方波发生器

OUT 端输出方波,其信号周期为 $N \times T_{CLK}$。$\rm{N}$为计数初值,也称为时间常数。

一例

设 8253 端口地址为 $\rm{FCF8H} \sim \rm{FCFBH}$,利用计数器 $1$ 作方波发生器,给定 $\rm{CLK_1}$ 为 $2 \rm{MHz}$,要求产生频率为 $1\rm{kHz}$ 的方波,BCD码计数。编程初始化 8253。

1
2
3
4
5
6
7
8
mov dx, 0fcfbh
mov al, 01110111b
out dx, al
mov dx, 0fcf9h
mov ax, 2000h
out dx, al
mov al, ah
out dx, al

数/模转换

DAC 0832输出三种波型

设 DAC 0832 的端口地址为 200H

 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
26
27
28
29
30
31
32
;锯齿波程序
        mov dx, 200h
        mov al, 0
next1:  out dx, al
        inc al
        call delay
        jmp next1

;三角波程序
        mov dx, 200h
next0:  mov cx, 0ffh
        mov al, 0
next1:  out dx,al
        inc al
        call delay
        loop next1
        mov cx, 0ffh
next2:  dec al
        out dx, al
        call delay
        loop next2
        jmp next0

;方波程序
        mov dx, 200h
next:   mov al, 0
        out dx, al
        call delay
        mov al, 0ffh
        out dx, al
        call delay
        jmp next