Principle and Application of Microcomputer
微 机 原 理 及 应 用教 师:田 行 斌单 位:机 电 系
R2R2
学习内容
• 微型计算机系统概述• 微处理器指令系统• 汇编语言程序设计• 微处理器外部特性• 半导体存储器系统• 基本输入输出接口• 并行接口及其应用
学习目的
• 了解微型计算机的硬件知识
• 熟练掌握汇编语言程序设计
• 建立微机系统的整体概念,为接口开发及应用奠定基础
微型计算机系统概述
• 微型计算机的发展和应用
• 微型计算机的系统组成
• 计算机中的数据表示
微型计算机的发展
• 第 1 代: 4 位微机。 CPU : 4004• 第 2 代: 8 位微机。 CPU : 8080• 第 3 代: 16 位微机。 CPU : 8086 、 808
8• 第 4 代: 32 位微机。 CPU : 80386 、 P
entium• 第 5 代: 64 位微机。 CPU : Itanium
微型计算机的应用
•用于数值计算、数据处理及信息管理
•用于过程控制及嵌入应用方向
微型计算机系统的组成
•硬件系统: CPU 、存储器、 I/O 接口、 I/O 设备、系统总线
•软件系统: 系统软件-操作系统、语言处理软件等 应用软件-为某个应用编制的程序
微机系统的硬件组成
控制总线 CB数据总线 DB地址总线 AB系
统总线形成
处理器子系统
I/O 设备
I/O 接口
存储器
系统总线
IBM PC 系列计算机
IBM PC/ATIBM PC/XT
计算机中的数据表示
• 计算机中各种信息均表示为二进制数据。
• 数:用来直接表征量的多少,可进行运算。
• 码:指代码或编码,用来代表某个事物。
基本术语
• 位 (Bit) :二进制位,为 0 或 1。
• 字节 (Byte) : 8 个二进制位。• 字 (Word) : 2 字节 (16 位 ) 数
据。• 双字 (Double Word) : 4 字节数
据。• 千字节 (KB) : 210 个字节。• 兆字节 (MB) : 220 个字节。
计算机中的数
• 二进制数后缀为 B 或 b ,十进制数后缀为 D或 d ,十六进制数后缀为 H 或 h 。
• 二进制数:由数字 0 和 1 组成,基数为 2 ,逢2 进 1 ,各个数位的权值由右向左依次为 20 、21 、 22 、 23 、… 。
• 十六进制数:由数字符号 0-9 、 A-F 组成,基数为 16 ,逢 16 进 1 ,各个数位的权值由右向左依次为 160 、 161 、 162 、 163 、… 。
二进制数与十进制数之间的转换
• 二进制数到十进制数的转换:按权展开求和
00001011B = 1×23 + 1×21 + 1×20 = 11D
• 十进制数到二进制数的转换:除基取余
建议按照按权展开的逆过程进行
二进制数与十六进制数之间的转换
• 每 4 位二进制数对应 1 位十六进制数
0000B=0H 0100B=4H 1000B=8H 1100B=CH0001B=1H 0101B=5H 1001B=9H 1101B=DH0010B=2H 0110B=6H 1010B=AH 1110B=EH0011B=3H 0111B=7H 1011B=BH 1111B=FH
• 十六进制数常用来简化对二进制数的书写
计算机中的码
• 用于表示有符号数的补码。
• 用于表示十进制数的 BCD 码。
• 美国标准信息交换码 ASCII 码。
补码
• 计算机内部默认采用补码表示有符号数。规定:最高有效位为符号位, 0 表示正数, 1 表示负数。
• 正数的补码:最高有效位为 0 ,其余各位为该整数的二进制表示。如: ( + 2) =( 00000010B)补
• 负数的补码:最高有效位为 1 ,其余各位可对该整数的二进制表示求补(即按位取反再加 1 )得到。如: ( - 2) =( 11111110B )补
补码的性质
• (X) 补 + (Y) 补= (X + Y) 补= (X) 补 + ( + Y) 补
• (X) 补 - (Y) 补= (X - Y) 补= (X) 补 + (- Y) 补
• 采用补码表示有符号数可将减法转换为加法。
有关补码的问题• 1) 已知(负数)补码求真值
按权展开求和,但符号位的权值要取为相反数。 (10000010B) 补= 1×( - 128) + 1×2 =- 126
• 2) 已知补码求相反数的补码 (+4)=(00000100B) 补 (-4)=(11111100B) 补
由右向左抄写,遇到0照写,遇到第一个1也照写,其后各位按位取反。据此,可根据一个正数的补码得到其相反数 ( 负数 ) 的补码。
补码的符号扩展
• 补码的符号扩展是指将有符号数的长度扩展而不改变其值。原则是:新扩的左侧各位均复制原符号位上的值。
(68H) 补 = (0068H) 补 (86H) 补 = (FF86H) 补
BCD 码
•Binary Code Decimal :二进制编码的十进制数
•压缩的 8421BCD 码 0000B=0 0011B=3 0110B=6 1001B=9 0001B=1 0100B=4 0111B=7 0010B=2 0101B=5 1000B=8
ASCII 码
• 美国标准信息交换码。码长 7 位,用来表示 34个外设控制符号和 94 个可供打印的西文符号。
数码 0~9 的 ASCII 码为 30H~39H;大写字母 A~Z的 ASCII 码为 41H~5AH;小写字母 a~z的 ASCII 码为 61H~7AH;0DH 表示回车, 0AH 表示换行。
第一章教学要求
• 掌握微机系统的组成
• 熟练二进制数与十进制数的转换、二进制数与十六进制数的转换
• 熟练掌握有符号数的补码表示、 BCD 码
第一章练习
• 8 位机器数所能表示的无符号数和有符号数的范围是多少? 16 位机器数呢?
• (+ 37 )和(- 37 )的补码是多少?• 数据 50 和 50H所对应的 BCD 码是多少?• 8 位机器数 46H ,若作为无符号数、有符号数补
码、 BCD 码、 ASCII 码,各代表什么?
微处理器指令系统
• 微处理器的内部结构
• 8086/8088 的寻址方式
• 8086/8088 指令系统
微处理器的基本结构
• 算术逻辑单元 ALU( 运算器 )
• 寄存器组:包括通用寄存器,地址寄存器,标志寄存器。
• 指令处理单元 ( 控制器 ) :包括指令寄存器,指令译码逻辑,时序和控制逻辑。
8086/8088 的功能结构
• 总线接口单元 BIU :由指令队列、指令指针 IP 、段寄存器、地址加法器和总线控制逻辑等组成,负责 CPU 对存储器和外设进行访问。
• 执行单元 EU :由 ALU 、数据寄存器、地址寄存器、标志寄存器和指令译码逻辑等组成,负责指令的译码、执行和数据的运算。
8086 的内部结构图
8086/8088 的寄存器结构
•8086/8088 中有 14 个 16 位寄存器•通用寄存器 AX 、 BX 、 CX 、 DX 、 SI 、 DI、 BP 、 SP•指令指针 IP•标志寄存器 FLAGS•段寄存器 CS 、 SS 、 DS 、 ES
通用寄存器
• 16 位的通用寄存器有 8 个,它们是:AX 、 BX 、 CX 、 DX 、 SI 、 DI 、 BP 、 SP
• 其中,前 4 个寄存器(即 AX 、 BX 、 CX 、 DX )还可以各分成高 8 位和低 8 位的两个独立的 8 位寄存器,它们分别是:AH 、 AL, BH 、 BL, CH 、 CL, DH 、 DL
寄存器 AX/BX/CX/DX
• AX : 16 位累加器,用于算术运算以及与外设传送信息等; AL为 8 位累加器。
• BX :基址寄存器,常用来做基址指针,指向一批连续存放的操作数的基地址。
• CX :计数器,作为循环和串操作等指令中的隐含计数器。
• DX :数据寄存器,用来存放外设端口的 16 位地址,或双字长数据的高 16 位。
变址寄存器 SI/DI
• 变址寄存器常用于存储器寻址时提供地址。
• SI是源变址寄存器。
• DI是目的变址寄存器。
• 在串操作类指令中, SI 和 DI具有特别的功能。
指针寄存器 SP/BP
• 指针寄存器用于寻址内存堆栈中的数据。
• SP 为堆栈指针寄存器,指示栈顶的偏移地址。SP不能再用于其他目的,具有专用性。
• BP 为基址指针寄存器,表示数据在堆栈段中的基地址。
• SP/BP寄存器与 SS堆栈段寄存器联合使用以确定堆栈段中的存储单元地址。
指令指针 IP
• 指令指针 IP ,指示代码段中指令的偏移地址。
• 它与代码段寄存器 CS联用,确定下一条指令的物理地址。 CPU通过 CS:IP 来取指,从而控制指令序列的执行流程。
• IP是一个专用寄存器,用户不能直接访问。
标志寄存器 FLAGS
• 标志( Flag)用于反映指令的执行结果或控制指令的执行形式。各种标志存放于一个 16 位的标志寄存器 FLAGS 中。
• 标志分成两类状态标志:用来记录程序运行结果的状态信息;控制标志:用于控制处理器的具体工作方式。
状态标志 CF/PF/AF
• CF—进位标志位。做加减运算时,若最高有效位有进位或借位,则 CF置 1 ,反之置 0 。
• PF—奇偶标志位。当运算结果的低 8 位中 l 的个数为偶数时,则 PF置 1 ,反之置 0 。
• AF—半进位标志位。做加减运算时,若 Bit3 有向 Bit4 的进位或借位,则 AF置 1 ,反之置 0 。
状态标志 ZF/SF/OF
• ZF—零标志位。运算结果为 0时, ZF置 1 ,否则置 0 。
• SF—符号标志位。运算结果的最高位为 1时,SF置 1 ,否则置 0 。
• OF—溢出标志位。若有符号数的加减运算有溢出, OF置 1 ,否则置 0 。
控制标志 TF/IF/DF
• 陷阱标志TF (单步标志): TF = 1 , CPU单步执行指令;TF = 0 , CPU 正常工作。
• 中断允许标志 IF :控制外部可屏蔽中断是否可以被 CPU响应。 IF = 1允许中断, IF = 0禁止中断。
• 方向标志 DF :用于串操作指令中控制地址的变化方向。 DF = 0 地址增加; DF = 1 地址减少。
8086/8088 的存储器结构
• 存储器以字节为单位存储信息。每个存储器单元 ( 字节单元 )都有一个地址。
• 8086/8088 有 20根地址线。最大可寻址的存储器单元数为 220 = 1MB 。
• 其物理地址范围为 00000H~FFFFFH 。例如: [00002H]= 34H 。
小端方式• 字或双字信息在存储器中占相邻的 2 个或 4 个
存储单元。
• 多字节数据占据的地址空间用低地址来表示。
• 按“小端方式”存储,即“低字节对低地址、高字节对高地址”。例如: [00002H]= 1234H ,意指: [00002H]= 34H , [00003H]= 12H 。
存储器的分段管理
• 8086/8088 将 1MB 存储器空间分成若干个逻辑段来管理。每个段最大限制为 64KB 。
• 采用逻辑地址 (段地址:偏移地址 ) 的形式来表达段中每个存储器单元的 20 位物理地址。
• 段地址和偏移地址都是 16 位二进制数。
段地址
• 段地址说明该逻辑段在内存中的起始位置,即该段中的第一个内存单元的物理地址。
• 规定段地址必须是模 16 地址,即 ××××0H 的形式,故可采用 16 位二进制数据表示,保存在 16 位的段寄存器 (CS,DS,ES,SS) 中。
偏移地址
• 偏移地址说明该段中某个内存单元距离该段起始位置的偏移量。
• 由于每个段的长度不超过 64KB ,故偏移地址也可采用 16 位二进制数据表示。
逻辑地址和物理地址
• 物理地址 = 段地址 ×10H + 偏移地址。
• 一个存储器单元只有一个唯一的物理地址。
• 但一个存储器单元可以拥有多个逻辑地址。
代码段( Code Segment )
• 代码段主要用来存放指令代码(程序),也可存放数据。
• 代码段寄存器 CS 存放代码段的段地址。
• 指令指针寄存器 IP 指示下条指令的偏移地址。
• 处理器利用 CS:IP 取得下一条要执行的指令。
数据段( Data Segment )
• 数据段存放程序所使用的数据。
• 数据段寄存器 DS 存放数据段的段地址。
• 通过各种存储器寻址方式得到存储器中操作数的偏移地址(有效地址 EA )。
• 处理器利用 DS:EA 存取数据段中的数据。
附加段( Extra Segment )
• 附加段是附加的数据段,也用于数据的保存。
• 附加段寄存器 ES 存放附加段的段地址。
• 通过各种存储器寻址方式得到存储器中操作数的偏移地址(有效地址 EA ) 。
• 处理器利用 ES:EA 存取附加段中的数据。
堆栈段( Stack Segment )
• 堆栈段用于堆栈 (Stack) ,用来暂时存放数据、保存程序断点、和向子程序传递参数等。
• 堆栈段寄存器 SS 存放堆栈段的段地址。
• 堆栈指针寄存器 SP 指示堆栈栈顶的偏移地址。
• 处理器利用 SS:SP 操作堆栈栈顶的数据。
逻辑段的使用
• 程序的指令序列必须安排在代码段。
• 程序使用的堆栈一定在堆栈段。
• 程序中的数据默认是安排在数据段,也经常安排在附加段。数据的存放比较灵活,实际上可以存放在任何一种逻辑段中。
8086/8088 的寻址方式
• 指令由操作码和操作数两部分组成。如: MOV AH , 0B9H ;将 B9H传送到 AH寄存器
• 操作码说明计算机要执行何种操作,是指令中不可缺少的部分。操作数就是各种操作的对象。指令可以有一个、两个或没有操作数。
• 寻找操作数的方式(或操作数的存放方式)叫做操作数的寻址方式。
操作数
• 操作数可以是一个具体的数值,存放于操作码之后,称为立即数操作数;
• 操作数可以是存放数据的寄存器,数据存放于该寄存器中,称为寄存器操作数;
• 操作数可以是用某种方式指明的数据所在的存储器单元的地址,数据存放于该存储器单元中,称为存储器操作数。
立即数寻址方式
立即数操作数 (imm)紧跟在操作码之后,作为指令的一部分存放在操作码之后的内存单元中。它可以是 8 位数值 (i8) ,也可以是 16 位数值 (i16)。
MOV AX , 1234H;
操作数 1234H就是使用立即数寻址方式。指令执行后 AX=1234H ,其中 AH=12H , AL=34H 。
寄存器寻址方式
• 寄存器操作数存放于 CPU 的内部寄存器 reg中。它可以是 8 位寄存器 (r8 ,可以是 AH/AL/BH/BL/ CH/CL/DH/DL 之一 ) ,或是 16 位寄存器(r16 ,可以是 AX/BX/CX/DX/SI/DI/BP/SP之一,也可以是段寄存器 CS/DS/SS/ES之一 ) 。
• MOV AX , BX;• 操作数 AX 、 BX 均使用寄存器寻址方式。指令执行后 AX 中的值与 BX 中的值相同,而 BX 中的值不变。
存储器寻址方式
• 存储器操作数存放于存储器单元中。指令中给出的是操作数所在的存储器单元的逻辑地址。因段地址默认在数据段寄存器 DS 中,故只要给出偏移地址即可。有以下 5 种具体方式:
• 直接寻址方式寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址
直接寻址方式
• 指令中直接给出操作数的有效地址。段地址默认在数据段寄存器 DS 中,可以使用段超越前缀来改变。
• 设 DS=ES=1492H , [16920H]=12H , [16921H]=34H
• MOV AH , [2000H] ; AH=12H• MOV AX , ES:[2000H] ; AX=3412H
符号地址
• 实际编程时,通常是通过定义变量,然后使用变量名(符号地址)来指代该变量所在内存单元的偏移地址。
• WVAR DW 3412H;设 WVAR 的偏移地址为2000H• • • • •MOV AX , [2000H] ; AX=3412H MOV AX , [WVAR] ; AX=3412H ,中括号可省略
变量• 变量实质上是指内存单元的数据,因而可以改变。变量需要事先定义才能使用。
• 变量名 伪指令 初值表• 变量名是用户自定义的标识符,用来表示该变量所占用的内存单元的首地址。
• 变量定义伪指令为变量分配或预留内存单元。其中 DB 用来定义字节变量, DW 用来定义字变量。
• 初值表是用逗号分隔的参数,是用户定义的多个数据初值。
寄存器间接寻址方式
• 操作数的有效地址存放于基址类寄存器 BX 、 BP或变址类寄存器 SI 、 DI 中。当使用寄存器 BX/SI/DI寻址时,默认的段寄存器为 DS;当使用寄存器BP寻址时,默认的段寄存器为 SS 。均可以使用段超越前缀改变。
• 设 DS=1492H , ES=1492H , BX=2000H , [16920H]=12H
• MOV AL, [BX] ; AL=12H• MOV DH , ES:[BX] ; DH=12H
寄存器相对寻址方式
• 操作数的有效地址是寄存器 (BX/BP/SI/DI) 的内容与有符号的 8 位或 16 位位移量之和。当使用寄存器 BX/SI/DI寻址时,默认的段寄存器为 DS;当使用寄存器 BP寻址时,默认的段寄存器为SS 。均可以使用段超越前缀改变。
• 设 DS=ES=1492H , SI=2000H , [16926H]=12H
• MOV AL, [SI + 06H] ; AL=12H• MOV DH , ES:[SI+06H] ; DH=12H
基址变址寻址方式
• 操作数的有效地址是一个基址类寄存器 (BX 或 BP) 的内容与另一个变址类寄存器 (SI 或 DI) 的内容之和。当使用基址寄存器 BX时,默认的段寄存器为 DS;当使用基址寄存器 BP时,默认的段寄存器为 SS 。均可以使用段超越前缀改变。
• 设 DS=1492H , BX=2000H , SI=06H , [16926H]=12H
• MOV AL, [BX + SI] ; AL=12H
相对基址变址寻址方式
• 操作数的有效地址是一个基址类寄存器 (BX 或 BP) 的内容,一个变址类寄存器 (SI 或 DI) 的内容与有符号的 8 位或 16 位位移量之和。当使用基址寄存器 BX时,默认的段寄存器为 DS;当使用基址寄存器 BP时,默认的段寄存器为 SS 。均可以使用段超越前缀改变。
• 设 DS=1492H , BX=2000H , DI=04H , [16926H]=12H
• MOV AL, [BX + DI+02H] ; AL=12H
8086/8088 指令系统
• 数据传送类指令
• 算术运算类指令
• 按位操作类指令
• 控制转移类指令
• 处理器控制指令
操作数的表示符号的约定
• i8 - 8 位立即数, i16 - 16 位立即数imm -代表 i8 或 i16
• r8 - 8 位寄存器, r16 - 16 位寄存器reg-代表 r8 或 r16
• seg-段寄存器 CS 、 DS 、 ES 、 SS• m8 - 8 位存储器操作数
m16 - 16 位存储器操作数, mem -代表 m8 或 m16
• dest -目的操作数src -源操作数
MOV 指令
• MOV reg/mem , imm ;立即数送寄存器或主存
• MOV reg/mem/seg, reg ;寄存器送 (段 )寄存器或 ;主存
• MOV reg/seg, mem ;主存送 (段 )寄存器• MOV reg/mem , seg ;段寄存器送寄存器或主存
MOV 指令注意事项( 1)
• 目的操作数与源操作数必须类型一致。MOV AX , BH ;错误指令
• 目的操作数不能是立即数。MOV 2000 , AX;错误指令
• 立即数不能超过目的操作数的表示范围。MOV AL, 2000;错误指令
• 两个操作数不能都是存储器操作数。假设wbuf1 、wbuf2是两个字变量MOV wbuf1 ,wbuf2;错误指令
MOV 指令注意事项( 2)
• 不能将任何数据传送给 CS寄存器。MOV CS , AX ;错误指令
• 指令指针 IP不能作为操作数。MOV AX , IP ;错误指令
MOV 指令注意事项( 3)
• 两个操作数不能都是段寄存器。MOV DS , ES ;错误指令
• 立即数不能直接传送至段寄存器。MOV DS , 2000H ;错误指令
MOV 指令练习
•将 BH 中的无符号数(有符号数)传送至 AX•将字变量 Wbuf2 的内容传送至字变量 Wbuf1•将 ES 的内容传送至 DS•将段寄存器 DS赋初值 2000H•将立即数 12H传送至偏移地址为 2000H 的内存单元
XCHG 指令• XCHG reg, reg/mem;• XCHG reg/mem , reg;
• 源操作数与目的操作数内容互换• MOV AX , 1234H; AH=12H , AL=34HXCHG AH , AL ; AH=34H , AL=12H
• 不能在内存单元之间交换数据。• 段寄存器不能作为操作数。
XCHG 指令练习
• 将字变量 A 、 B 的内容互换
• A DW 1234HB DW 5678H
XLAT 指令
• XLAT ; AL= [BX+AL]XLAT table; table 为字节表格变量名 ;利用该变量名,可进行段超越。
• 换码 (查表转换 ) 过程为:先在主存中建立一字节表格;将表格的首地址存放于 BX寄存器中;将欲查元素的序号存放于 AL 寄存器中;执行 XLAT,则 AL中的内容即为欲查元素。
十六进制数到 ASCII 码的转换
• TABLE1 DB 30H,31H,32H,33H,34H,35H, \36H,37H,38H,39H,41H,42H,43H,44H,45H,46H
• • • • • MOV BX , OFFSET TABLE1MOV AL, 04HXLAT ; AL=34H , OFFSET取变量的偏移地址
堆栈操作指令
• 堆栈( Stack) 是主存中开辟的用于暂时存放数据的一个特殊区域。按先进后出或后进先出的原则管理,类似于货舱中摞放货物。
• 堆栈段的段地址存放于段寄存器 SS 中,偏移地址存放于寄存器 SP 中。
• PUSH r16/m16/seg ; SP=SP - 2 ; SS:[SP]=r16/m16/seg
• POP r16/m16/seg ; r16/m16/seg=SS:[SP] ; SP=SP+2
堆栈操作注意事项
• 堆栈操作均为 16 位(字)操作;
• 不能将立即数压入堆栈;
• 进栈和出栈的操作伴随着堆栈指针 SP 的调整, SS:[SP]永远指向堆栈段的栈顶。
• 堆栈只有一个出口。
堆栈的作用
• 堆栈不可或缺,被很多指令使用:如堆栈操作指令PUSH 和 POP 、子程序调用 CALL和返回 RET、中断调用 INT和返回 IRET等;内部异常、外部中断等也利用堆栈
• 堆栈可用来临时存放数据,以便随时恢复它们• 常利用堆栈基址指针 BP ,随机读写堆栈数据• 利用堆栈实现主、子程序间传递参数• 堆栈还常用于子程序的寄存器保护和恢复
堆栈操作练习
•设 AX=1234H , SP=2000H ,执行 PUSH AX 指令后 SP 的值是多少 ? SS:[SP]指向的内存单元的内容是什么?•请利用堆栈将两个字变量 A 、 B 内容互换。
标志操作指令( 1)
• CLC ; CF=0• STC ; CF=1• CMC ; CF= -
CF• CLD ;DF=0• STD ;DF=1• CLI ; IF=0• STI ; IF=1
标志操作指令( 2)
• LAHF ; AH=FLAGS 的低 8 位• SAHF ; FLAGS 的低 8 位 =AH• PUSHF ; SP=SP - 2 , SS:[SP]=FL
AGS• POPF ; FLAGS=SS:[SP], SP=SP+
2
LEA 指令
• LEA r16 , mem; r16 = mem 的偏移地址
• LEA BX , [SI+06H] ;若 SI = 1000H ,则 BX=1006H
• WVAR DW 1234H;设其偏移地址为 0001H• • • • • MOV BX , WVAR ; BX=1234HLEA SI , WVAR ; SI=0001HMOV DX , [SI] ; DX=1234H
LEA 指令与 OFFSET 操作符的区别
• OFFSET操作符是在汇编阶段取得变量的偏移地址• LEA 指令在指令执行时计算出偏移地址• OFFSET无需在执行时计算、指令执行速度更快• LEA 指令能获取汇编阶段无法确定的偏移地址LEA BX , [BX+SI+0F62H]
• 两者的源操作数类型不同• OFFSET只能用于简单变量
MOV BX , OFFSET [SI+06H] ; 错误指令
指针传送指令
• LDS r16 , mem; r16 = [mem], DS=[mem+2]
• LES r16 , mem; r16 = [mem], ES=[mem+2]
• 设 DS=2000H , SI=0502H , [20502H]=0666H , [20504H]=0888H;执行 LES BX , [SI] 后 BX=? ES=?
答: BX=0666H , ES=0888H 。
加减法指令• ADD reg , imm/reg/mem
ADD mem , imm/reg• ADD dest , src; dest=dest + src• SUB dest , src; dest=dest - src
• 目的操作数不能为立即数。两操作数不能同时为存储器操作数。两操作数类型要一致。
• 按定义影响 6 个状态标志位。
对状态标志位影响情况的说明
• 不影响;如: MOV指令。
• 按定义影响;如: ADD 指令。
• 强制 ( 规定 )影响;如: CLC 指令。
• 未 (无 ) 定义 (随机影响 );如: MUL指令。
对状态标志位 CF和 OF 的说明
• 进位标志反映无符号整数运算结果是否超出范围• 有进位,加上进位或借位后运算结果仍然正确
• 溢出标志反映有符号整数运算结果是否超出范围• 有溢出,运算结果已经不正确
• 操作数是无符号数,关心进位• 操作数是有符号数,注意溢出
溢出标志位 OF的判断
• 人工判断的简单规则:只有当两个相同符号数相加(含两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,则不会产生溢出。
带进 /借位加减法指令
• ADC reg , imm/reg/memADC mem , imm/reg
• ADC dest , src; dest=dest + src + CF• SBB dest , src; dest=dest - src - CF
• 目的操作数不能为立即数。两操作数不能同时为存储器操作数。两操作数类型要一致。
• 按定义影响 6 个状态标志位。
ADC/SBB 指令的应用
• ADC 指令用于与 ADD 指令结合实现多精度数的加法。• 先将两个操作数的低 16 位相加 ( 用 ADD 指令 ) 。• 再加高位部分、并将进位加到高位 ( 用 ADC 指令 ) 。
• SBB 指令用于与 SUB 指令结合实现多精度数的减法。• 先将两个操作数的低 16 位相减 ( 用 SUB 指令 ) 。• 再减高位部分、并减去借位 ( 用 SBB 指令 ) 。
CMP 指令
• CMP dest , src; dest - src
• 按定义影响 6 个状态标志位。• CMP 指令将目的操作数与源操作数相减,但差
值不回送到目的操作数中。它通过减法运算影响状态标志位,常用于比较两个操作数的大小关系。
• 注意: CMP 指令执行前后两操作数内容均不变。
增量减量指令
• INC reg/mem; reg/mem=reg/mem+ 1
• DEC reg/mem; reg/mem=reg/mem- 1
• 常用于计数器和地址指针的调整。
• 不影响 CF 标志,但影响其它状态标志位。
NEG 指令
• NEG reg/mem; reg/mem = 0 - reg/mem
• 按定义影响 6 个状态标志位。
• 当操作数为- 128 或- 32768时,操作数不变,但 OF置 1 。
• 通常总是使 CF=1 ,除非操作数为 0 。
加减类指令练习( 1)
•求下列指令执行后 AH 及各状态标志位的情况。
MOV AH , 64HMOV AL, 0A8HCMP AH , ALADC AH , ALINC AH
加减类指令练习( 2)
• 求 Z=X+Y 的值。(注: X 、 Y 、 Z均为无符号数)
• X DW 1234HY DB 0B5HZ DW ?
• X DW 1234HY DW 5678HZ DD ? ; DD 用于定义双字型变量
• X DD 1234H Y DD 5678HZ DD ?
符号扩展指令
• CBW; AL符号扩展成 AX若 AL的最高有效位是 0 ,则 AH=00H;若 AL的最高有效位是 1 ,则 AH=FFH;
• CWD; AX 符号扩展成 DX.AX若 AX 的最高有效位是 0 ,则 DX=0000H;若 AX 的最高有效位是 1 ,则 DX=FFFFH;
乘法指令
• MUL r8/m8 ; AX=AL×r8/m8 ,无符号乘法
• MUL r16/m16; DX.AX=AX×r16/m16
• IMUL r8/m8 ; AX=AL×r8/m8 ,有符号乘法
• IMUL r16/m16; DX.AX=AX×r16/m16
除法指令
• DIV r8/m8; AL=AX÷src 的商, AH=AX÷src的余
• DIV r16/m16; AX=DX.AX÷src 的商 DX=DX.AX÷src 的余,无符号除法
• IDIV r8/m8; AL=AX÷src 的商, AH=AX÷src的余
• IDIV r16/m16; AX=DX.AX÷src 的商 ; DX=DX.AX÷src 的余,有符号除法
乘除法指令对标志位的影响
• 乘法指令只影响 OF 和 CF ,对其它状态标志无定义。
• 对于无符号乘法,若乘积中 AH=00H(8 位乘法 ) 或DX=0000H(16 位乘法 ) , OF=CF=0;否则均为 1。
• 对于有符号乘法,若乘积的高一半是低一半的符号扩展,则 OF=CF=0;否则均为 1 。
• 除法指令对 6 个状态标志位均无定义。• 但当除数为 0 或商溢出时将产生编号为 0 的内部中断,指示除法错误。
乘除法指令练习
• 计算 (X×Y+125)÷Z。设 X 、 Y 、 Z均为 16 位有符号的字变量,计算后将商存入 X ,余数存入 Y 。
逻辑运算指令
• AND dest , src; dest=dest “与” src• OR dest , src; dest=dest “或” src• XOR dest , src; dest=dest “异或” src• TEST dest , src; dest “与” src• NOT reg/mem ; reg/mem=reg/mem 的“非”
逻辑运算指令注意事项
• AND reg, imm/reg/memAND mem , imm/reg
• 目的操作数不能为立即数。两操作数不能同时为存储器操作数。两操作数类型要一致。
• 双操作数逻辑运算指令均置 OF=CF=0 ,按定义影响 SF 、 ZF 和 PF ,对 AF无定义。 NOT指令不影响状态标志位。
逻辑运算指令特点
• 和 0 相“与”,结果为 0 ;和 1 相“与”,结果不变。
• 和 1 相“或”,结果为 1 ;和 0 相“或”,结果不变。
• 和 1“异或”,结果取反;和 0“异或”,结果不变。
逻辑运算指令练习
• 使 AL最高位为“ 1”,其他位不变。• 使 AX清 0 ,同时清 CF 为 0 。• 使 AL中的 D7~D4 位不变, D3~D0 位取反。• 将 AL存放的 0~9 中的一个数变成对应的 ASCII 码
。• 将 AL中的 ASCII 码小写字母变成对应的大写字母。• 将 AL中的 ASCII 码大写字母变成对应的小写字母。
移位指令
• SHL reg/mem , 1/CL ; reg/mem 左移 1/CL位
• SHR reg/mem , 1/CL ; reg/mem 右移 1/CL位
• SAL reg/mem , 1/CL ;与 SHL 是同一指令• SAR reg/mem , 1/CL ; reg/mem 右移 1/CL位
• 按照移入的位设置 CF;按定义影响 SF 、 ZF 、PF;对 AF无定义。
• 移位次数为 1 ,若移位前后操作数最高位不同,OF=1;否则 OF=0 。移位次数大于 1 , OF无定义。
移位指令示意图
0
操作数CF
逻辑 / 算术左移 SHL/SAL
0 CF
操作数
逻辑右移 SHR 操作数
CF
算术右移 SAR
循环移位指令• ROL reg/mem , 1/CL ;不带进位循环左移• ROR reg/mem , 1/CL ;不带进位循环右移• RCL reg/mem , 1/CL ;带进位循环左移• RCR reg/mem , 1/CL ;带进位循环右移
• 按照移入的位设置 CF;不影响 SF 、 ZF 、 PF、 AF 。
• 移位次数为 1 ,若移位前后操作数最高位不同,OF=1;否则 OF=0 。移位次数大于 1 , OF无定义。
循环移位指令示意图操作数
CF
左循环移位 ROL操作数
CF
右循环移位 ROR操作数
CF
带进位左循环移位 RCL操作数
CF
带进位右循环移位 RCR
移位指令练习
• 用移位指令将 AL中的无符号数乘 10 ,结果存入 AX 中。
• 将 ASCII 码转换成 BCD 码。ASCII DB ’38’BCD DB ?
控制转移类指令
• 程序代码在代码段中,由 CS:IP确定地址。• 程序顺序执行,微处理器自动增量 IP 。• 程序控制转移, IP随之改变。• 程序转移到另外的代码段, IP 和 CS都将改变。• 控制转移类指令:改变 IP (有些也改变 CS ),
即改变程序执行顺序(实现程序控制转移)的指令。
转移范围• 段内转移:在当前代码段范围内的程序转移,不需更改 CS ,只要改变 IP 。近转移 (Near) :转移范围为± 32KB短转移 (Short) :转移范围为+ 127~- 128字节
• 段间转移:从当前代码段转移到另一代码段,需要更改 CS 和 IP 。远转移 (Far) :转移范围为 1MB
目标地址寻址方式
• 相对寻址方式:提供目标地址相对于当前指令指针 IP 的位移量。目标地址 ( 转移后的 IP) =当前 IP +位移量。相对寻址都是段内转移,最常用、最灵活。
• 直接寻址方式:直接提供目标地址。目标地址( 转移后的 CS 和 IP) =指令操作数。
• 间接寻址方式:目标地址来自寄存器或存储单元,间接获得。寄存器间接寻址:用寄存器保存目标地址;存储器间接寻址:用存储单元保存目标地址。
无条件转移指令 JMP
• JMP label ; IP=IP+ 位移量,段内相对转移• JMP r16/m16 ; IP=r16/m16 , 段内间接转移• 段间直接转移JMP far ptr label; IP=偏移地址, CS=段地址
• 段间间接转移JMP far ptr mem ; IP=[mem], CS=[mem+2]
• 通常,汇编程序能根据 label 的位置自动生成短转移、近转移或远转移指令。
条件转移指令 Jcc
• 根据指定的条件来确定程序是否发生转移• Jcc label;条件满足,发生转移
;否则,顺序执行下一条指令• LABEL表示目标地址,采用段内相对短转移• 条件转移指令不影响标志位,但要利用标志位• cc 表示利用标志判断的条件,共 16 种,分两类•单个标志状态作为条件•两数大小关系作为条件
转移条件 cc:单个标志状态
JZ/JE ZF=1 Jump if Zero/EqualJNZ/JNE ZF=0 Jump if Not Zero/Not
EqualJS SF=1 Jump if SignJNS SF=0 Jump if Not SignJP/JPE PF=1 Jump if Parity/Parity
EvenJNP/JPO PF=0 Jump if Not Parity/Parity
OddJO OF=1 Jump if OverflowJNO OF=0 Jump if Not OverflowJC CF=1 Jump if CarryJNC CF=0 Jump if Not Carry
转移条件 cc:两数大小关系
JB/JNAE CF=1 (Below/Not Above or Equal)
JNB/JAE CF=0 (Not Below/Above or Equal)
JBE/JNA CF=1 或 ZF=1 (Below or Equal/Not Above)
JNBE/JA CF=0且 ZF=0 (Not Below or Equal/Above)
JL/JNGE SF≠OF (Less/Not Greater or Equal)
JNL/JGE SF=OF (Not Less/Greater or Equal)
JLE/JNG SF≠OF 或 ZF=1 (Less or Equal/Not Greater)
JNLE/JG SF=OF且 ZF=0 (Not Less or Equal/Greater)
转移类指令练习
• 通过判断符号位实现 CBW 指令的功能。• 通过判断正负实现 CBW 指令的功能。• 取三个无符号字变量的最小值到 AX 。
循环指令
• LOOP label ; CX=CX - 1, 若 CX≠0 ,转移• LOOPE label ; CX=CX - 1, 若 CX≠0且 ZF=1 ,
转移• LOOPNE label ; CX=CX - 1, 若 CX≠0且 ZF=0 ,
转移• JCXZ label ;若 CX=0,转移;否则,顺序执行
• 循环指令是针对 CX 计数器的计数循环指令• 指令中的操作数 label只能采用相对短转移寻址方式,转移范围为段内- 128~ + 127 个字节
• 循环指令不影响标志
用循环指令实现字节数组求和
• 已知字节数组 ARRAY ,将其各元素之和存入变量 SUM 中(不考虑进位和溢出)。
ARRAY DB 12H , 34H , 56H ,…SUM DB ?
子程序
• 子程序:与主程序分开的完成特定功能的一段程序
• 主程序 (调用程序 )执行调用指令 CALL调用子程序
• 子程序 (被调用程序 )执行返回指令 RET返回主程序
RET
CALL label
主程序子程序
子程序调用指令 CALL• CALL label ;相对寻址的段内调用• CALL r16/m16 ;间接寻址的段内调用• CALL far ptr label;直接寻址的段间调用• CALL far ptr mem ;间接寻址的段间调用
• 实际编程中,汇编程序会自动确定是段内还是段间调用。
• CALL指令在改变 CS 和 IP前,会将返回的地址保存到堆栈中。
子程序返回指令 RET
• RET ;返回• RET i16;返回,调整指针 SP=SP+i16
• RET指令用在子程序中,实现调用的返回。• 汇编程序会自动根据 CALL指令来产生相应的返回操作。
• RET指令执行时伴随着 CS , IP , SP 的调整。
子过程定义
• 过程名 PROC [NEAR/FAR]…… ;过程体
• 过程名 ENDP
• 汇编程序利用过程定义伪指令获得子程序信息• 过程名为符合语法的标识符• 应安排在代码段的主程序之外• 入栈和出栈操作要成对使用,保持堆栈平衡
中断调用• CPU因某个特殊事件将当前程序挂起 (暂停 ) ,转去处理这个特殊事件的程序,处理结束后再返回被挂起的程序,此过程称为“中断”。当前程序被挂起的位置成为“断点”,处理特殊事件的程序称为“中断服务程序”。
• 中断是一种特殊的改变程序执行顺序的方法。• 8086/8088CPU支持 256 个中断。每个中断用一
个中断编号 ( 中断向量 ) 来区别。相应的中断服务程序的起始地址按中断向量号顺序存放在 00000H~003FFH 的内存单元中,形成“中断向量表”。
中断指令
• INT i8;执行 i8 号中断
• IRET ;中断返回指令
• INTO ;溢出中断指令 ;若 OF=1 ,产生 4 号中断。否则顺序执行
DOS 系统功能调用
• MS-DOS 操作系统提供给程序员的“子程序”
• 系统功能调用步骤(类似高级语言调用函数)( 1 )在 AH寄存器中设置系统功能调用号( 2 )在指定寄存器中设置入口参数( 3 )中断调用指令“ INT 21H”执行功能( 4 )根据出口参数分析功能调用执行情况
01 号子功能• 子功能号: AH = 01H;• 出口参数: AL= 输入字符的 ASCII 码;• 功能说明:等待从键盘输入一个字符,将其 A
SCII 码送入 AL,同时回显到屏幕。输入字符后,不需回车。
• 用法示例:MOV AH , 01HINT 21H
02 号子功能• 子功能号: AH = 02H;• 入口参数: DL= 要显示字符的 ASCII 码;• 功能说明:在当前光标位置显示 DL中给定的
字符,光标右移。此功能可自动识别并相应处理退格 (08H) 、回车 (0DH) 、换行 (0AH) 等字符。
• 用法示例:MOV AH , 02HMOV DL, 41HINT 21H
09 号子功能• 子功能号: AH = 09H;• 入口参数: DS:DX= 要显示字符串的首地址;• 功能说明:在当前光标位置显示由 DS:DX所
指的字符串。该字符串必须以“ $”结束,“ $”并不显示。
• msg DB ‘HELLO!’, 0DH , 0AH ,’$’……MOV AH , 09HMOV DX , OFFSET msgINT 21H
0AH 号子功能• 子功能号: AH = 0AH;• 入口参数: DS:DX= 输入缓冲区的首地址;• 功能说明:从键盘读入一个字符串,以回车结束,存放在 DS:DX所指的缓冲区。
• 缓冲区格式:buffer DB 255 , 0 , 255 DUP(0)
• MOV AH , 0AHMOV DX , OFFSET bufferINT 21H
0BH 号子功能
• 子功能号: AH = 0BH;• 出口参数: AL=0 ,无输入, AL= FFH ,有输
入;• 功能说明:判定键盘是否有输入。
• 用法示例:MOV AH , 0BHINT 21H
4CH 号子功能
• 子功能号: AH=4CH;• 入口参数: AL=DOS返回码;• 功能说明:结束程序执行,返回 DOS 。
• 用法示例:MOV AH , 4CHMOV AL, 00HINT 21H
利用子程序显示 DX中的内容
• 将 DX 中的 4 位 16 进制数显示出来。• 利用子程序实现 16 进制数转换成 ASCII 码。
处理器控制类指令
• NOP ;空操作• SEG: ;段超越前缀• LOCK : ;封锁前缀• HLT ;暂停• ESC 6 位立即数, reg/mem;交
权• WAIT ;等待
汇编语言程序设计
• 汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数。
• 利用汇编语言编写程序的主要优点是可以直接、有效地控制计算机硬件,容易创建代码序列短小、运行快速的可执行程序。
• 在有些应用领域,汇编语言的作用是不容置疑和无可替代的。
学习内容
• 汇编语言源程序格式
• 常量、变量和标号
• 汇编语言程序设计方法– 顺序程序设计– 分支程序设计– 循环程序设计– 子程序设计
汇编语言源程序格式
• 汇编语言源程序由语句序列构成。每条语句一般占一行。
• 汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。
• 独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
• 所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。
• 通常,程序还需要一个堆栈段。
汇编语言的语句格式
• 执行性语句——用于表达处理器指令 ( 也称为硬指令 ) ,汇编后对应一条指令代码。由处理器指令组成的代码序列是程序设计的主体。标号 : 硬指令助记符 操作数 ,操作数 ;注释
• 说明性语句——说明性语句用于表达伪指令,指示源程序如何汇编、变量怎样定义、过程怎么设置等。名字 伪指令助记符 参数 , 参数 ,……;注释
标号、名字与标识符• 标号是反映硬指令位置(逻辑地址)和属性的
标识符,后跟一个冒号分隔。• 名字是反映伪指令位置(逻辑地址)和属性的
标识符,后跟空格或制表符分隔,没有冒号。• 标识符一般最多由 31 个字母、数字及规定的
特殊符号(如 _、 $、 ?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写。
• 一个源程序中,每个标识符的定义是唯一的,且不能是汇编系统所采用的保留字。
保留字
• 保留字是汇编程序已经利用的标识符(也称为关键字),主要有:
• 硬指令助记符——例如: MOV、 ADD• 伪指令助记符——例如: DB 、 DW• 操作符——例如: OFFSET、 PTR• 寄存器名字——例如: AX 、 CS• 预定义符号——例如:@data
操作数和参数
• 处理器指令中的操作数可以是立即数、寄存器和存储单元。
• 伪指令中的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。
注释
• 语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性。
• 必要时,一个语句行也可以由分号开始作为阶段性注释。
• 汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理。
分隔符
• 语句的 4 个组成部分要用分隔符分开。
• 标号后用冒号,注释前用分号。• 操作数之间和参数之间使用逗号分隔。• 其他部分通常采用空格或制表符。
• 多个空格和制表符的作用与一个相同。• MASM支持续行符 “ \”。
完整段定义格式- 1sseg segment stack ;定义堆栈段
DB 1024 dup(0) ;分配堆栈段的大小sseg ends ;堆栈段结束
dseg segment ;定义数据段 ….. ;数据定义dseg ends ;数据段结束
完整段定义格式- 2cseg segment ‘CODE’ ;定义代码段assume cs:cseg, ds:dseg, ss:ssegstart: mov ax, dseg ;程序起点 mov ds, ax ;设置 DS ….. ;程序代码 mov ax, 4c00h int 21h ;程序结束,返回 DOS ….. ;子程序等的代码cseg ends ;代码段结束end start ;汇编结束并标识起点
完整段定义伪指令• 段名 segment [定位 ] [组合 ] [‘类别’ ]
….. ;语句序列段名 ends
• 完整段定义由 SEGMENT和 ENDS这一对伪指令实现,前者定义一个逻辑段的开始,后者表示一个逻辑段的结束。
• 段定义指令后的关键字用于确定段的各种属性,如果不指定,则采用默认参数;但如果指定,注意要按照顺序书写。
段定位属性• 指定逻辑段在主存储器中的边界,可为:
– BYTE从下一个可用的字节 地址开始段– WORD 从下一个可用的偶数 地址开始段– DWORD 从下一个可用的模 4 地址开始段– PARA 从下一个可用的模 16 地址开始段– PAGE 从下一个可用的模 256 地址开始段
• 完整段定义伪指令的默认定位属性是 PARA ,所以默认情况下数据段的偏移地址从 0 开始。
段组合属性
• 指定多个逻辑段之间的关系,可为:– PRIVATE :本段不与其他段合并,每段都
有自己的段地址。这是默认的段组合方式。– PUBLIC :连接程序把本段与所有同名同类
型的其他段相邻连接,然后为所有这些段指定一个共同的段地址。
– STACK :本段是堆栈的一部分,连接程序将所有 STACK段按照与 PUBLIC段的同样方式进行合并。这是堆栈段必须具有的段组合。
段类别属性
• 当连接程序组织段时,将所有的同类别段相邻分配。
• 段类别可以是任意名称,但必须位于单引号中;• 大多数 MASM 程序使用:‘ CODE’ 、‘ DAT
A’、‘ STACK’ 来分别指示代码段、数据段和堆栈段,以保持所有代码和数据的连续。
ASSUME 伪指令
• ASSUME 段寄存器 : 段名 [, 段寄存器 : 段名 ,…]
• ASSUME伪指令建立逻辑段与段寄存器之间的对应关系,汇编程序会据此在需要时自动插入段超越前缀。
• ASSUME 并不为段寄存器设定初值。连接程序将正确设置 CS:IP 和 SS:SP 。若程序中使用数据段或附加段,必须明确地为 DS 和 ES赋值。
常量、变量和属性
• 常量表示一个固定的数值。可用作硬指令的立即数操作数或伪指令的参数。
• 变量实质上是指内存单元的数据。主要用作存储器操作数。
• 名字和标号具有逻辑地址和类型的属性。可用作地址操作数、立即数操作数或存储器操作数。
常数和字符串• 常数是指由各种进制形式表示的数值。默认为十
进制。可用伪指令 .RADIX改变。
.RADIX n; n 为 2~16间的数值
• 字符串是指用单引号或双引号括起来的单个或多个字符,其数值是每个字符对应的 ASCII 码。
例如: 'd'= 64H 、 'AB'= 4142H
符号常量• 符号常量是使用标识符表达一个固定的数值。
• 符号名 EQU 数值表达式符号名 EQU <字符串 >符号名 = 数值表达式
• EQU不能重复定义符号名,“=”则允许。
• 常数若使用有意义的标识符来表示,可以提高程序的可读性。
数值表达式• 数值表达式一般是指由运算符连接的由各种常
数所构成的表达式。汇编程序在汇编过程中计算表达式,最终得到一个数值。
• 数值表达式不影响程序运行速度,但增强了程序的可读性。
• MASM支持的运算符有:算术操作符、逻辑操作符、移位操作符、关系操作符等。
运算符• 算术运算符: + 、-、 *、 / 、 MOD
• 逻辑运算符: AND 、 OR 、 XOR 、 NOT
• 移位运算符: SHL、 SHR其格式为:数值表达式 SHL/SHR 移位次数
• 关系运算符: EQ、 NE 、 GT、 LT、 GE 、LEMASM 用 0FFFFH 表示条件为真,用 0000H表示条件为假。
变量的定义• 变量实质上是指内存单元的数据,因而可以改变。
• 变量需要事先定义才能使用。
• 变量定义伪指令为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。
• 变量名 伪指令 初值表
变量名
• 变量名是用户自定义的标识符,用来表示可读写数据的首地址,或初值表的首地址。
• 这个用符号表示的地址,常称为符号地址。
• 一个变量可以没有变量名,在这种情况下,汇编程序将直接为初值表分配空间,即该变量没有符号地址。而设置变量名是为了方便存取它指示的存储单元。
变量定义伪指令• 变量定义伪指令为变量分配或预留内存单元。
DB :定义 字节 伪指令DW :定义 字 伪指令DD :定义 双字 伪指令DF :定义 3 字 伪指令DQ :定义 4 字 伪指令DT :定义 10 字节伪指令
初值表• 初值表是用逗号分隔的参数,是用户定义的多
个数据初值。
• 初值表主要由常量、数值表达式或?等组成。其中?表示初值不确定,即未赋初值。若多个存储单元初值相同,可用复制操作符 DUP 进行定义。
• DUP 的格式为:重复次数 DUP (重复参数 )
变量的定位
• 定位伪指令控制数据的偏移地址。
• ORG 参数 ;偏移地址为该参数值
• $ ;表示当前偏移地址值
• EVEN ;从偶地址开始
• ALIGN n ;从 n 的整数倍地址开始
名字和标号的属性
• 逻辑地址属性:名字和标号对应的存储单元的逻辑地址,含有段地址和偏移地址。
• 类型属性:变量名的类型可以是 BYTE/WORD/DWORD ,标号、段名、子程序名等的类型可以是 NEAR/FAR 。
地址操作符
• 地址操作符可以得到名字或标号的段地址和偏移地址。
• [ ] ——将括起的表达式作为存储器地址指针$ ——当前偏移地址: ——采用指定的段地址寄存器OFFSET 名字 / 标号;返回名字或标号的偏移地址SEG 名字 / 标号;返回名字或标号的段地址
类型操作符- 1• 类型操作符对名字或标号的类型属性进行有关设置。
• 类型名 PTR 名字 / 标号;将名字 / 标号按指定类型使用。THIS 类型名;创建位于当前地址但为指定类型的操作数。类型名可以是 BYTE 、 WORD 、 DWORD 等,或者NEAR 、 FAR 等。SHORT 标号;将标号作为短转移处理。
类型操作符- 2
• TYPE 名字 / 标号;返回一字型数值,表明名字 /标号的类型。字节 / 字 / 双字变量返回 1/2/4 ,短/近 /远标号为返回 FF01H/FF02H/FF05H 。
LENGTHOF 变量名;返回整个变量的数据项数。
SIZEOF 变量名;返回整个变量占用的字节数。
顺序程序设计
• 顺序程序的基本特征是其中不含有转移类指令,因而不会产生分支,不会形成循环,也不会发生转移。 CPU在执行顺序程序时,总是按照指令在存储器中存储的先后次序,一条指令一条指令地顺序执行,直到程序的结束。这是一种最基本、最常见的程序结构。
Hello,World!- 1
S1 SEGMENT STACK DB 256 DUP (?)S1 ENDS
D1 SEGMENTB1 DB ’Hello,World!’,0DH,0AH,’$’D1 ENDS
Hello,World!- 2
C1 SEGMENT ’CODE’ ASSUME CS:C1,DS:D1,SS:S1
M1: MOV AX,D1 MOV DS,AX MOV DX,OFFSET B1 MOV AH,9 INT 21H MOV AH,4CH INT 21HC1 ENDS END M1
分支程序设计
• 分支程序的基本特征是其中含有条件转移指令或无条件转移指令,但一般不含有被重复执行的程序段。每使用一次条件转移指令可实现两个分支,连续多次使用条件转移指令可实现多个分支。使用无条件转移指令也可实现多个分支。
无符号数比较大小- 1
S1 SEGMENT STACK DB 256 DUP (?)S1 ENDS
D1 SEGMENTA1 DW 9676HB1 DW 6769HE1 DB ’A>B’, ’$’E2 DB ’A<B’, ’$’ E3 DB ’A=B’, ’$’D1 ENDS
无符号数比较大小- 2
C1 SEGMENT ’CODE’ ASSUME CS:C1,DS:D1,SS:S1
M1: MOV AX,D1 L1: MOV DX,OFFSET E3 MOV DS,AX JMP L3 MOV AX,A1 L2: MOV DX,OFFSET E2 CMP AX,B1 L3: MOV AH,9 JB L2 INT 21H JZ L1 MOV AH,4CH MOV DX,OFFSET E1 INT 21H JMP L3 C1 ENDS END M1
循环程序设计
• 循环程序的基本特征是其中含有被重复执行的程序段。为了保证该程序段的重复执行,循环程序中通常都含有无条件转移指令、条件转移指令、循环次数控制指令或串操作次数控制指令前缀等。
• 循环结构的程序通常由三部分组成:循环参数初始化部分、循环工作部分和循环控制部分。
循环程序的结构• 循环参数初始化是指在进入循环之前给出循环
程序所需要的初始值,包括循环工作部分的初始值和循环结束部分的初始值。
• 循环工作部分是指被循环执行的程序段,称为循环体。有单重循环和多重循环两种结构。
• 循环控制部分检测循环条件是否得到满足,以便决定是继续循环还是结束循环。循环条件的检测可以放在循环体之前,即 DO - WHILE型循环;也可以放在循环体之后,即 DO - UNTIL型循环。
循环次数的控制• 计数控制法:用于循环次数已知的情况。又可分为正计数法和倒计数法。
• 条件控制法:用于循环次数未知的情况,或者虽然循环次数已知,但有可能提前结束循环的情况。
• 无论哪种方法,在循环过程中通常都不应重新设置计数初始值或者循环条件,否则可能产生不可预知的结果。
无符号字数组的最大最小值- 1
S1 SEGMENT STACK DB 256 DUP (?)S1 ENDS
D1 SEGMENTW1 DW 533,0A6H,77,’A’,20,-1A1 DW ?B1 DW ?D1 ENDS
无符号字数组的最大最小值- 2C1 SEGMENT ’CODE’
ASSUME CS:C1,DS:D1,SS:S1M1: MOV AX,D1 JAE L3
MOV DS,AX MOV DX,[BX+2] MOV CX,5 L3: ADD BX,2 LEA BX,W1 LOOP L1 MOV AX,[BX] MOV A1,AX MOV DX,[BX] MOV B1,DXL1: CMP AX,[BX+2] MOV AH,4CH
JBE L2 INT 21H MOV AX,[BX+2] C1 ENDSL2: CMP DX,[BX+2] END M1
子程序设计
• 子程序也称为子过程,是指能完成一定功能的指令序列。调用子程序使用 CALL指令,从子程序返回使用 RET指令。子程序的基本特征是其中一定含有 RET指令。
• 通常将多次重复使用的程序段编成子程序以节省存储空间,或者将具有通用性的程序段编成子程序以便共享。
保护断点• 执行 CALL指令时 IP( 或 CS:IP) 的值是 CALL
指令后面一条指令的地址,此即断点。• 为了使子程序完成后能返回主程序中继续执行
CALL指令后面的指令序列,在转入子程序前应将断点 ( 地址 )保存到堆栈。这是由 CALL指令自动完成的。
• 当子程序执行完成后,断点 ( 地址 ) 应从堆栈中弹出,恢复到 IP( 或 CS:IP) 中,以便能从子程序返回到主程序,继续执行 CALL指令后面的指令序列。这是由 RET指令自动完成的。
保存现场
• 所谓现场,主要是指在调用子程序之前的有关寄存器的内容。
• 主程序和子程序可能会使用同一寄存器。若子程序使用的某个寄存器的内容对主程序而言是不能被破坏的,则必须在子程序的入口处将该寄存器的内容保存到堆栈 ( 或其他地方 ) ,并在子程序的出口处从堆栈 ( 或其他地方 )恢复相应的内容到原来的寄存器中。
主程序和子程序的参数传递• 主程序在调用子程序时,通常要传递一些原始
数据给子程序,这些数据称为子程序的入口参数;子程序在返回主程序时,也常要传递一些处理结果给主程序,这些数据称为子程序的出口参数。
• 参数传递有三种方法:通过寄存器传递通过存储单元传递通过堆栈传递
子程序的嵌套与递归
• 在子程序中又调用其他的子程序,称为子程序的嵌套调用。
• 在子程序中调用其自身,称为子程序的递归调用。
保持堆栈的平衡• 堆栈在子程序的使用中有重要的作用:主程序中可能使用堆栈传递入口参数主程序执行 CALL指令时使用堆栈保存断点子程序在入口处使用堆栈保护现场子程序中可能进行堆栈操作子程序在出口处从堆栈中恢复现场子程序执行 RET指令将堆栈中的断点恢复调用完成后主程序从堆栈中弹出出口参数
• 子程序中必须保持堆栈的平衡。通常 PUSH 和POP 指令应成对使用。
用子程序完成累加求和- A1 S1 SEGMENT STACK
DB 256 DUP (?)S1 ENDSD1 SEGMENTW1 DW 100 DUP (10)W2 DW ($ - W1) / 2W3 DW ? LEA BX,W1D1 ENDS MOV CX,W2C1 SEGMENT ’CODE’ CALL P1ASSUME CS:C1,DS:D1,SS:S1 MOV W3,AX
M1: MOV AX,D1 MOV AH,4CH MOV DS,AX INT 21H
用子程序完成累加求和- A2 P1 PROC NEAR
PUSH BX PUSH CX MOV AX,0L1: ADD AX,[BX] ADD BX,2 LOOP L1 POP CX POP BX RETP1 ENDPC1 ENDS END M1
微处理器外部特性
• 8088 的引脚信号和总线形成
• 8088 的总线时序
8088 的两种组态模式
• 两种组态构成两种不同规模的应用系统。• 最小组态模式:构成小规模的应用系统, 808
8 本身提供所有的系统总线信号。• 最大组态模式:构成较大规模的应用系统,例
如可以接入数值协处理器 8087; 8088 和总线控制器 8288共同形成系统总线信号。
• 两种组态利用 MN/MX引脚区别:接高电平为最小组态模式,接低电平为最大组态模式。
最小组态下的引脚信号• 数据和地址引脚
• 读写控制引脚
• 中断请求和响应引脚
• 总线请求和响应引脚
• 其它引脚
数据和地址引脚- 1
AD7~ AD0 ( Address/Data )
• 地址 / 数据分时复用引脚,双向、三态。• 在访问存储器或外设的总线操作周期中,这些引脚在第一个时钟周期输出存储器或 I/O端口的低 8 位地址 A7~ A0
• 其他时间用于传送 8 位数据 D7~ D0
数据和地址引脚- 2
A15~ A8 ( Address)
• 中间 8 位地址引脚,输出、三态。
• 这些引脚在访问存储器或外设时,提供全部 20 位地址中的中间 8 位地址 A15~ A8
数据和地址引脚- 3
A19/S6~ A16/S3 ( Address/Status)
• 地址 /状态分时复用引脚,输出、三态。• 这些引脚在访问存储器的第一个时钟周期输出
高 4 位地址 A19~ A16
• 在访问外设的第一个时钟周期全部输出低电平无效。
• 其他时间输出状态信号 S6~ S3
读写控制引脚- 1
ALE ( Address Latch Enable )
• 地址锁存允许,输出、三态、高电平有效。• ALE引脚有效时,表示复用引脚: AD7~ AD0
和 A19/S6~ A16/S3 正在传送地址信息。• 由于地址信息在这些复用引脚上出现的时间很短暂,所以系统可以利用 ALE引脚将地址锁存起来。
读写控制引脚- 2
IO/M ( Input and Output/Memory )
• I/O 或存储器访问,输出、三态。• 该引脚输出高电平时,表示 CPU 将访问 I/O端
口,这时地址总线 A15~ A0提供 16 位 I/O 口地址。
• 该引脚输出低电平时,表示 CPU 将访问存储器,这时地址总线 A19~ A0提供 20 位存储器地址。
读写控制引脚- 3
WR ( Write ) • 写控制,输出、三态、低电平有效。• 有效时,表示 CPU 正在写出数据给存储器或 I
/O端口。
RD ( Read )• 读控制,输出、三态、低电平有效。• 有效时,表示 CPU 正在从存储器或 I/O端口读入数据。
读写控制引脚- 4
READY• 存储器或 I/O端口就绪,输入、高电平有效。• 在总线操作周期中, 8088CPU会在第 3 个时钟周期的前沿测试该引脚:如果测到高有效,CPU 直接进入第 4 个时钟周期,如果测到无效,CPU 将插入等待周期 Tw。
• CPU在等待周期中仍然要监测 READY 信号,有效则进入第 4 个时钟周期,否则继续插入等待周期 Tw。
读写控制引脚- 5
DEN( Data Enable ) • 数据允许,输出、三态、低电平有效。• 有效时,表示当前数据总线上正在传送数据,
可利用它来控制对数据总线的驱动。
DT/R ( Data Transmit/Receive )• 数据发送 / 接收,输出、三态。• 该信号表明当前总线上数据的流向。• 高电平时数据自 CPU 输出 ( 发送 ) 。• 低电平时数据输入 CPU( 接收 ) 。
读写控制引脚- 6SSO ( System Status Output )
• 最小组态模式下的状态输出信号。• IO/M 、 DT/R 和 SSO 一起,通过编码指示 C
PU在最小组态下的 8 种工作状态:000. 取指 100. 中断响应001. 存储器读 101. I/O读010. 存储器写 110. I/O 写011. 过渡状态 111. 暂停
中断请求和响应引脚- 1
INTR ( Interrupt Request )
• 可屏蔽中断请求,输入、高电平有效。• 有效时,表示请求设备向 CPU申请可屏蔽中断。• 该请求的优先级别较低,并可通过关中断指令 CLI清除标志寄存器中的 IF 标志、从而对中断请求进行屏蔽。
中断请求和响应引脚- 2
INTA ( Interrupt Acknowledge )
• 可屏蔽中断响应,输出、低电平有效。• 有效时,表示来自 INTR引脚的中断请求已被
CPU响应, CPU 进入中断响应周期。• 中断响应周期是连续的两个,每个都发出有效响应信号,以便通知外设它们的中断请求已被响应,并令有关设备将中断向量号送到数据总线。
中断请求和响应引脚- 3
NMI ( Non-Maskable Interrupt )
• 不可屏蔽中断请求,输入、上升沿有效。• 有效时,表示外界向 CPU申请不可屏蔽中断。• 该请求的优先级别高于 INTR ,并且不能在 C
PU 内被屏蔽。• 当系统发生紧急情况时,可通过它向 CPU申请不可屏蔽中断服务。
总线请求和响应引脚- 1
HOLD
• 总线保持 ( 即总线请求 ) ,输入、高电平有效。• 有效时表示总线请求设备向 CPU申请占有总线。• 该信号从有效回到无效时,表示总线请求设备对
总线的使用已经结束,通知 CPU收回对总线的控制权。
总线请求和响应引脚- 2
HLDA ( HOLD Acknowledge )• 总线保持响应,输出、高电平有效。• 有效时,表示 CPU 已响应总线请求并已将总
线释放。• 此时 CPU 的地址总线、数据总线及具有三态
输出能力的控制总线将全面呈现高阻,使总线请求设备可以顺利接管总线。
• 待到总线请求信号 HOLD无效,总线响应信号HLDA 也转为无效, CPU重新获得总线控制权。
其它引脚- 1
RESET
• 复位请求,输入、高电平有效。• 该信号有效,将使 CPU回到其初始状态;当它再度返回无效时, CPU 将重新开始工作。
• 8088复位后 CS = FFFFH 、 IP = 0000H ,所以程序入口在物理地址 FFFF0H 。
其它引脚- 2
CLK ( Clock)
• 时钟输入。• 系统通过该引脚给 CPU提供内部定时信号。 8
088 的标准工作时钟为 5MHz。• IBM PC/XT机的 8088 采用了 4.77MHz的时钟,其周期约为 210ns。
其它引脚- 3Vcc
• 电源输入,向 CPU提供+ 5V电源。GND
• 接地,向 CPU提供参考地电平。
MN/MX ( Minimum/Maximum )• 组态选择,输入。• 接高电平时, 8088引脚工作在最小组态;反之, 8088工作在最大组态。
其它引脚- 4TEST
• 测试,输入、低电平有效。• 该引脚与WAIT指令配合使用。• 当 CPU执行 WAIT指令时,它将在每个时钟周期对该引脚进行测试:如果无效,则程序踏步并继续测试;如果有效,则程序恢复运行。也就是说, WAIT指令使 CPU产生等待,直到该引脚有效为止。
• 在使用协处理器 8087时,通过引脚和 WAIT指令,可使 8088与 8087 的操作保持同步。
最小组态下的总线形成- 1
AD7~ AD0
A15~ A8
A19/S6~A16/S3
+5V
8088
ALE
8282STB
系统总线信号
A19~A16
A15~A8
A7~A0
D7~D0
IO/MRDWR
8282STB
8282STB
8286TOE
MN/MXIO/M
RDWR
DT/RDEN
OE
OE
OE
最小组态下的总线形成- 2
• 20 位地址总线:采用 3 个三态透明锁存器 8282 进行锁存和驱动。
• 8 位数据总线:采用数据收发器 8286 进行驱动。
• 系统控制信号:由 8088引脚直接提供。
存储器系统
• 半导体存储器
• 随机读写存储器
• 只读存储器
• 存储器芯片与 CPU 的连接
半导体存储器的分类
• 按制造工艺– 双极型:速度快、集成度低、功耗大– MOS 型 :速度慢、集成度高、功耗低
• 按使用属性– 随机读写存储器 RAM :可读可写、断电丢失
– 只读存储器 ROM :正常只读、断电不丢失
随机读写存储器 RAM 的分类
组成单元 速度 集成度 应用SRAM 触发器 快 低 小容量系统DRAM 极间电容 慢 高 大容量系统NVRAM
带微型电池 慢 低 小容量非易失
只读存储器 ROM 的分类
• 掩膜 ROM :信息制作在芯片中,不可更改。• PROM :允许一次编程,此后不可更改。• EPROM :用紫外光擦除,擦除后可编程;并允许用户多次擦除和编程。
• EEPROM ( E2PROM ):采用加电方法在线进行擦除和编程,也可多次擦写。
• Flash Memory (闪存):能够快速擦写的 EEPROM ,但只能按块( Block)擦除。
半导体存储器芯片的结构
地址寄存
地址译码
存储体
控制电路
AB
数据寄存
读写电路 DB
OEWE
CS
存储体
• 存储体是存储器芯片的主要部分,用来存储信息。内含多个存储单元。
• 每个存储单元具有一个唯一的地址,可存储 1位 ( 位片结构 ) 或多位 ( 字片结构 ) 二进制数据。
• 存储容量与地址、数据线个数有关:存储容量=存储单元数 × 存储单元的位数= 2M×N。M是芯片地址线根数, N是芯片数据线根数。
地址译码电路
• 根据输入的地址编码来选中芯片内某个特定的存储单元。
• 有单译码和双译码两种结构。其中双译码结构可简化芯片设计,是主要采用的译码结构。
单译码和双译码
译码器
A5
A4
A3
A2
A1
A063
01
存储单元
64 个单元
单译码
行译码
A2
A1
A0 7
10
列译码
A3A4A5
0 1 7
双译码
64 个单元
片选和读写逻辑• 片选和读写控制逻辑是用来选中存储芯片,控
制读写操作。
• 片选端 CS 或 CE :有效时,可以对该芯片进行读写操作。
• 输出 OE :控制读操作。有效时,芯片内数据输出。该控制端对应系统的读控制线。
• 写 WE :控制写操作。有效时,数据写入芯片中。该控制端对应系统的写控制线。
静态 RAM
• SRAM 的基本存储单元是触发器电路。
• 每个基本存储单元存储二进制数一位。
• 许多个基本存储单元形成行列存储矩阵。
• SRAM 一般采用“字结构”存储矩阵:每个存储单元存放多位( 4 、 8 、 16 等);每个存储单元具有一个地址。
SRAM芯片 2114
• 存储容量为 1024×4
• 18 个引脚:– 10根地址线 A9~ A0
– 4根数据线 I/O4~ I/O1
– 片选 CS– 读写 WE
1
2
3
4
5
6
7
8
9
18
1716
15
14
13
12
11
10
Vcc
A7
A8
A9
I/O1
I/O2
I/O3
I/O4
WE
A6
A5
A4
A3
A0
A1
A2
CS
GND
SRAM芯片 6264• 存储容量为 8K×8
• 28 个引脚:– 13根地址线 A12~
A0
– 8根数据线 D7~ D0
– 片选 CS1 、 CS2– 读写 WE 、 OE
NCA12
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
GND
+5VWECS2
A8
A9
A11
OEA10
CS1D7
D6
D5
D4
D3
1234567891011121314
2827262524232221201918171615
动态 RAM• DRAM 的基本存储单元是单个场效应管及其极间电容。须配备“读出再生放大电路”进行刷新,每次同时对一行的存储单元进行刷新。
• 每个基本存储单元存储二进制数一位,许多个基本存储单元形成行列存储矩阵。
• DRAM 一般采用“位结构”存储体:每个存储单元存放一位,需要 8 个存储芯片构成一个字节单元。每个字节存储单元具有一个地址。
DRAM芯片 4116• 存储容量为 16K×1
• 16 个引脚:– 7根地址线 A6~ A
0
– 1根数据输入线 DIN
– 1根数据输出线 DO
UT
– 行地址选通 RAS– 列地址选通 CAS– 读写控制 WE
VBB
DIN
WERAS
A0
A2
A1
VDD
VSS
CASDOUT
A6
A3
A4
A5
VCC
12345678
16151413121110
9
DRAM4116 的刷新
• 采用“仅行地址有效”方法刷新• 行地址选通 RAS 有效,传送行地址• 列地址选通 CAS无效,没有列地址• 芯片内部实现一行存储单元的刷新• 没有数据输入输出• 存储系统中所有芯片同时进行刷新• DRAM必须每隔固定时间就刷新
DRAM芯片 2164• 存储容量为 64K×1
• 16 个引脚:– 8根地址线 A7~ A
0
– 1根数据输入线 DIN
– 1根数据输出线 DO
UT
– 行地址选通 RAS– 列地址选通 CAS– 读写控制 WE
NCDIN
WERAS
A0
A2
A1
GND
VSS
CASDOUT
A6
A3
A4
A5
A7
12345678
16151413121110
9
EPROM
• 顶部开有一个圆形的石英窗口,用于紫外线透过擦除原有信息。
• 一般使用专门的编程器 (烧写器 ) 进行编程。编程后,应该贴上不透光封条。
• 出厂未编程前,每个基本存储单元都是信息 1 。编程就是将某些单元写入信息 0 。
EPROM芯片 2716• 存储容量为 2K×8
• 24 个引脚:– 11根地址线 A10~
A0
– 8根数据线 DO7~DO0
– 片选 / 编程 CE/PGM
– 读写 OE– 编程电压VPP
VDD
A8
A9
VPP
OEA10
CE/PGMDO7
DO6
DO5
DO4
DO3
123456789101112
242322212019181716151413
A7
A6
A5
A4
A3
A2
A1
A0
DO0
DO1
DO2
Vss
EPROM芯片 2764
• 存储容量为 8K×8
• 28 个引脚:– 13根地址线 A12~
A0
– 8根数据线 D7~ D0
– 片选 CE– 编程 PGM– 读写 OE– 编程电压VPP
VppA12
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
GND
VccPGMNCA8
A9
A11
OEA10
CED7
D6
D5
D4
D3
1234567891011121314
2827262524232221201918171615
EEPROM
• 用加电方法,进行在线 (无需拔下,直接在电路中 )擦写 (擦除和编程一次完成 ) 。
• 有字节擦写、块擦写和整片擦写方法。
• 并行 EEPROM :多位同时进行。
• 串行 EEPROM :只有一位数据线。
EEPROM芯片 2817A• 存储容量为 2K×8
• 28 个引脚:– 11根地址线 A10~ A0
– 8根数据线 I/O7~ I/O0
– 片选 CE– 读写 OE 、 WE– 状态输出 RDY/BUSY
RDY/BUSY
NCA7
A6
A5
A4
A3
A2
A1
A0
I/O0
I/O1
I/O2
GND
VccWENCA8
A9
NCOEA10
CEI/O7
I/O6
I/O5
I/O4
I/O3
1234567891011121314
2827262524232221201918171615
EEPROM芯片 2864A• 存储容量为 8K×8
• 28 个引脚:– 13根地址线 A12~ A0
– 8根数据线 I/O7~ I/O0
– 片选 CE– 读写 OE 、 WE
NCA12
A7
A6
A5
A4
A3
A2
A1
A0
I/O0
I/O1
I/O2
GND
VccWENCA8
A9
A11
OEA10
CEI/O7
I/O6
I/O5
I/O4
I/O3
1234567891011121314
2827262524232221201918171615
存储器芯片与 CPU 的连接
• 存储器芯片的数据线
• 存储器芯片的地址线
• 存储器芯片的片选端
• 存储器芯片的读写控制线
存储器芯片数据线的连接
• 若芯片的数据线正好 8根:全部数据线与系统的 8 位数据总线分别相连。
• 若芯片的数据线不足 8根:利用多个芯片扩充数据位 (这种扩充方式简称“位扩充” ) 。多个位扩充的存储芯片的数据线分别连接于系统数据总线的不同位数。这些芯片应被看作是一个整体,常被称为“芯片组”。
位扩充
2114( 1 )
A9~ A0
I/O4~ I/O1
片选
D3~ D0
D7~ D4
A9~ A0
2114( 2 )
A9~ A0
I/O4~ I/O1CE
CE
存储器芯片地址线的连接
• 芯片的地址线通常应全部与系统的低位地址总线相连。
• 寻址时,这部分地址的译码是在存储器芯片内完成的,称为“片内译码”。
存储器芯片片选端的连接
• 存储系统常需利用多个存储芯片扩充容量,也就是扩充了存储器地址范围。进行这种“地址扩充”,需要利用存储器芯片的片选端对多个存储器芯片 ( 组 ) 进行寻址。
• 这种寻址方法,主要通过将存储器芯片的片选端与系统的高位地址总线相关联来实现。这种扩充也简称“字扩充”。
地址扩充
片选端
D7~ D0
A19~ A10
A9~ A0
( 2 )
A9~ A0 D7~ D0
CE
( 1 )
A9~ A0 D7~ D0
CE
译码器
0000000001
0000000000
片选端的连接方法
• 片选端常有效
• 全译码
• 部分译码
• 线选译码
方法一:片选端常有效
• 令芯片 ( 组 ) 的片选端常有效。
• 不与系统的高位地址线发生联系。
• 芯片 ( 组 ) 总处在被选中的状态。
• 虽简单易行、但无法再进行地址扩充,会出现“地址重复”。
片选端接地
A19 ~ A15 A14
~ A0
××××× 全 0~全 1
D7~ D0
27256EPROM
A14~ A0
CE
地址重复
• 地址重复是指一个存储单元具有多个存储地址的现象。
• 其原因是有些高位地址线没有用、可任意。
• 出现地址重复时常选取其中既好用、又不冲突的一个“可用地址”。例如: 00000H~ 07FFFH 。即选取的原则:高位地址全为 0 的地址。
方法二:全译码
• 所有的系统地址线均参与对存储单元的译码寻址。包括低位地址线对芯片内各存储单元的译码寻址(片内译码 ) ,以及高位地址线对存储芯片的译码寻址 (片选译码 ) 。
• 采用全译码,每个存储单元的地址都是唯一的,不存在地址重复。
• 译码电路可能比较复杂、连线也较多。
译码和译码器
• 译码:将某个特定的“编码输入”翻译为唯一的“有效输出”的过程。
• 译码电路可以使用门电路组合逻辑。
• 译码电路更多的是采用集成译码器。– 常用的 2:4 译码器: 74LS139– 常用的 3:8 译码器: 74LS138– 常用的 4:16译码器: 74LS154
门电路译码
A1 A0
F0 F1 F2 F3
A19
A18
A17
A16
A15 ( b )
( a )
A0 Y0
Y1
Y
译码器 74LS138
E3E2E1
CBA
Y0Y1Y2Y3Y4Y5Y6Y7
74LS138 片选输入 编码输入 输出E3 E2 E1 C B A Y7 ~ Y0
1 0 0
0 0 0 11111110
0 0 1 11111101
0 1 0 11111011
0 1 1 11110111
1 0 0 11101111
1 0 1 11011111
1 1 0 10111111
1 1 1 01111111
非上述情况 ××× 11111111
全译码
A15
A14
A13
CBA
138
A16 E3
2764
A12~ A0
CEY6E1
A19
A18
A17
E2IO/M
1C000H1DFFFH
全 0~全1
0 0 0 1 1 1 0
地址范围A12~ A0A19A18A17A16A15A14 A13
方法三:部分译码
• 只有部分 ( 高位 ) 地址线参与存储器芯片的译码。
• 每个存储单元将对应多个地址 ( 地址重复 ) ,需要选取一个可用地址。
• 可简化译码电路的设计。但系统的部分地址空间将被浪费。
部分译码- 1
A11~ A0
138
A17 A16
A14 A13
A12(4)(3)(2)(1)
2732273227322732CBA
E3
E2
E1IO/M
CE CE CE CE
Y0Y1Y2
Y3
部分译码- 2
A19~ A15 A14~
A12
A11~ A0 一个可用地址
1234
××10×××10×××10×××10×
000001010011
全 0~全1
全 0~全1
全 0~全1
全 0~全1
20000H~ 20FFFH
21000H~ 21FFFH
22000H~ 22FFFH
23000H~ 23FFFH
方法四:线选译码
• 只用少数几根高位地址线进行芯片的译码,且每根负责选中一个芯片(组)。
• 虽构成简单,但地址空间严重浪费。必然会出现地址重复。一个存储地址会对应多个存储单元。
• 多个存储单元共用的存储地址不应使用。
线选译码
A12~ A0
A13
(1)
2764
(2)
2764
CE CE
A19~ A15 A14
A13
A12~ A0 一个可用地址
12
××××××××××
1 00 1
全 0~全1
全 0~全1
04000H~ 05FFFH02000H~ 03FFFH
存储器芯片读写控制线的连接
• 存储器芯片 OE与系统的读命令线相连。当芯片被选中、且读命令有效时,存储器芯片将开放并驱动数据到总线。
• 存储器芯片WE与系统的写命令线相连。当芯片被选中、且写命令有效时,允许总线数据写入存储器芯片。
存储器芯片与 CPU 的配合
• CPU 的总线负载能力。 CPU 的总线驱动能力有限。单向传送的地址和控制总线,可采用三态锁存器和三态单向驱动器等来加以锁存和驱动;双向传送的数据总线,可以采用三态双向驱动器来加以驱动。
• CPU能否与存储器芯片的存取速度相配合。分析存储器芯片的存取速度是否满足 CPU 总线时序的要求。如果不能满足,可考虑更换芯片,或在总线周期中插入等待状态TW 。
输入输出及接口
• I/O 接口概述
• 无条件传送方式
• 查询传送方式
• 中断传送方式
• DMA传送方式
I/O 接口
• 微机的外部设备多种多样,工作原理、驱动方式、信息格式、以及工作速度方面彼此差别很大,它们不能与 CPU 直接相连。必须经过中间电路再与系统相连,这部分电路被称为 I/O接口电路。
• I /O 接口是位于系统与外设间、用来协助完成数据传送和控制任务的逻辑电路。 PC 机系统板的可编程接口芯片、 I/O 总线槽的电路板(适配器 )都是接口电路。
I/O 接口的主要功能
• 对输入输出数据进行缓冲和锁存
• 对信号的形式和数据的格式进行变换
• 对 I/O端口进行寻址
• 与 CPU 和 I/O 设备进行联络
I/O 接口的典型结构
控制总线 CB
地址总线 AB
I/O 接口电路数据
控制
状态
数据总线 DB
CPU 外设
控制寄存器
状态寄存器
数据寄存器
I/O 接口的内部结构
• 数据寄存器:保存外设给 CPU 和 CPU 发往外设的数据。
• 状态寄存器:保存外设或接口电路的状态。
• 控制寄存器:保存 CPU给外设或接口电路的命令。
I/O 接口的外部特性
• I/O 接口的外部特性主要体现在引脚上,分成两侧信号。
• 面向 CPU 一侧的信号:用于与 CPU连接。主要是数据、地址和控制信号。
• 面向外设一侧的信号:用于与外设连接。提供的信号五花八门,功能定义、时序及有效电平等差异较大。
I/O 接口电路芯片的类型
• 通用接口芯片:支持通用的数据输入输出和控制的接口芯片。
• 面向外设的专用接口芯片:针对某种外设设计、与该种外设接口。
• 面向微机系统的专用接口芯片:与 CPU 和系统配套使用,以增强其总体功能。
I/O 接口的可编程性
• 许多 I/O 接口电路具有多种功能和工作方式,可以通过编程的方法选定其中一种。
• 接口需要进行物理连接,还需编写接口软件。
• 接口软件有两部分工作:初始化程序段——设定芯片工作方式等;数据交换程序段—管理、控制、驱动外设,负责外设和系统间信息交换。
I/O 端口的编址
接口电路占用的 I/O端口有两类编排形式:
• I/O端口单独编址: I/O 地址空间独立于存储地址空间,如 8086/8088 。
• I/O端口与存储器统一编址:它们共享一个地址空间,如 M6800 。
I/O 端口单独编址
• 优点:– I/O端口的地址空间独立– 控制和地址译码电路相对简单– 专门的 I/O 指令使程序清晰易读
• 缺点:– I/O 指令没有存储器指令丰富 内存
空间I/O空间
FFFFF
0
FFFF
I/O 端口统一编址
• 优点:– 不需要专门的 I/O 指令– I/O 数据存取与存储器
数据存取一样灵活• 缺点:
– I/O端口要占去部分存储器地址空间
– 程序不易阅读 (不易分清访存储器和访问外设 )
内存部分
I/O部分
存储器空
间
00000
FFFFF
输入指令 IN
IN AL, i8 ;字节输入,直接寻址IN AL, DX ;字节输入,间接寻址
IN AX , i8 ;字输入,直接寻址IN AX , DX ;字输入,间接寻址
输出指令 OUT
OUT i8 , AL ;字节输出,直接寻址
OUT DX , AL ;字节输出,间接寻址
OUT i8 , AX ;字输出,直接寻址
OUT DX , AX ;字输出,间接寻址
8086/8088 的 I/O 端口
• 8086/8088 的 I/O端口采用单独编址方式,只能通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口 (Port) ,即 I/O 地址。
• 用于寻址外设端口的地址线为 16条,端口最多为 216 = 65536 个,端口地址为 0000H~FFFFH 。
• 每个端口用于传送一个字节的外设数据。
8086/8088 的 I/O 端口寻址方式
• 直接寻址:只用于寻址 00H~FFH前 256 个端口,操作数 i8 表示端口号。
• 间接寻址:可用于寻址全部 64K 个端口, DX寄存器的值就是端口号。
• 对大于 FFH 的端口只能采用间接寻址方式。
8086/8088 的 I/O 端口数据交换方式
• 如果输入输出一个字节,利用 AL 寄存器。• 如果输入输出一个字,利用 AX寄存器。• 输入一个字,实际上是从连续两个端口输入两
个字节,分别送 AL( 对应低地址端口 ) 和 AH( 对应高地址端口 ) 。
• 输出一个字,实际上是将 AL( 对应低地址端口 ) 和 AH( 对应高地址端口 )两个字节的内容输出给连续两个端口。
I/O 端口地址的译码• I/O 地址的译码方法与存储器地址的译码方法
一样,但常采用部分译码方式。可以是中间地址线不连接、也有最低地址线不连接的情况。
• 为了给系统一定的选择余地,有些接口电路利用比较器、开关或跨接器等进行多组 I/O 地址的译码。
• 除采用译码器、门电路进行译码外, I/O 地址译码还经常采用可编程逻辑器件 PLD 等。
数据传送方式• 程序控制下的数据传送:通过 CPU执行程序
中的 I/O 指令来完成传送,又分为:无条件传送、查询传送、中断传送。
• 直接存储器存取 (DMA) :传送请求由外设向 DMA 控制器 (DMAC)提出,后者向 CPU申请总线,最后 DMAC利用系统总线来完成外设和存储器间的数据传送。
• I/O 处理机 :CPU委托专门的 I/O 处理机来管理外设,完成传送和相应的数据处理。
无条件传送方式• 在 CPU与慢速变化的设备交换数据时,可以
认为它们总是处于“就绪”状态,随时可以进行数据传送,这就是无条件传送,或称立即传送、同步传送。
• 适合于简单设备,如 LED 数码管、按键或按纽等。
• 无条件传送的接口和操作均十分简单。这种传送有前提:外设必须随时就绪。
无条件传送接口电路
+5V
K7
K1K0
D0~D7
A0~A15
CLKLS06反相驱动器
LS244三态缓冲器
8000H
译码+5V
LED0
LED7
…
…
G
IOW
IOR &
&
LS2738D锁存器
无条件输入输出
• 输入时执行输入 IN指令MOV DX , 8000HIN AL, DXMOV BUFIN, AL
• 输出时执行输出 OUT指令MOV AL, BUFOUTMOV DX , 8000HOUT DX , AL
查询传送方式
• CPU需要先了解 (查询 ) 外设的工作状态,在外设可以交换信息的情况下实现数据输入或输出。
• 对多个外设的情况, CPU 按一定顺序依次查询(轮询 ) 。先查询的外设将优先进行数据交换。
• 查询传送的特点是:工作可靠,适用面宽,但传送效率低。
查询传送的两个环节⑴查询环节• 寻址状态口• 读取状态寄存器的标志位• 若不就绪就继续查询,直至就绪
⑵传送环节• 寻址数据口• 是输入,通过输入指令从数据端口读入数据• 是输出,通过输出指令向数据端口输出数据
输入状态
就绪?就绪?
数据交换Y
N
查询输入接口电路
+5V
8D锁存器
8 位三态缓冲器
译码1 位三态缓冲器
A0~A15
8000H
8001H
D0~D7
D0
输入设备
IOR
STB
&
& IOR
RQD
查询输入程序
mov dx,8000h;DX 指向状态端口s1:in al,dx ; 读状态端口 test al,01h ; 测试标志位 D0 jz s1 ;D0=0 ,未就绪,继续查询 inc dx ;D0=1 ,就绪, DX 指向数据端
口 in al,dx ;从数据端口输入数据
查询输出接口电路
8D锁存器
译码
1 位三态缓冲器
A0~A158000H
8001H
D0~D7
D7
+5V输出设备
ACK
IOW
IOR
Q D
R
&
&
查询输出程序
mov dx,8000h;DX 指向状态端口s1:in al,dx ; 读取状态端口的状态数据
test al,80h ; 测试标志位 D7 jnz s1 ;D7=1 ,未就绪,继续查询 inc dx ;D7=0 ,就绪, DX 指向数据端口 mov al,buf ;变量 buf送 AL out dx,al ;将数据输出给数据端口
中断传送方式
• 中断传送是一种效率更高的程序传送方式。
• 进行传送的中断服务程序是预先设计好的。中断请求是外设随机向 CPU提出的。
• CPU 对中断请求的检测是有规律的:一般是在每条指令的最后一个时钟周期采样中断请求输入引脚。
并行接口
• 并行接口概述
• 并行接口芯片 8255
• 数码管及其接口
并行接口概述
• 并行数据传输是以计算机字长,通常是 8 、 16或 32 位为传输单位,利用 8 、 16 或 32 个数据信号线一次传送一个字长的数据。
• 适合于外部设备与微机之间进行近距离、大量和快速的信息交换。
• 并行数据传输需要并行接口的支持。
并行接口芯片 8255
• 8255是具有多种功能的可编程并行接口芯片。
• 分 3 个端口,共 24 个外设引脚。
• 有 3 种输入输出工作方式。方式 0 :基本输入输出方式方式 1 :选通输入输出方式方式 2 :双向选通传送方式
8255芯片的数据端口
• 端口 A :引脚为 PA0~ PA7 ,支持工作方式 0/1/2 ,常作数据端口。
• 端口 B :引脚为 PB0~ PB7 ,支持工作方式 0/1 ,常作数据端口。
• 端口 C :引脚为 PC0~ PC7 ,仅支持工作方式 0 ,每位可独立操作,可作数据、状态和控制端口。
8255 方式控制字
• D7 : 1 。• D6/D5 : 00~ A 口方式 0 , 01~ A 口方式 1 ,
1* ~ A 口方式 2 。• D4 : 0~ A 口输出, 1~ A 口输入。• D3 : 0~ C 口高 4 位输出, 1~ C 口高低 4 位
输入。• D2/D1 : 0~ B 口方式 0 , 1~ B 口方式 1 。• D0 : 0~ C 口低 4 位输出, 1~ C 口低 4 位输
入。
8255 初始化编程示例
• 要求: A端口方式 1 输入, B端口方式 0输出, C端口上半部输出 /下半部输入。
• 方式控制字: 10110001B 或 0B1H 。
• MOV DX,0FFFEH ;假设控制端口为 0FFFEHMOV AL,0B1H ;方式控制字OUT DX,AL ;送到控制端口
8255在 PC 机中的应用
• 端口地址: 60H , 61H , 62H 和 63H 。
• 端口 A 为方式 0 输入,用来读取键盘扫描码。端口 B 为方式 0 输出,用来控制扬声器等。端口 C 为方式 0 输入,用来读取系统状态和配置。
• MOV AL ,99H ;方式控制字OUT 63H,AL ;送到控制端口
8255 与打印机接口( 1 )
BUSY
D0~D7
8255A
PC7
PC2
PA0~PA7
打印机
STROBE
8255 与打印机接口( 2 )
MOV DX,0FFFEH ;控制端口地址MOV AL,10000001B ;方式控制字OUT DX,ALMOV AL,00001111BOUT DX,AL ;使 PC7 = 1
8255 与打印机接口( 3 )PRNC PROC
PUSH AXPUSH DX
PRN: MOV DX,0FFFCH ;端口 CIN AL,DX ;查询状态AND AL,04H ;忙否 (PC2= 0?)JNZ PRN ;PC2= 1,等待MOV DX,0FFF8H ;PC2=
0,输出MOV AL,AHOUT DX,AL ;将打印数据输出
8255 与打印机接口( 4 )MOV DX,0FFFEH ;送出低
脉冲MOV AL,00001110B ;使 PC7
= 0OUT DX,ALNOPMOV AL,00001111B ;使 PC7
= 1OUT DX,ALPOP DXPOP AXRET
PRNC ENDP
数码管及其接口
• 7段发光二极管 LED 可以组成 LED 数码管。
• LED 数码管可以显示内存地址和数据等。
h
gf
e
d
c
b
a
LED 数码管的结构
阳极
+5V
abcdefgh
阴极
abcdefgh
共阴极共阳极
单个数码管的显示
• LED 数码管显示一位十六进制数
LED DB 3FH,06H,… ; 显示代码表MOV BX,1 ; BX←要显示的数字MOV AL,LED[BX]; 换码: AL←LEBTB[B
X]MOV DX,PORT ; 数码管端口地址OUT DX,AL ; 输出显示
多个数码管的显示
• 8 个数码管:用 2 个 8 位输出端口控制。
• 位控制端口:控制哪个(位)数码管显示。
• 段控制端口:控制哪个段显示,决定具体显示什么数码。
第一章练习参考答案
• 8 位无符号数的表示范围是 0~255; 8 位有符号数的表示范围是 (-128)~(+127) 。 16 位的表示范围分别是 0~65535 和 (-32768)~(+32767) 。
• ( + 37) = 00100101B , ( - 37) = 11011011B 。
• 50 的 BCD 码为 50H , 50H 的 BCD 码是 80H。
• 8 位机器数 46H ,作为无符号数是 70 、作为有符号数补码是 (+70) 、作为 BCD 码是 46 、作为ASCII 码代表“ F”。
MOV 指令练习答案 (1)
• MOV AL , BHMOV AH , 0
• MOV AX , wbuf2MOV wbuf1 ,AX
• MOV AX , ESMOV DS , AX
• MOV AX , 2000HMOV DS , AX
MOV 指令练习答案 (2)
• MOV BYTE PTR [2000H], 12HMOV WORD PTR [2000H], 12H
• WVAR DB ?;定义字节型变量 ;假设其偏移地址为 2000H
MOV WVAR , 12H
XCHG 指令练习答案
•方法 1 : MOV AX , B XCHG AX , A MOV B , AX•方法 2 : MOV AX , A MOV BX , B MOV A , BX MOV B , AX
堆栈操作练习答案
• 设 AX=1234H , SP=2000H ,执行 PUSH AX指令后 SP=1FFEH; SS:[SP]=34H , SS:[SP+1]=12H 。
• 利用堆栈将两个字变量 A 、 B 内容互换。PUSH APUSH BPOP APOP B
加减类指令练习答案( 1)
• MOV AH , 64HMOV AL , 0A8HCMP AH , ALADC AH , ALINC AH
• AH=64H, C=1,P=0,A=1,Z=0,S=1,OF=1.
• AH=0DH, C=1,P=0,A=0,Z=0,S=0,OF=0.
• AH=0EH, C=1,P=0,A=0,Z=0,S=0,OF=0.
加减类指令练习答案( 2)• MOV AX , X
ADD AL , YADC AH , 0HMOV Z , AX
• MOV AX , XADD AX , YMOV DX , 0HADC DX , 0HMOV WORD PTR Z+2 ,DXMOV WORD PTR Z , AX
加减类指令练习答案( 3)
• MOV DX , WORD PTR X+2MOV AX , WORD PTR XADD AX , WORD PTR YADC DX , WORD PTR Y+2MOV WORD PTR Z+2 , DXMOV WORD PTR Z , AX
乘除法指令练习答案
• MOV AX , XIMUL YADD AX , 125ADC DX , 0IDIV ZMOV X , AXMOV Y , DX
• 注意:乘除法指令均不能使用立即数操作数。
逻辑运算指令练习答案
• OR AL, 80H;使 AL最高位为“ 1”,其他位不变。• XOR AX , AX ;使 AX清 0 ,同时清 CF 为 0 。• XOR AL, 0FH;D7~D4 位不变, D3~D0 位取反。• OR AL, 30H; 0~9 中的数变成对应的 ASCII 码。• AND AL, 5FH; ASCII 码小写变成大写。• OR AL, 20H; ASCII 码大写变成小写。
用移位指令实现乘法
• SHL逻辑左移一位相当于无符号数乘以 2• SHR逻辑右移一位相当于无符号数除以 2
• XOR AH, AH ; AH清 0SHL AX, 1 ; AX = AL * 2MOV BX, AX ; BX = AL * 2SHL AX, 1 ; AX = AL * 4SHL AX, 1 ; AX = AL * 8ADD AX, BX ; AX = AL * 10
ASCII 码转换成 BCD 码ASCII DB ’38’BCD DB ?• • • • •MOV AL, ASCII ; AL = 33HAND AL, 0FH ; AL = 03HMOV AH, ASCII+1 ; AH = 38H MOV CL, 4SHL AH, CL ; AH = 80HOR AL, AH ; AL = 83H MOV BCD, AL
实现 CBW指令功能的程序- 1
MOV AL,BVAR ;取出要判断的数据TEST AL,80H ; 测试最高位JZ NEXT ;最高位为 0 ,转移到 NEXTMOV AH,0FFH ;最高位为 1 ,设置 AH = FFHJMP DONE ;无条件跳过另一个分支
NEXT:MOV AH,0 ;最高位为 0 转移到此 DONE: ……
实现 CBW指令功能的程序- 2
MOV AL,BVAR ;取出要判断的数据CMP AL,0 ;与 0比较JNS NEXT ;最高位为 0 ,转移到 NEXTMOV AH,0FFH ;最高位为 1 ,设置 AH = FFHJMP DONE ;无条件跳过另一个分支
NEXT:MOV AH,0 ;最高位为 0 转移到此 DONE: ……
取三个无符号字变量的最小值到 AX
MOV AX,V1 ;假定 V1 最小CMP AX,V2 ;与V2比较JBE NEXT ;V1<V2 ,转移到 NEXTMOV AX,V2 ;V2<V1 NEXT: CMP AX,V3JBE DONE ;AX(V1 或 V2) 最小
MOV AX,V3 ;V3 最小DONE: ……
字节数组求和 MOV CX,LENGTHOF ARRAY XOR AX,AX ;求和初值为 0 JCXZ DONE ;0 个数组元素,不再求和 MOV BX,AX ;数组指针为 0
AGAIN: ADD AL,ARRAY[BX] ; 求和 INC BX LOOP AGAINDONE: MOV SUM,AL ;保存结果
显示寄存器 DX的内容 MOV CX,4 ; 共 4 位十六进制数
dregd2: PUSH CX MOV CL,4 ROL DX,CL POP CX
PUSH DX CALL HTOASC ; 调用子程序 MOV AH,2 INT 21H ; 显示一个字符 POP DX LOOP dregd2
十六进制数转换成 ASCII 码的子程序HTOASC PROC ;过程定义
AND DL,0FH ;只取 DL的低 4 位OR DL,30H ;DL高 4 位变成 3CMP DL,39H ;是 0~ 9 ,还是 A~FJBE htoendADD DL,7 ;是 A~ F ,再加上 7
htoend: RET ;子程序返回HTOASC ENDP ;过程结束