[汇编复习] 记录

文章目录

  • 第一章
  • 第二章
    • 8086/8088 CPU 的功能结构
      • 8086/8088 CPU的执行单元
        • 数据寄存器
        • 地址指针和变址寄存器
        • 标志寄存器 Flag
        • 算术逻辑单元(ALU)
      • 8086/8088 CPU的总线接口单元
        • 段寄存器
    • 8086微处理器的引脚信号
        • 主要的控制和状态信号
        • 中断请求和响应信号
          • 总线保持信号
    • 8088/8086CPU的存储器组织
      • I/O端口地址的管理
        • 8088/8086的工作时序
        • 常用的数据管理方式
          • 堆栈及堆栈段的使用
    • 8086 微处理器的总线操作
  • 第三章
    • 寻址方式
      • 8086/8088常用助记符指令
  • 第四章
    • 宏汇编
  • 第五章
    • 5.2 随机存取存储器
      • 静态存储器SRAM
      • 动态随机存储器DRAM
      • 只读存储器(ROM)
      • 存储器扩展(字扩展、位扩展、字位扩展)
    • 解题
  • 第六章
      • 输入/输出的控制方式
        • 无条件传送方式
        • 查询工作方式
        • 中断方式
        • 直接存储器存取(DMA)方式
    • 总线
      • PCI 总线
      • 通用串行总线USB
  • 第七章
    • 中断
      • 过程
      • 中断优先级
        • 中断向量
        • 中断向量表
        • 中断向量地址计算
        • 可编程中断控制器8259A
  • 第八章
    • 可编程定时器/计数器 8253
      • 内部结构
      • 引脚
      • 工作方式
    • 8255A
  • 习题

第一章

1、原码
在表示带符号数0时,正数的符号位为0,负数的符号位为1,数值表示数的绝对值,这样就得到了数的原码表示形式。

2、反码
正数的反码表示与原码相同;负数的反码,可将负数原码的符号位保持不变、数值位按位取反得到,或者将负数看作正数求原码,再将所有位按位取反得到。

3、补码
在计算机中,对二进制的运算,可以将乘法运算转换为加法和左移位运算,而除法运算则可以转换为减法和右移运算,故加、减、乘、除运算最终可以归结为加、减运算和移位运算来完成,而补码中的减法运算可以转换成加法运算,所以最终变成了加法和移位运算。引进补码就是为了把减法运算转换成容易实现的加法运算。

正数的补码就是它本身,等于原码,只有负数才存在求补码问题。补码等于反码加1,即
[ x ] 补 = [ x ] 反 + 1 [x]_补=[x]_反+1 [x]=[x]+1

第二章

8086/8088 CPU 的功能结构

按功能可分为两大部分:总线接口单元BIU (BUS Interface Unit)和执行单元EU(Execution Unit)

算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。

在8086中,取指令和执行指令分别由总线接口部件BIU和执行部件EU来完成,并且存储在指令队列缓冲器中,使BIU和EU可以并行工作,执行部件负责执行指令,总线接口部件负责提取指令、读出操作数和写入结果。这两个部件能互相独立的工作。在大多数情况下,取指令和执行指令可以重叠进行,即在执行指令的同时进行取指令的操作。

8086中的BIU和EU采用并行工作方式,减少了CPU为取指令而等待的时间,使整个程序运行期间BIU总是忙碌的,充分利用了总线,极大地提高了CPU的工作效率,加快了整机的运行速度,也降低了CPU对存储器存取速度的要求,这成为8086的突出优点。

类似于工厂的装配线,即不同的产品在装配线上的不同阶段同时装配,多个产品在装配时间上具有重叠性。完整执行一条指令可以分为多个阶段,程序的执行是一个周而复始的重复过程。

图片引用自《汇编语言与微机原理》一书
8086 C P U 的 内 部 结 构 图 8086 CPU的内部结构图 8086CPU[汇编复习] 记录_第1张图片

8086/8088 CPU的执行单元

执行单元中包含一个16位的算数逻辑单元(ALU),8个16位的通用寄存器,一个16位的标志寄存器,一个数据暂存寄存器和执行部件的控制电路。EU的功能是从BIU的指令队列中取出指令代码,经指令译码器译码和执行指令所规定的全部操作。执行指令所得结果或执行指令所需的数据如果与内存或I/O端口相关,则由EU向BIU发出命令,对存储器或I/O接口进行读/写操作。

8086 的 内 部 寄 存 器 8086的内部寄存器 8086[汇编复习] 记录_第2张图片

数据寄存器

数据寄存器可以用于存放8位或16位的二进制操作数,这些操作数可以是参加操作的原始数据,运算得到的中间结果也可以是操作数的地址。大多数算数和逻辑运算指令都可以使用这些寄存器。

[汇编复习] 记录_第3张图片

地址指针和变址寄存器

(SP、BP、SI和DI)这组寄存器的共同特点是对存储器操作数寻址时,作为形成20位物理地址的组成部分。

[汇编复习] 记录_第4张图片

标志寄存器 Flag

8086设立了一个2字节(byte)的标志寄存器,共9个标志。其中6个是反映一次ALU操作结果的状态标志,3个是控制CPU操作的控制标志。控制标志指示CPU控制某种特定的操作,3位控制标志分别为DF、IF和TF。

标 志 寄 存 器 标志寄存器
[汇编复习] 记录_第5张图片
一个16位的标志寄存器(9位),其中包括6位状态标志、3位控制标志,还有7位没有使用。
标志寄存器也称为程序状态字PSW
两种标志
状 态 标 志 ( 6 ) 状态标志( 6 ) (6)
控 制 标 志 ( 3 ) 控制标志( 3 ) (3)
SF,ZF,PF,CF,OF是可测试的标志,AF是内部测试的,不能由用户用软件的方法进行测试

状态标志:表示当前操作后ALU的状态用于转移或调用的条件判断

标志位 位置 标志位名称 作用
CF D 0 D_0 D0 进位标志 若运算结果有进(借)位,CF=1
PF D 2 D_2 D2 奇/偶标志 运算结果低8位中1的 个数为偶数个,PF=1逻辑上的真用1表示,假用0表示控制标志:控制处理器的某一特定功能人为设置
AF D 4 D_4 D4 辅助进位标志 若低4位向前有进 (借)位,则AF=1
ZF D 6 D_6 D6 零标志 结果为0时, ZF=1
SF D 7 D_7 D7 符号标志 最高位的值为1时,SF=1
TF D 8 D_8 D8 跟踪标志 TF=1 控制CPU单步运行
IF D 9 D_9 D9 可屏蔽中断允许标志 IF=1表示允许CPU响应。
DF D 10 D_{10} D10 方向标志 DF=0 使串操作 地址增量变化。
OF D 11 D_{11} D11 溢出标志 若有溢出, 则OF=1
注:标志寄存器功能表

算术逻辑单元(ALU)

算术逻辑单元实际上就是计算机的运算器,进行各种运算,包括如下两种:

  1. 算数运算,加、减、增量加1、减量减1、比较、求反、求补、乘、除运算;
  2. 逻辑运算:逻辑与、逻辑或、逻辑非、逻辑异或以及移位、循环移位等运算和操作。

ALU实际上是一个以加法器为核心的部件,这一加法器能按照二进制法则进行加法运算,又能通过二进制补码方法,把减法变为加法进行运算,还能用移位操作实现乘除运算。与ALU,直接有关的部件还包括数据寄存器、标志寄存器与十进制调整等部件。执行运算时,数据通过内部总线进入数据寄存器,由数据寄存器将参加运算的数据及标志寄存器的CF输入ALU,运算结果送往数据总线或数据寄存器,同时将运算结果的状态送标志寄存器FR保存,以作为条件转移指令的转移条件。

8086/8088 CPU的总线接口单元

总线接口单元BIU是8086CPU同存储器和I/O设备之间的接口部件,负责对全部引脚的操作,即8086所有对存储器和I/O设备的操作都由BIU完成。所有对外部总线的操作都必须有正确的地址和适当的控制信号,BIU中的各部件主要是围绕这个目标设计的。它提供了16位双向数据总线,20位地址总线和若干条控制总线。

总线接口单元BIU的具体任务是:负责从内存单元中领取指令,并将它们送到指令队列缓冲器暂存。CPU执行指令时,总线接口单元要配合执行单元,从指定的内存单元或着I/O端口中取数据传送给执行单元,或者把执行单元的处理结果传送到指定的内存单元或者I/O端口中。总线接口部件BIU内部有4个16位的段地址寄存器:代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS和附加段寄存器ES;1个16位指针寄存器IP;1个6B指令队列缓冲器;20位地址加法器和总线控制逻辑。

BIU的主要功能是根据执行部件EU的请求,完成CPU与存储器或I/O接口之间的数据传送。

段寄存器

段 寄 存 器 功 能 表 段寄存器功能表
[汇编复习] 记录_第6张图片

图片引用自《汇编语言与微机原理》一书

地址线能传输多少个不同的信息,cpu就能对多少存储单元寻址。即地址总线宽度决定寻址能力。

20根地址线,每根线传输0或1,20根共有 2 20 2^{20} 220种组合;寻址范围为00000H-FFFFFH;总字节数为 2 20 = 1 6 5 = 1048576 B y t e = 1024 K B = 1 M B ; 2^{20} = 16^5 = 1048576 Byte = 1024 KB = 1 MB; 220=165=1048576Byte=1024KB=1MB
2 10 = 1024 2^{10}=1024 210=1024
1 M B = 1024 K B 1MB=1024KB 1MB=1024KB
1 K B = 1024 B y t e 1KB=1024Byte 1KB=1024Byte

字节(DB)为1字节;
字(DW)为2字节;
双字(DD)为4字节。

数据线决定cpu与外界传输速度:16根数据线,只能传输4位16进制,所以在表示地址时我们使用4位段地址和4位偏移地址来表示,用EA表示段地址,SA表示偏移地址,物理地址即为 10 H × E A + S A 10H\times EA+SA 10H×EA+SA

关于如何计算物理地址:https://blog.csdn.net/az9996/article/details/89447862

8086微处理器的引脚信号

8086/8088芯片的引脚应包括20根地址线,16根(8086)或8根(8088)数据线以及控制线、状态线、电源线和地线等,若每个引脚只传送一种信息,那么芯片的引脚将会太多,不利于芯片的封装,因此,8086/8088CPU的部分引脚定义了双重功能。如第33引脚MN / MX上电平的高低代表两种不同的信号;第31到24引脚在CPU处于两种不同的工作方式时具有不同的名称和定义;引脚9到16(8088CPU)及引脚2到16和39(8086CPU)采用了分时复用技术,即在不同的时刻分别传送地址或数据信息等。

8086 与 8088 芯 片 引 脚 8086与8088芯片引脚 80868088
(图片引用自《汇编语言与微机原理》一书)
[汇编复习] 记录_第7张图片

主要的控制和状态信号

W R ‾ \overline{WR} WR: 三态,输出。写命令信号;
R D ‾ \overline{RD} RD: 三态,输出。读命令信号;
I O / M ‾ IO/\overline{M} IO/M:三态,输出。当前访问的是存储器还是I/O接
口。高:I/O接口,低:内存
D E N ‾ \overline{DEN} DEN:三态,输出。低电平时,表示DB上的数据有效
RESET:输入,为高时,CPU执行复位;
ALE: 三态,输出。高:AB地址有效;
D T / R ‾ DT/ \overline{R} DT/R:三态,输出。数据传送方向,高:CPU输出,
              低:CPU读入

中断请求和响应信号

INTR:输入,可屏蔽中断请求输入端。
高:有INTR中断请求
NMI:输入,非屏蔽中断请求输入端。
→ \rightarrow 高,有NMI中断请求
INTA:输出,对INTR信号的响应。

总线保持信号

HOLD:输入。总线保持请求信号输入端,
请求CPU的总线控制权。
HLDA:输出,对HOLD信号的响应。
为高电平时,表示CPU已放弃总线
控制权。

8088/8086CPU的存储器组织

8088的内部总线和内部寄存器均为16位,通过对存储器分段生成20位地址
物 理 地 址 的 形 成 物理地址的形成
[汇编复习] 记录_第8张图片
(图片引用自《汇编语言与微机原理》一书)

存 储 器 分 段 存储器分段
[汇编复习] 记录_第9张图片
(图片引用自《汇编语言与微机原理》一书)

段基址保存在相应的段寄存器中
逻辑地址
段基地址和段内偏移组成了逻辑地址
格式为:段地址:偏移地址

[汇编复习] 记录_第10张图片
(图片引用自《汇编语言与微机原理》一书)
[汇编复习] 记录_第11张图片
(图片引用自《汇编语言与微机原理》一书)

段基地址为16位,那么计算物理地址时的公式为:
物 理 地 址 = 段 基 地 址 × 16 + 偏 移 地 址 物理地址=段基地址×16+偏移地址 =×16+
等价于
物 理 地 址 = 段 基 地 址 × 10 H + 偏 移 地 址 物理地址=段基地址×10H+偏移地址 =×10H+

(真是不知道自己一开始在迷什么!十进制的16和十六进制的10H不都是一回事儿嘛!!!(lll¬ω¬))

I/O端口地址的管理

令8086微处理器用20位地址总线中的低16位管理64KB的I/O端口空间。
8086微处理器对I/O端口操作时,需要用专门的指令进行操作,并且只能够通过累加器(AL或AX)来完成,
存储器和I/O端口分别独立编址,地址空间分别为 00000 H → 0 F F F F F H 00000H\rightarrow0FFFFFH 00000H0FFFFFH 0000 H → 0 F F F F H 0000H\rightarrow0FFFFH 0000H0FFFFH

例2-1 设 ( C S ) = 0 E D O 0 H , ( I P ) = 0020 H , (CS)=0EDO0H,(IP)=0020H, CS=0EDO0HIP=0020H计算物理地址时,先将CS内容左移4位,得到 0 E D 000 H 0ED000H 0ED000H,再与IP内容相加,即 O E D 000 H + 0020 H = 0 E D 020 H OED000H+0020H=0ED020H OED000H+0020H=0ED020H
0 E D 020 H 0ED020H 0ED020H就是该指令的物理地址。

例2-2 设 ( C S ) = 20 A 8 H , ( I P ) = 02008 H (CS)=20A8H,(IP)=02008H CS=20A8HIP=02008H那么,下一条从内存中读取的指令所在存储单元的物理地址为: 020 A 8 H ∗ 010 H + 02008 H = 022 A 88 H 020A8H*010H+02008H=022A88H 020A8H010H+02008H=022A88H

8088/8086的工作时序

时序:CPU各引脚信号在时间上的关系。
总线周期:CPU完成一次访问内存(或接口)操作所需要的时间。
一个总线周期至少包括4个时钟周期
时钟周期:由时钟发生器产生。是计算机内部最小的时间单位,用 T i T_i Ti表示。
基 本 的 总 线 周 期 时 序 分 析 基本的总线周期时序分析 线
[汇编复习] 记录_第12张图片
基本的总线周期由4个T状态组成( T 1 → T 4 T_1\rightarrow T_4 T1T4)等待时钟周期 T w T_w Tw,在总线周期的 T 3 T_3 T3 T 4 T_4 T4:之间插入
空闲时钟周期T;空闲时钟周期 T i T_i Ti,在两个总线周期之间插入。

在高速的CPU与慢速的存储器或I/O接口交换信息时,为了防止丢失数据,会有存储器或外设通过READY信号线,在总线周期的 T 3 和 T 4 T_3和T_4 T3T4之间插入1个或多个必要的等待状态 T w T_w Tw,用来进行必要的时间补偿。

常用的数据管理方式

[汇编复习] 记录_第13张图片

堆栈及堆栈段的使用

每次压栈和退栈均以字为单位
SS存放堆栈段地址,SP存放段内偏移,SS:SP构成了堆栈指针
堆栈用于存放返回地址、过程参数或需要保护的数据
常用于响应中断或子程序调用0

8086 微处理器的总线操作

8086/8088 CPU基本的总线周期由4个时钟周期组成。时钟周期是CPU的基本时间计量单位,由CPU主频决定,如8086的主频为5MHz,1个时钟周期就是200ns。一个时钟周期又称为一个T状态,因此基本总线周期用 T 1 、 T 2 、 T 3 、 T 4 T_1、T_2、T_3、T_4 T1T2T3T4表示。

T 1 T_1 T1期间8086发出访问目的地的地址信号和地址锁存选通信信号ALE; T 2 T_2 T2期间发出读写命令信号RD、WR及其它有关信号; T 3 T_3 T3期间完成数据的访问; T 4 T_4 T4结束该总线周期。

T 1 T_1 T1状态CPU要不读/写的存储单元的地址或I/O端口的地址放到地址总线上。若是“写”总线周期,CPU从 T 2 T_2 T2起到 T 4 T_4 T4,把数据送到总线上,并写入存储器单元或I/O端口;若是“读”总线周期,CPU则从 T 3 T_3 T3起到 T 4 T_4 T4从总线上接收数据, T 2 T_2 T2状态时总线浮空,允许CPU有个缓冲时间把输出地址的写方式转换成输入数据的读方式。

具有等待状态的总线周期。在 T 3 T_3 T3状态结束之前,CPU测试READY信号线,如果为有效的高电平,则说明数据已准备好,可进入 T 4 T_4 T4状态;若READY为低电平,则说明数据没有准备好,CPU在 T 3 T_3 T3之后插入一个或多个等待周期 T w T_w Tw,直到检测到READY为有效高电平后,CPU会自动脱离 T w T_w Tw而进入 T 4 T_4 T4状态。这种延长总线周期的措施允许系统使用低速的存储器芯片。

第三章

寻址方式

在8086/8088系统中,将寻址方式一般分为两种类型,一种是寻找操作数的地址,另一种是寻找要执行下一条指令的地址,即程序的地址。后者主要用在程序转移或过程调用时用来寻找目的地址或入口地址,本节主要讲述针对寻找操作数地址的寻址方式。

8086/8088系统共提供了八种寻址方式:
(1)立即数寻址;
立即数寻址是指在指令中直接包含操作数,操作数以指令码的形式存放在代码段中。这种操作数即称为立即数。
立即数可以是8位的,也可以是16位的。如果是16位的,则高字节存放在内存高地址中,低字节存放在内存低地址中,这种存放原则称为“高高低低”原则。立即数寻址的主要功能是用于给寄存器或存储器赋初值。

(2)寄存器寻址;
操作数事先存放在CPU内部的寄存器中,这样在指令中只需要指定该寄存器号即可完成操作数寻址,这种寻址方式称为寄存器寻址。这种寻址方式的操作数可以为8为也可以是16位。如果操作数为8位,寄存器可以是AL、BL、CL、DL;AH、BH、CH、DH。如果操作数为16位,寄存器可以是AX、BX、CX、DX;SI、DI、SP和BP等。

(3)隐含寻址;
隐含寻址是将操作数隐含在指令码中的一种寻址方式。在8086/8088指令系统中,有些指令的操作码不仅包含了操作的性质,还隐含了部分操作数的地址,如乘法指令MUL等。在执行该指令时只须指明乘数的地址,而被乘数以及乘积的地址是隐含且固定的。

(4)直接寻址;
指令中直接给出操作数的16位偏移地址偏移地址也称为有效地址(EA,Effective Address)默认的段寄存器为DS,但也可以显式地指定其他段寄存器——称为段超越前缀偏移地址也可用符号地址来表示,如DATA

注意:这种寻址方式默认认为操作数存放在数据段寄存器DS中,如果操作数不存放在数据段寄存器中,则必须采用段超越前缀的方式书写指令,这样便于计算物理地址。例如若数据存放在附加段中,则指令书写如下:
M O V B X , E S : [ 2000 H ] MOV BX,ES:[2000H] MOVBXES:[2000H]

直接寻址方式常用于处理单个存储器变量的情况,它可实现在64K字节的段内寻找操作数。此外,直接寻址的操作数通常是程序使用的变量。直接寻址方式的指令执行速度快但较寄存器寻址慢。

(5)寄存器间接寻址;
这种寻址方式要求指令中包含存放操作数有效地址的寄存器,操作数存于存储器中有效地址存放在BX、BP(址基寄存器)和SI、DI(变址寄存器)中。
在缺省情况下,如果指令中指定的寄存器是BX、SI或DI,则操作数存放在数据段中,应该用DS寄存器内容作段地址计算操作数物理地址,即: 操 作 数 物 理 地 址 = ( D S ) 左 移 4 位 + ( B X ) 或 ( S I ) 或 ( D I ) 操作数物理地址=(DS)左移4位+(BX)或(SI)或(DI) =DS4+BXSIDI

如果指令指定的寄存器为BP,则操作数存放在堆栈段中,应该用sS段寄存器的内容作为段地址计算操作数物理地址,即: 操 作 数 物 理 地 址 = ( S S ) 左 移 4 位 + ( B P ) 操作数物理地址=(SS)左移4位+(BP) =SS4+BP

如果操作数所在段的段地址不在DS中,则指令可通过指定段超越前缀的方式来读取数据。如:
M O V D X , E S : [ B ] MOV DX,ES:[B] MOVDXES:[B];引用附加段数据这种寻址方式可以用于处理表格。在处理完表格中的一项后,只需要修改寄存器内容就可以取出表格中的下一项进行处理。寄存器间接寻址方式的指令执行速度快但较直接寻址慢。

需要注意的是,在书写表示寄存器间接寻址时,寄存器名一定要放在方括号中。下面两条指令的目的操作数寻址方式完全不同:
M O V [ S ] , B X ; 寄 存 器 间 接 寻 址 MOV[S],BX;寄存器间接寻址 MOV[S]BX
M O V S I , B x ; 寄 存 器 寻 址 MOV SI,Bx;寄存器寻址 MOVSIBx

(6)寄存器相对寻址;
在指令中包含一个寄存器和一个位移量操作数来自存储器,操作数的有效地址是一个基址寄存器(BX,BP)内容或变址寄存器(SI,DI)内容加上位移量(8位或16位)的和,即:
E A = { ( B X ) ( B P ) ( S I ) ( D I ) } + { 8 位 16 位 位 移 量 } EA=\left\{ \begin{matrix} (BX)\\ (BP)\\ (SI)\\ (DI)\\ \end{matrix} \right\}+\left\{\begin{matrix} 8位\\ 16位\\ \end{matrix}位移量\right\} EA=(BX)(BP)(SI)(DI)+{816}

在不指定段超越前缀情况下,如果用BX、SI或DI做寄存器,则段寄存器用DS;如果用BP做寄存器,则段寄存器用SS。

由于指令中给定的8位或16位位移量采用补码形式表示,则在计算有效地址时,先将8位位移量扩展成16位的带符号数,然后再进行计算。当所得有效地址超过FFFFH时,则取其64K的模。

这种寻址方式同样可以处理表格或一维数组中的元素,即将表格首地址作为位移量,间址寄存器中内容设置为元素的下值,利用修改寄存器内容来取得表格任意内容。寄存器相对寻址方式的指令执行速度较快但较寄存器间接寻址慢。

(7)基址变址寻址;
指令中包含一个基址寄存器和一个变址寄存器。操作数存放在存储器中,有效地址为基址器与变址器内容之和。段寄存器依基址寄存器而定,在不指定段超越前缀的情况下,若基地址寄存器为BX,则段寄存器为DS;若基地址寄存器为BP,则段寄存器为SS。即物理地址为:
( D S ) 左 移 4 位 + ( B X ) + { ( D I ) ( S I ) } (DS)_{左移4位}+(BX)+ \left \{ \begin{matrix} (DI)\\ (SI)\\ \end{matrix} \right \} (DS)4+BX+{(DI)(SI)}

( D S ) 左 移 4 位 + ( B P ) + { ( D I ) ( S I ) } (DS)_{左移4位}+(BP)+ \left\{ \begin{matrix} (DI)\\ (SI)\\ \end{matrix} \right\} (DS)4+BP+{(DI)(SI)}

这种寻址方式适用处理数组或表格,数组的首地址可存放在基地址寄存器中,而数组下标存放于变址寄存器,或反之。由于两个寄存器都可改变,所以能更加灵活的访问数组或表格中的元素。基址变址寻址方式的指令执行速度较快但较寄存器相对寻址慢。

注意,基址变址寻址方式不允许将两个基址寄存器或两个变址寄存器组合在一起寻址,即指令中不允许同时出现两个基址寄存器或两个变址寄存器。例如,以下命令是非法的:
M O V A H , [ B X ] [ B P ] ; MOVAH,[BX][BP]; MOVAH[BX][BP]错误!同时出现两个基址寄存器
M O V A H , [ S I ] [ D ] ; MOVAH,[SI][D]; MOVAH[SI][D]错误!同时出现两个变址寄存器
但,下面两种方法表示是合法且等价的:
M O V A H , [ S I ] [ B ] MOVAH,[SI][B] MOVAH[SI][B]
M O V A H , [ B X + S I ] MOV AH,[BX+SI] MOVAH[BX+SI]

(8)相对基址变址寻址。
操作数在存储器中,操作数的有效地址是一个基址寄存器、一个变址寄存器的内容与8位或16位位移量之和,即:
E A = { ( B X ) ( B P ) } + { ( S I ) ( D I ) } + { 8 位 16 位 位 移 量 } EA= \left\{ \begin{matrix} (BX)\\ (BP)\\ \end{matrix} \right\} + \left\{ \begin{matrix} (SI)\\ (DI)\\ \end{matrix} \right\} + \left\{ \begin{matrix} 8位\\ 16位\\ \end{matrix} 位移量 \right\} EA={(BX)(BP)}+{(SI)(DI)}+{816}

当基址寄存器为BX时,则使用DS做段寄存器;当寄址寄存器用BP时,则使用SS做段寄存器。即:
物 理 地 址 = ( D S ) 左 移 4 位 + ( B X ) + { ( S I ) ( D I ) } + { 8 位 16 位 位 移 量 } 物理地址=(DS)_{左移4位}+(BX)+ \left\{ \begin{matrix} (SI)\\ (DI)\\ \end{matrix} \right\}+ \left\{ \begin{matrix} 8位\\ 16位\\ \end{matrix} 位移量 \right\} =(DS)4+(BX)+{(SI)(DI)}+{816}

或 或

物 理 地 址 = ( S S ) 左 移 4 位 + ( B P ) + { ( S I ) ( D I ) } + { 8 位 16 位 位 移 量 } 物理地址=(SS)_{左移4位}+(BP)+ \left\{ \begin{matrix} (SI)\\ (DI)\\ \end{matrix} \right\}+ \left\{ \begin{matrix} 8位\\ 16位\\ \end{matrix} 位移量 \right\} =(SS)4+(BP)+{(SI)(DI)}+{816}

使用这种寻址方式可以很方便的访问二维数组,可以用基址寄存器存放数组的首地址,而变址寄存器和位移量分别存放行和列的值,则利用基址变址相对寻址指令就可以直接访问二维数组中指定的行和列的元素。相对基址变址寻址方式是最复杂的寻址方法,也是最灵活的寻址方法,但该种寻址方式的指令执行速度最慢。

注意,相对基址变址寻址方式同样不允许在指令中同时出现两个基址寄存器或两个变址寄存器。即下列指令是非法的:
M O V A X , 10 H [ B X ] [ B P ] ; MOVAX,10H[BX][BP]; MOVAX10H[BX][BP]错误!同时出现两个基址寄存器
M O V A X , 10 H [ S I ] [ D ] ; MOVAX,10H[SI][D]; MOVAX10H[SI][D]错误!同时出现两个变址寄存器
但,下面4种方法表示是合法且等价的:
M O V A X , [ B X + D I + 10 H ] MOV AX,[BX+DI+10H] MOVAX[BX+DI+10H]
M O V A X , 10 H [ B X + D I ] MOV AX,10H[BX+DI] MOVAX10H[BX+DI]
M O V A X , 10 H [ B X ] [ D I ] M O V A X , 10 H I D I I [ B X ] MOV AX,10H[BX][DI]MOV AX,10HIDII[BX] MOVAX10H[BX][DI]MOVAX10HIDII[BX]

8086/8088常用助记符指令

类型 助记符    功能 注释
数据传送 MOV X X 把数据从源操作数传送到目的操作数 1. 两个操作数不能同时为内存操作数,也不能同时为立即数,目的操作数不能为立即数
2两个操作数的类型须一致
3立即数不能直接传入段寄存器
4CS,IP不能作目的操作数
5段寄存器之间不能直接传送
PUSH X 把指定的寄存器/内存单元的内容压入堆栈 1. 按字操作,CS能入栈内存不能直接寻址.P-2→SP,再写入栈顶
POP X 从栈顶弹出一字到指定的寄存器/内存单元 1. 同上
2. 先弹出一字,再SP-2→SP
XCHG 寄 寄/内 两操作数互换内容
XCHG 寄 指定寄存器同累加器互换内容
IN AC 端口号 从指定端口送数到AL 端口号为立即数,地址为8位
端口号在DX中,地址为16位
OUT 端口号 AL 从AL送数到指定端口
LEA 寄 内存
LDS 寄 内存
LES 寄 内存
把内存偏址送指定寄存器
把内存低2字节送寄存器
高2字节送DS(ES)
只能用通用寄存器,不能用段寄存器
LAHF 把标寄低8位送AH
SAHF 把AH送标寄低8位
PUSHF 标寄入栈
POPF 栈顶弹出进标寄

Σ(っ °Д °;)っ,(lll¬ω¬),(╯‵□′)╯︵┻━┻

循 环 左 移 指 令 R O L 循环左移指令ROL ROL
指令格式:ROL OPR,m
指令参数说明:ROL为指令助记符,OPR是目标操作数,m为移位的次数。其中:目标操作数OPR可以是除立即数外的任何寻址方式;m可以是立即数1或CL,当m>1时,需要将移位次数放在CL寄存器中。
指令操作:将OPR循环左移m位,其执行示意图如下图(1)所示。
指令的功能:完成将操作数OPR循环左移m位,最高位移入CF中,同时再移入最低位构成循环,其最终结果保存至OPR中。在移动次数为1的情况下,若移位后,操作数的最高位与CF标志位的值不相等,则溢出标志位OF=1,否则OF=0,即OF的值表示了移位前后符号位是否变化。若移位次数大于1,则OF状态不定。

算 术 左 移 指 令 S A L 算术左移指令SAL SAL
指令格式:SAL OPR,m
指令参数说明:同指令SHL。
指令操作:同指令SHL。
指令的功能:同指令SHL。
指令SHL与指令SAL的区别是:指令SHL将操作数视为无符号数,而指令SAL将操作数视为有符号数。OF=1对指令SHL不表示左移后溢出,而对指令SAL则表示移位后超出了符号数的表示范围。

辑 逻 右 移 指 令 S H R 辑逻右移指令SHR SHR
指令格式:SHR OPR,m
指令参数说明:SHR为指令助记符,OPR是目标操作数,m为移位的次数。其中:目标操作数OPR可以是除立即数外的任何寻址方式;m可以是立即数1或CL,当m>1时,需要将移位次数放在CL寄存器中。
指令操作:将OPR逻辑右移m位,其执行示意图如下图(2)所示。
指令的功能:完成将操作数OPR逻辑右移m位,结果保存至OPR中。操作数每右移一位,右边的最低位移入标志位CF中,而左边的最高位补0

算 术 右 移 指 令 S A R 算术右移指令SAR SAR
指令格式:SAR OPR,m
指令参数说明:SAR为指令助记符,OPR是目标操作数,m为移位的次数。其中:目标操作数OPR可以是除立即数外的任何寻址方式;m可以是立即数1或CL,当m>1时,需要将移位次数放在CL寄存器中。
指令操作:将OPR算术右移m位,其执行示意图如下图 (3)所示。
指令的功能:完成将操作数OPR算术右移m位,结果保存至OPR中。操作数每右移一位,右边的最低位移入标志位CF中,而左边的最高位始终保持不变。

逻 辑 左 移 指 令 S H L 逻辑左移指令SHL SHL
指令格式:SHL OPR,m
指令参数说明:SHL为指令助记符,OPR是目标操作数,m为移位的次数。其中:目标操作数OPR可以是除立即数外的任何寻址方式;m可以是立即数1或CL,当m>1时,需要将移位次数放在CL寄存器中。
指令操作:将OPR逻辑左移m位,其执行示意图如下图(1)所示。
指令的功能:完成将操作数OPR逻辑左移m位,结果保存至OPR中。在移动次数为1的情况下,若移位后,操作数的最高位与CF标志位的值不相等,则溢出标志位OF=1,否则OF=0。这可用于判断移位前后的符号位是否一致。

循 环 右 移 指 令 R O R 循环右移指令ROR ROR
指令格式:ROR OPR,m
指令参数说明:ROR为指令助记符,OPR是目标操作数,m为移位的次数。其中:目标操作数OPR可以是除立即数外的任何寻址方式;m可以是立即数1或CL,当m>1时,需要将移位次数放在CL寄存器中。
指令操作:将OPR循环右移m位,其执行示意图如下图 (2)所示。
指令的功能:完成将操作数OPR循环右移m位,最低位移入CF中,同时再移入最高位构成循环,其最终结果保存至OPR中。在移动次数为1的情况下,若移位之后新的最高位和次高位不等,则溢出标志位OF=1,否则OF=0。若移位次数大于1,则OF状态不定。

加 法 指 令 加法指令
在8086/8088系统中,加法运算指令有3条,即:普通加法指令ADD、带进位加法指令ADC和加1指令INC。
(1)普通加法指令ADD。
指令格式:ADD OPD,OPS指令参数说明:ADD为指令助记符,OPD和OPS均为操作数,可以是8位或16位的寄存器或存储器操作数,类型可以是字类型或字节类型,但二个操作数类型必须一致,源操作数OPS可以是立即数但目标操作数OPD不能为立即数。但要注意:源操作数和目标操作数不能同时为存储器操作数以及不能对段寄存器进行运算。
指 令 操 作 : ( O P D ) − ( O P D ) + ( O P S ) 指令操作:(OPD)-(OPD)+(OPS) OPDOPD+OPS。指令的功能:完成操作数OPD与操作数oPS的加法运算,结果保存至OPD中。

注意:加法指令的执行对全部6个状态标志位都会产生影响。

(2)带进位加法指令ADC。指令格式:ADCOPD,OPS指令参数说明:ADC为指令助记符,OPD和OPS均为操作数,可以是8位或16位的寄存器或存储器操作数,类型可以是字类型或字节类型,但二个操作数类型必须一致,源操作数OPS可以是立即数但目标操作数OPD不能为立即数。但要注意:源操作数和目标操作数不能同时为存储器操作数以及不能对段寄存器进行运算。
指令操作:(OPD)-(OPD)+(OPS)+CF。
指令的功能:与普通加法指令ADD相同,但在加法运算中CF也要参加运算。
ADC指令主要用于多字节的加法运算中,该指令的执行对全部6个状态标志位都会产生影响。


JNZ : jump if not zero 结果不为零则转移


I N C : i n c r e a s e , 自 加 1 操 作 INC:increase,自加1操作 INC:increase1
L O O P 循 环 指 令 , 循 环 次 数 由 寄 存 器 C X 中 的 值 确 定 LOOP循环指令,循环次数由寄存器CX中的值确定 LOOPCX
Intel80x86系列汇编语言中的LOOP指令,是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,所以,至少执行1次循环体,即至少循环1次。执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。


H L P 、 E N D HLP、END HLPEND
前者是cpu暂停,等到有复位信号或中断信号输入再运行 后者直接结束


O R G ORG ORG
指定一个地址,后面的程序或数据从这个地址值开始分配。
比如:
ORG 100H
MOV AX, 1234H
……
这条MOV 指令的偏移地址就是100H

第四章

汇编语言源程序的语句类型通常有3种:指令语句、伪指令语句和宏指令语句。指令语句能产生目标代码,是CPU可以执行的能完成特定功能的语句,主要由CPU指令组成。伪指令语句是一种不产生目标代码的语句,在汇编过程中告诉汇编程序应如何汇编。宏指令语句是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。

CPU指令在程序运行时由CPU执行,每条指令对应CPU的一种特定操作,如数据传送、算术运算等;而伪指令在汇编过程中由汇编程序执行,如定义数据、分配存储区、定义段以及定义过程等。其次,汇编以后,每条CPU指令都被汇编并产生一条与之对应的目标代码,而伪操作则不产生与之对应的目标代码。

汇编语言程序设计的步骤是:分析实际问题,抽象出数学模型确定解决此数学模型的方法;画操作流程图;分配存储单元;编写程序;静态检查;动态调试。

;程序名:T4-1.ASM
;功能:显示信息“HELLO WORD”
SSEG SEGMENT PARA STACK;堆栈段DW 256DUP(?);堆栈长度SSEG ENDS;堆栈段结束
DSEG SEGMENT;数据段MESS1 DB'HELLO'0DH,0AH,'$';数据块首地址存入MESS中
DSEG ENDS;数据段结束
ESEG SEGMENT;附加段MESS2 DB'WORD'0DH,0AH,'$';数据块首地址存入MESS中
ESEG ENDS;附加段结束
CSEG SEGMENT;代码段;指明寄存器CS为代码段,DS为数据段,ES为附加段ASSUME CS:CSEG,DS:DSEG,ES:ESEG START:MOVAX,DSEG;程序开始,将数据段首地址存入AX MOVDS,AX;(DS)=(AX)
MOV DX,OFFSET MESS1;(DX)为数据块首地址
MOVAH,9;(AH)=9,准备调用中断INT21H;显示信息HELLO MOV AH,4CH;(AH)=4CH,准备调用中断返回INT21H;返回DOS MOV DX,ES:OFFSET MESS2;(DX)为数据块首地址
MOVAH,9;(AH)=9,准备调用中断INT21H;显示信息WORD MOV AH,4CH;(AH)=4CH,准备调用中断返回NT 21H;返回DOS CSEG ENDS;代码段结束
END START;程序结束
DB 用来定义字节(Byte)
DW 用来定义字(Word)
DD 用来定义双字(DWord)

宏汇编

宏是宏汇编语言的主要特征之一。在汇编语言源程序中,若某程序片段需要多次使用,为了避免重复书写,那么可把它定义为一条宏指令。在写源程序时,程序员用宏指令来表示程序片段;在汇编时,汇编程序用对应的程序片段代替宏指令。

宏的使用要经过3个步骤,3个步骤分别为:宏定义、宏调用、宏展开

第五章

从位置上分计算机的存储器分为两大类:
一类叫内部存储器,简称为内存或主存;另一类叫外部存储器,简称外存。

从应用角度可将半导体存储器分为两大类:
随机存取存储器(Random Access Memory,RAM);
只读存储器(Read Only Memory,ROM)。

半导体存储器
存储器由能够表示二进制数的、具有记忆功能的一些物
理器件组成
能存放一位二进制数的物理器件称为一个存储元
若干存储元构成一个存储单元
[汇编复习] 记录_第14张图片

5.2 随机存取存储器

静态存储器SRAM

6264芯片是一个8K×8bit的CMOS静态RAM芯片,其引脚如图5-2所示。它共有28条引出线,其中13根地址线、8根数据线以及4根控制信号线和其它3根线,含义分别为:A0~Al2:
地址信号线。一个存储芯片上地址线的多少决定了该芯片有多少个存储单元。
[汇编复习] 记录_第15张图片
[汇编复习] 记录_第16张图片
[汇编复习] 记录_第17张图片
译码电路
译码电路一将输入的一组二进制编码变换为一个特定的输出信号
6264译码—用于选择某一个存储器芯片,从而确定该存储器芯片在内存中的地址范围。

全地址译码与部分地址译码
全地址译码
用全部的高位地址信号作为译码信号
存储器芯片的每一个单元都占据一个惟一的
内存地址

部分地址译码
用部分高位地址信号作为译码信号
被选中的存储器芯片占有几组不同的地址范围
优点:译码器的构成简单
缺点:减小了总的存储空间

动态随机存储器DRAM

存储元主要由电容构成,由于电容存在酌漏电(放电)现象而使其存储的信息不稳定,故DRAM芯片需要定时刷新

典型DRAM芯片2164A
2164 A : 64 K × 1 b i t 2164A:64K×1bit 2164A64K×1bit
采用行地址和列地址来确定一个单元;行列地址分时传送,共用一组地址信号线;地址信号线的数量仅为同等容量SRAM芯片的一半。
两根地址线,可以访问 2 2 ∗ 2 = 16 2^{2*2}=16 222=16个存储单元

[汇编复习] 记录_第18张图片

只读存储器(ROM)

分 类 { 掩 模 R O M 一 次 性 可 读 写 R O M 可 读 写 R O M { E P R O M ( 紫 外 线 擦 除 ) E F P R O M ( 电 擦 除 ) } } 分类\left\{ \begin{matrix} 掩模ROM\\ 一次性可读写ROM\\ \\ \\ 可读写ROM\left\{\begin{matrix}EPROM(紫外线擦除)\\EFPROM(电擦除)\end{matrix}\right\} \end{matrix} \right\} ROMROMROM{EPROM(线)EFPROM()}

EPROM
特点:
可多次编程写入
掉电后内容不丢失
内容的擦除需用紫外线擦除器

[汇编复习] 记录_第19张图片
[汇编复习] 记录_第20张图片

存储器扩展(字扩展、位扩展、字位扩展)

若己有存储芯片的容量为L×K,要构成容量为M×N的存储器,需要的芯片数为:
M L × N K \frac{M}{L}×\frac{N}{K} LM×KN
进行位扩展(多片并连)以满足字长要求的“存储模块”
对“存储模块”进行字扩展以满足容量要求

解题

1、一个具有14位地址和8位数据的存储器,
(1)该存储器能存储多少字节信息?
(1) 2 14 = 2 4 x 2 10 = 16 K 2^{14}=2^4x2^{10}=16K\tag{1} 214=24x210=16K(1)
(2)如果存储器由 8 K x 4 b i t 8Kx4 bit 8Kx4bitRAM芯片组成,需要多少片?
(2) 16 K x 8 8 K x 4 = 4 片 \frac{16Kx8}{8Kx4}=4片\tag{2} 8Kx416Kx8=4(2)
(3)需要多少位地址做芯片选择?其中多少位用做片内寻址?多少位作为芯片组的选择信号?
(3-1) 需 要 14 b i t 地 址 线 作 芯 片 选 择 需要14 bit地址线作芯片选择\tag{3-1} 14bit线(3-1)
(3-2) 因 为 该 存 储 器 中 独 写 数 据 的 宽 度 为 8 b i t , 所 以 4 片 8 K x 4 b i t R A M 芯 片 要 分 成 两 组 , 用 一 位 地 址 就 可 以 区 分 , 故 需 要 一 位 作 为 芯 片 组 的 选 择 信 号 因为该存储器中独写数据的宽度为8 bit,所以4片8Kx4 bit RAM芯片要分成两组,\\用一位地址就可以区分,故需要一位作为芯片组的选择信号\tag{3-2} 8bit48Kx4bitRAM(3-2)
(3-3) 每 一 组 的 存 储 总 量 为 8 K x 8 b i t = 2 13 x 8 b i t , 所 以 需 要 13 位 地 址 线 片 内 寻 址 每一组的存储总量为8Kx8 bit=2^{13}x8 bit,所以需要13位地址线片内寻址\tag{3-3} 8Kx8bit=213x8bit13线(3-3)

2、用 4 K x 1 b i t 4K x 1 bit 4Kx1bit的RAM芯片组成 16 K x 8 b i t 16K x 8 bit 16Kx8bit的存储器,
(1)需要多少芯片?
(2) A 19 → A 0 A_{19}\rightarrow A_0 A19A0地址线中哪些参与片内寻址?
(2) 4 K B = 2 12 B , 片 内 寻 址 需 要 12 位 地 址 线 , 即 A 11 → A 0 4 KB=2^{12}B,片内寻址需要12位地址线,即A_{11}\rightarrow A_0\tag{2} 4KB=212B,12线A11A0(2)
(3)哪些作为芯片的片选信号?
(3) 4 组 芯 片 可 用 2 位 地 址 线 进 行 区 分 , 即 用 A 13 → A 12 , A 19 → A 14 可 浮 空 或 做 其 他 用 途 4组芯片可用2位地址线进行区分,即用A_{13}\rightarrow A_{12},A_{19}\rightarrow A_{14}可浮空或做其他用途\tag{3} 42线A13A12,A19A14(3)

第六章

I/O接口的功能
I/O端口和I/O接口是两个不同的概念。
I/O接口电路就是将外设连接到总线上的一组逻辑电路的总称,而每个接口电路中都包含一组寄存器,CPU与外设进行信息交换时,各类信息在接口中存入不同的寄存器,一般称这些寄存器为I/O端口。

接口电路应具有以下功能:
1.对命令、数据和状态进行锁存和缓冲
2.提供外设端口地址译码和设备选择
3.为主机和外部设备之间有关信息格式
进行转换
4.信息的输入输出
5.对外部设备进行中断管理
6.可编程功能

主机与外设设备之间交换的信息可分为数据信息、状态信息和控制信息三类。
1.数据信息
数字量:是计算机可以直接发送、接收和处理的数据,是以二进制数形式表示的数据、图形或文字信息,通常是8位、16位和32位。
模拟量:是随时间连续变化的量,如温度、压力、流量、位移、速度等,这些模拟量,计算机不能直接接收和处理,必须先经过A/D转换后才能输入计算机。
开关量:是一些仅有两种状态的量,开关量只要用一位二进制数即可表示,故传送一个字节可控制8个开关量。

2.状态信息
状态信息表明外部设备或接口当前所处的工作状态,用来协调CPU与外部设备之间的输入/输出的操作。
3.控制信息
令控制信息是CPU通过接口传送给外设的信息,用于控制外设的工作方式以及外设的启动或停止。

基 本 结 构 基本结构
[汇编复习] 记录_第21张图片
I/O端口的编址方式
I/O端口与内存单元统一编址这种编址方式又称为存储器映像编址方式。这种编址方式的特点是存储器和I/O端口共用统一的地址空间,它把内存的一部分地址分配给I/O端口。
[汇编复习] 记录_第22张图片
统一编址方式的优点是:
1.在这种编址方式下,访问内存的指令统统适用于访问外设,不需要专用的I/O指令,为访问外设带来了很大的灵活性。
2.I/O控制信号也可以与存储器的控制信号共用,这样就给应用带来了很大的方便。

统一编址方式的缺点是:
1.I/O端口占用内存地址,相对减少了内存可用空间。
2.而且难以区分是访问内存还是访问I/O的指令,降低了程序的可读性和可维护性。

独立编址方式的特点是内存储器和I/O端口各自有自己独立的地址空间。访问I/O端口需要专门的I/O指令。
[汇编复习] 记录_第23张图片
独立编址方式的优点是:
1.专用的输入/输出指令与访问存储器指令有明显区别,程序比较清晰,便于理解和检查。
2.存存储器地址空间不受I/O端口地址空间的影响,存储器和I/O端口的控制结构相互独立,可以分别设计且译码电路简单。独

独立编址方式的缺点是:
1.需要专用的I/O指令,且I/O指令类型少,导致程序设计的灵活性较差。
2.CPU必须提供专门的控制信号以区分对存储器和I/O端口的操作,增加了控制逻辑的复杂性。

80×86CPU组成的微机系统都采用独立编址方式。
在8086/8088系统中,共有20根地址线对内存寻址,内存的地址范围是 00000 H → F F F F F H 00000H\rightarrow FFFFFH 00000HFFFFFH;用地址总线的低16位对I/O端口寻址,所以I/O端口的地址范围是 0000 H → F F F F H 0000H\rightarrow FFFFH 0000HFFFFH
CPU在访问内存和外设时,使用了不同的控制信号来加以区分。例如,当8086CPU的M/IO信号为1时,表示地址总线上的地址是一个内存地址;为0时,则表示地址总线上的地址是一个端口地址。

输入/输出的控制方式

微型计算机系统中,主机与外设之间数据的输入输出方式主要有以下4种:

无 条 件 传 送 ( 又 称 同 步 传 送 ) 查 询 传 送 ( 又 称 异 步 传 送 ) 中 断 传 送 直 接 存 储 器 存 取 ( D M A ) 方 式 无条件传送(又称同步传送)\\查询传送(又称异步传送)\\中断传送 \\直接存储器存取(DMA)方式 DMA

无条件传送方式

无条件传送方式主要用于外部控制过程的各种动作时间是固定的、且是已知的情况,控制对象是一些简单的、随时“准备好”的外设。由于这种方式下CPU对外设进行输入/输出操作时无需考虑外设的状态,故称为无条件传送方式。在与这样的外设交换数据的过程中,数据交换与指令的执行是同步的,因此这种方式也可称为同步传送方式。

查询工作方式

对于那些慢速的或总是准备好的外设,当它们与CPU同步工作时,采用无条件传送方式是实用的,也是很方便的。但在实际应用中,许多外设并不总是处于准备好的状态。由此可以看出,无条件传送方式带有一定的盲目性,为克服无条件传送方式的缺点,可采用查询传送方式。

查询传送方式也称为条件传送方式。在这种传输方式下,当CPU需要与一个I/O设备进行数据传送时,它首先通过程序不断读取并测试端口的状态。如果输入设备处于准备好状态,则CPU执行输入指令从该端口输入数据。输出时,当输出设备处于空闲状态,CPU向该设备输出数据。否则,CPU就要等待,直到外设准备好为止。在这种传送方式避免了无条件传送的盲目性。这种利用程序不断的查询外围设备的状态,根据它们所处的状态来实现数据的输入和输出的方式就称为程序查询方式。

为了实现这种工作方式,外围设备必须向计算机提供一个状态信息,相应的接口除传送数据外,还要有一个传送状态的端口。对于输入过程来说,外设将数据送到接口时,同时使接口状态端口中“准备好”标志位置1。对于输出过程来说,外设取走一个数据后,接口便将状态端口的对应标志位清零。表示当前输出寄存器已经处于“空”状态,可以接收CPU传送的下一个数据。

中断方式

中断传送方式的优点是:
CPU不必查询等待,工作效率高,CPU与外设可以并行工作;由于外设具有申请中断的主动权,故系统实时性比查询方式要好得多。尤其是在外设出现故障,不进行立即处理有可能造成严重后果的情况下,利用中断方式,可以及时处理,避免不必要的损失。

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

直接存储器存取Direct Memory Access,DMA)是指在存储器和外设之间、存储器和存储器之间直接进行数据传送(如磁盘与内存间交换数据、高速数据采集、内存和内存间的高速数据块传送等),传送过程无需CPU介入。
传输速度基本取决于存储器和外设的速度。在这种方式下,CPU放弃对总线的管理,而由硬件来控制,这个硬件称为DMA控制器。
典型的DMA控制器是Intel公司的8237。

DMA控制器(简称DMAC)的功能
(1)收到外设发出的DMA请求后,DMAC要向CPU发出总线请求信号HOLD(高电平有效),请求CPU放弃对三组总线的控制权。
(2)当CPU发出相应信号HLDA(高电平有效)时,表示CPU放弃对三组总线的控制权,由DMAC接管三组总线,实现对总线的控制。
(3)DMAC能向地址总线发出相应的内存单元或外设端口的地址信息,并能够自动修改其地址计数器。
(4)DMAC能够决定传送的字节数,每传送一个字节,字节计数器就自动减1,减为0传送结束。
(5)在DMA传送过程结束后,DMAC从CPU撤回总线请求信号HOLD(置为低电平),CPU也收回应答信号HLDA
(置为低电平),将总线控制权交还给CPU。

DMA控制器的工作过程
当外设准备好时,向DMAC发出DMA请求。
DMAC收到请求后,向CPU发出总线请求保持信号HOLD,申请对三组总线的控制权。
CPU在完成当前总线周期后对HOLD信号进行响应。CPU向DMAC发出总线响应信号HLDA,同时将三组总线均置成高阻状态,由此放弃对总线的控制反。
DMAC得到总线的控制权,并发出DMA响应信号。
由DMAC发出备种控制信号和地址信号,实现外设与内存或内存与内存之间的直接数据传送。
DMAC自动修改地址计数器和字节计数器,每传送一个字节,地址计数器加1(正向传送加1,反向则减1),字节计数器减1,字节计数器减为0传送过程结束。数据传送完后,DMAC就撤销发往CPU的HOLD信号。
CPU检测到HOLD信号失效后,就释放HLDA信号,并在下一个时钟周期重新开始控制总线,继续执行原来的程序。

DMA控制器的工作方式
(1)单次传送方式(每次传送一个字节)在这种方式下,DMAC每次控制总线后只传输一个字节,传输完后即释放总线控制权。这样CPU至少可以得到一个总线周期,并进行有关操作。
(2)连续传送方式(块传送方式)采用这种方式,DMAC申请到总线的控制权后,将一块数据连续传送完后,才释放总线,而不管中间的DMA请求信号是否有效。
(3)按需传送方式(猝发传送)在该方式下,每传输完一个字节,DMAC都要检测I/O接口发来的DMA请求信号是否有效。

总线

P C 总 线 信 号 说 明 PC总线信号说明 PC线
[汇编复习] 记录_第24张图片
总线信号按功能可分为5类:
1.地址线A19~A0(20条)
2.数据线D7~D0(8条)
3.控制线(21条)
4.状态线(2条)
5.定时信号(2条)

PCI 总线

PCI(peripheral component interconnect)是外设互连总线的简称,是由美国Intel等公司推出的32/64位标准总线。
PCI总线主要性能:
(1)数据宽度为32位,可扩展到64位。
(2)总线时钟频率为33MHz/66MHz,数据传输率为132MB/s~264MB/s。
(3)能自动识别外设(即插即用功能)。
(4)采用总线多路复用技术(地址线和数据线共用引脚),减少了引脚数目。
(5)提供地址和数据的奇偶校验。

通用串行总线USB

USB的功能
(1)自动设置。当用户将USB设备连接到计算机上时,操作系统会自动检测该设备,并且加载适当的驱动程序。
(2)用户不需要进行设置。USB外围设备没有用户设置的选项。在安装USB设备时,计算机会自动检测。
(3)USB总线提供电源。USB接口提供+5V电源及500mA的供电电流,可以由计算机或集线器提供。免去功耗较小的外设自带电源的麻烦,对于大功耗的外设仍需外设自备电源。
(4)不同种类的USB外围设备可以使用相同的接口。
(5)不同USB版本可支持三种信道速度:低速(Low Speed)
的1.5Mb/s、全速(Full Speed)的12Mb/s,以及高速(High Speed)的480Mb/s,适用于不同设备的要求。可连接键盘、鼠标、移动盘、Modem、扫描仪、数码相机、打印机等外设。具备USB功能的计算机都支持低速与全速,而高速则需要支持USB2.0的主机板或扩充卡。
6)USB外围设备处在待机状态时,会自动启动省电的功能来降低功耗。当要使用设备时,又会自动恢复原来的状态。
(7)USB硬件设计成熟,数据传输稳定。USB驱动程序、接收器以及电缆的硬件规范都能尽量减少因噪声干扰而产生的数据错误。若USB协议检测到数据有错误,它会通知发送端重新传送数据。
(8)USB的4种传输类型(控制、中断、批量、实时)和3种传输速度(低速、全速、高速)让外围设备可以有广泛的选择。不管是交换少量数据还是大量的数据,或有无时效的限制,都有适合的传输类型。
(9)操作系统的支持。在微软的操作系统中,Windows98是第一个支持USB的操作系统,其后是Windows 2000。

第七章

中断

PC中各种类型的中断共有256个,并对它们进行了统一的编号,称为中断类型码。

当CPU用查询的方式与外设交换信息时,CPU就要浪费很多时间去等待外设。这样就引出一个快速的CPU与慢速的外设之间数据传送的矛盾。为解决这个问题,发展了中断慨念。中断系统是计算机的重要指标之一。
外设向CPU发出中断请求,CPU接收到请求并在一定条件下,暂时停止执行原来的程序而转去中断处理,处理好中断服务再返回来执行原来程序,这就是一个中断概念。

中断源 引起CPU中断的事件
外设 请求输入输出数据,报告故障等
事件 掉电、硬件故障、软件错误、非法操作、定时时间到等。
中断源分类
内部中断: CPU内部执行程序时自身产生的中断
外部中断: CPU以外的设备、部件产生的中断
软中断: 由中断指令INT n引发的中断
保留中断: 除数0,INT n,断点、溢出、NMI、INTR、单步
按照是否可以被屏蔽,可将中断分为两大类:
不可屏蔽中断(又叫非屏蔽中断,NMI) 不可屏蔽中断源一旦提出请求,CPU必须无条件响应
可屏蔽中断INTR) 而对可屏蔽中断源的请求,CPU可以响应,也可以不响应。
对于可屏蔽中断,除了受本身的屏蔽位控制外,还都要受一个总的控制,即CPU标志寄存器中的中断允许标志位IF的控制,IF位为1,可以得到CPU的响应,否则,得不到响应。

IF位可以由用户控制,指令STI将IF位置1(开中断),指令CLI将IF位清0(关中断)。

过程

请 求 中 断 → 响 应 中 断 → 关 闭 中 断 → 保 护 断 点 → 中 断 源 识 别 → 保 护 现 场 → 终 端 服 务 → 恢 复 现 场 → 中 断 返 回 请求中断\rightarrow 响应中断\rightarrow 关闭中断\rightarrow 保护断点{\rightarrow}\\ 中断源识别\rightarrow 保护现场\rightarrow 终端服务\rightarrow 恢复现场\rightarrow 中断返回

中断优先级

中断优先级控制
对同时产生的中断:应首先处理优先级别较高的中断;若优先级别相同,则按先来先服务的原则处理;对非同时产生的中断:低优先级别的中断处理程序允许被高优先级别的中断源所中断——即允许中断嵌套。

中断优先级的控制方法
硬件判优——链式判优、并行判优(中断向量法)
软件判优——顺序查询中断请求,先查询的先服务
通常将中断判优与中断源识别合并在一起进行处理
x86系统中,这项任务由PIC和CPU共同完成

优先级从高到低顺序如下
内部中断
NMI
INTR
单步中断

[汇编复习] 记录_第25张图片

8088系统采用中断类型(向量)码来识别不同的中断源。
每个中断源都有一个与它相对应的中断类型码
溢出、断点、除法溢出、单步、非屏蔽中断的类型码为固定值,软件中断的类型码由指令给出
可屏蔽中断的类型码由PIC给出

中断向量

所谓中断向量(interrupt vector),实际上就是中断服务程序的入口地址,每个中断类型对应一个中断向量。

其中:
每个中断向量占4字节的存储单元。
前两个字节单元存放中断服务程序入口地址的偏移量IP),低字节在前,高字节在后;后两个字节单元存放中断服务程序入口地址的段基

中断向量表

80x86实模式系统允许引入的中断可达256个,因此需占用1K字节的存储空间来存放这256个中断服务程序入口地址。
80x86实模式系统把中断服务程序入口地址信息设置在存储器的最低端,即从00000H~003FFH的1K字节存储空间中。
这一存储空间就叫中断向量表。
[汇编复习] 记录_第26张图片

中断向量地址计算

中断向量的地址=中断向量表的首地址 ( 00000 H ) + 4 × n (00000H)+4\times n (00000H)+4×n
中断类型码为2的中断,其中断向量的地址为 00008 H 00008H 00008H

中断类型码为N的中断服务程序入口地址。由于中断服务程序入口地址在中断向量表中是按中断类型号顺序存放的,所以每个中断服务程序入口地址在中断向量表中的位置可由中断类型号 × 4 \times4 ×4计算出来。CPU响应中断时,用中断类型号 N × 4 N\times4 N×4,得到对应地址 4 N 4N 4N(该中断服务程序入口地址所占4个单元的第一个单元的地址),然后把由此地址开始的两个低字节单元 ( 4 N , 4 N + 1 ) (4N,4N+1) (4N,4N+1)的内容装入IP寄存器,再把两个高字节单元 ( 4 N + 2 , 4 N + 3 ) (4N+2,4N+3) (4N+2,4N+3)的内容装入CS寄存器,于是CPU转入中断类型号为N的中断服务程序。

可编程中断控制器8259A

[汇编复习] 记录_第27张图片
外 部 引 线 外部引线 线
可对8个中断源实现优先级控制
可扩展至对64个中断源实现优先级控制Cs,片选信号(Chip Select)低电平有效,来自地址译码器的输出只有CS有效时,CPU才能对8259A进行读写操作。
WR,写信号,低电平有效,来自CPU的输出;当WR有效且CS有效时,WR使8259A接受CPU送来的命令字。

RD,读信号,低电平有效,来自CPU的RD输出;当CS有效且RD有效时,使8259A将状态信息放到数据总路线上,供CPU检测。
D 7 → D O D7\rightarrow DO D7DO:双向数据总线,接到系统数据总线的 D 7 → D O D7\rightarrow DO D7DO上,用来传送控制字、状态字和中断类型号。
IR7~IRO:中断请求信号,输入,来自外部接口电路。
(单片时)INT:向CPU发出的中断请求信号。(单片时)。
INTA:中断响应信号,由此接收CPU发来的中断响应脉冲。

内 部 结 构 内部结构
中断请求寄存器IRR
保存从IR0~IR7来的中断请求信号
某位=1表示对应的IR:有中断请求

中断服务寄存器ISR
保存所有正在服务的中断源
某位=1表示对应的IRi中断正在被服务

中断屏蔽寄存器IMR
存放中断屏蔽字
某位=1表示对应的IRi输入被屏蔽

中断优先权判别电路
确定是否向CPU发出中断请求
中断响应时确定ISR的哪位应置位及把相应中断
的类型码放到数据总线上

第八章

可编程定时器/计数器 8253

8253芯片内具有3个独立的16位减法计数器,称为计数通道
最高计数频率2.6MHZ,可编程设定为按二进制计数或BCD码计数。
有6种工作方式,可编程确定工作在任意方式。

内部结构

[汇编复习] 记录_第28张图片
(1)数据总线缓冲器:三态、双向的8位缓冲器,用于将8253与系统数据总线连接。CPU执行I/O指令时,缓冲器发送或接收数据,用以写入8253控制字、装入计数初值或读出当前计数值。
(2)读/写逻辑:读/写逻辑电路接受来自系统总线的信号,然后产生控制整个芯片工作的控制信号。
(3)控制字寄存器:当A1、A0全为1时,接收并存储来自数据总线缓冲器的控制字。每个计数器对应1个控制寄存器,只能写入,不能读出。
(4)计数器0~2:三个计数器内部结构相同,每个计数器有一个16位减法计数器,可对二进制数或BCD码进行计数。某些方式下,一次计数结束可以自动取初值进行下一次计数。每个计数器都有时钟输入CLK、门控输入GATE和输出OUT引脚。

引脚

[汇编复习] 记录_第29张图片
8253为24脚双列直插式封装结构,其引脚按功能分为与CPU接口引脚和与外设接口引脚二类
1)与CPU的接口引脚:
D7~D0:三态双向数据线,与CPU数据总线直接相连。
WR:写控制信号,输入,低电平有效。
RD:读控制信号,输入,低电平有效。
A1,A0:地址线,输入,用于端口选择。
A1A0=11,选中控制寄存器端口,可以向8253送控制字;A1A0=00、01、10,分别选择计数器0、1、2,可以对它们读写计数值。
CS:片选信号,输入,低电平有效。

2)与外设的接口引脚:
CLK0~2:计数器0、1、2的外部计数时钟输入端。
GATEO~2:计数器0、1、2的门控信号输入端。门控信号用来禁止、允许或重新开始一个新计数过程。
OUTO~2:计数器0、1、2的计数输出端。当定时/计数时间到时,该端输出标志信号。

工作方式

8253有六种不同的工作方式。在不同的工作方式下,计数过程的启动方式不同

OUT端的输出波形不同,自动重复功能

GATE的控制作用以及更新计数初值对计数过程的影响也不完全相同。

同一芯片中的三个计数器,可以分别编程选择不同的工作方式。

工作方式比较
[汇编复习] 记录_第30张图片

8255A

各端口读写操作时的信号关系
[汇编复习] 记录_第31张图片
8255A引脚及功能示意图
[汇编复习] 记录_第32张图片

习题

https://www.docin.com/p-2146819626.html

  1. 已知某外设端口地址为51H(状态端口)、50H(数据端口),其中状态字最高位D7位为外设空闲状态位,设D7=1表示“外设忙”,请编写查询输出的程序段。

解:(0正、1负)

        L2:
        IN   AL,STATUS_PORT
        TEST AL,80H 
        JNZ  L2
        MOV  AL,DATA 
        OUT  DATA_PORT AL

先将状态端口地址交给 AL
test 命令 比较,如果和端口地址不相同
说明端口忙
然后跳转回L2的位置
如果和端口地址相同,说明端口空闲,然后将数据交给AL
最后输出,AL中的数据交给数据端口

Test命令:将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。
JNZ : jump if not zero 结果不为零则转移

你可能感兴趣的:(汇编语言)