1、微机原理及应用课程教学安排总学时数:48 其中课堂授课:40 学时 实验:8 学时微机原理及应用是一门专业基础课,主要从计算机硬件的角度介绍和描述计算机的组成结构、工作原理和应用基础。一、本课程的学习重点和要求:1 学习并了解计算机中的常用数制及转换,微型计算机的基本组成结构和工作原理。2 学习并了解 16 位微处理器的主要内部结构、功能部件、外部特性、主要引脚信号、最大寻址范围、运算字长、工作方式和主要操作功能。3 学习并了解计算机中常用存储器的分类、特点、工作原理、外部特性和用途。4 学习并熟练掌握 8086CPU 的指令系统、汇编语言的基本语法结构和汇编语言程序设计方法。5 学习并了解计
2、算机中输入/ 输出(I/O )接口的主要作用、功能、工作原理和常用的基本控制方式以及串、并行通信的特点。6 学习并熟练掌握可编程并行 I/O 通信接口芯片 8255 的主要作用、功能、工作原理、内部主要结构和外部特性、初始化编程和应用技术。掌握简单人机外设(按键和 LED 数码显示器)的工作原理、与 CPU 的连接和管理方法。7 学习并熟练掌握可编程计数/ 定时控制器 I/O 接口芯片 8253 的主要作用、功能、工作原理、内部主要结构和外部特性、初始化编程和应用。8 学习并了解计算机中其它常用 I/O 接口电路芯片的主要作用、功能、工作原理、编程和应用。其中包括:中断控制器 8259 的主要
3、作用、功能、工作原理、编程和应用方法。A/D 和 D/A 转换接口电路的主要作用、功能、工作原理和应用方法等。二、课堂授课内容、学习重点及安排:第一章:计算机概述及基础知识1.1计算机中常用数制及转换方法、补码及符号数的表示方法。1.2计算机中常用集成电路(数字逻辑电路)简介。1.3 补充 1:计算机中常用半导体存储器的作用、分类、特点、外部特性及其与系统的连接方法。1.4补充 2:微型计算机的基本组成结构及工作原理。本章学习重点和要求:1、学习并掌握计算机中常用数制及转换方法、补码及符号数的表示方法。2、学习并了解常用半导体存储器的作用、分类和特点。3、学习并了解微型计算机的基本组成结构。第
4、二章:16 位微处理器2.1 INTEL 公司的 16 位 CPU 8086/8088 的主要内部结构、功能部件和存储器组织结构(执行部件 EU、总线接口部件 BIU)。2.2 8086/8088 CPU 的外部特性、引脚信号和工作模式(最大最小工作模式)。2.3 8086 CPU 的主要操作功能(复位、启动和中断操作)。本章学习重点和要求:1、学习并了解 8086 CPU 内部主要功能部件 EU 和 BIU 的主要作用和组成结构,CPU 内部主要工作寄存器及作用,8086 CPU 的外部特性和引脚信号分类及作用,最大寻址范围和运算字长。2、学习并了解 8086 系统的存储器组织结构和管理模式
5、(逻辑地址和物理地址的概念)。3、学习并掌握 8086 CPU 的工作模式和主要操作(复位、启动和中断操作)功能。4、学习并了解 8086 CPU 的中断分类、中断功能、中断向量和中断响应过程等。第三章:86 系列微型计算机的指令系统3.1 86 系列汇编语言及指令的格式与寻址方式(指令的语句格式和 CPU 的寻址方式)。3.2 常用传送类指令的语法格式详解及应用举例。3.3 常用数据操作类指令的语法格式详解及应用举例。3.4 常用控制类指令的语法格式详解及应用举例。本章学习重点和要求:学习并掌握 8086 CPU 汇编语言指令的语法格式、寻址方式、指令功能和应用。第四章:微型计算机的程序设计
6、4.1程序设计步骤。4.2简单程序结构及设计举例。4.3分支程序结构及设计举例。4.4循环程序结构及设计举例。4.5子程序结构及设计举例。4.6查表程序及其应用举例。本章重点:学习并掌握常用各类程序结构、设计方法、步骤和应用。第五章:微型计算机汇编语言及汇编程序5.1 宏汇编语言的基本语法(常用伪指令的语句格式、常数、变量、标号、运算符和表达式)。5.2 伪指令、宏指令及系统功能调用。5.3 汇编语言程序设计。本章学习重点和要求:学习并了解宏汇编语言的基本语法结构及掌握常用基本伪指令的使用方法。第六章:微型计算机的输入输出接口技术及其应用6.1微型计算机输入输出接口的功能、作用和常用控制方式。
7、6.2微型计算机基本输入输出方式、作用和特点(串、并行通信接口技术的作用、特点和应用,重点是并行接口技术)。6.3可编程并行通信接口芯片 5255A 概述。(8255A 的主要作用、功能、工作方式和工作原理)。6.4 8255 主要内部结构、外部特性、引脚信号及其与系统的连接。6.5 8255A 的控制字及初始化 编程。6.6补充 3:8255A 在交通灯控制系统中的应用举例。6.7补充 4:基本人机外设的结构、工作原理、接口技术和应用系统设计(主要介绍按键和 LED 数码显示器的工作原理、与 计算机的连接、管理方式和检测及控制程序的设计方法等)。本章学习重点和要求: 1、学习并了解微型计算机
8、输入输出接口的功能、作用和常用控制方式。2、学习并了解计算机的串、并行通信的作用和特点。3、学习并掌握 8255A 在计算机系统中的主要作用和用途、功能特点、工作原理、工作方式、主要内部结构、外部特性及其与系统的连接、控制字及初始化编程和应用。4、学习并掌握按键和 LED 数码显示器的工作原理,与计算机的连接和管理程序的设计方法。第七章:微型计算机的计数/ 定时接口技术及其应用7.1可编程计数/ 定时控制器接口芯片 8253 概述。(8253 的主要作用、功能和工作原理)。7.2 8253 主要内部结构、外部特性、引脚信号及其与系统的连接。7.3 8253 的控制字、初始化编程及工作方式描述。
9、7.4 补充 5:8253 应用系统设计举例。 7.5补充 6:计数/定时 接口技术在车辆性能检测中的应用及应用系统设计举例。 本章学习重点和要求:1、学习并掌握 8253 在计算机系统中的主要作用和用途、功能特点、主要内部结构、工作原理、外部特性及其与系统的连接。2、学习并掌握 8253 的工作方式和初始化编程。3、学习并掌握 8253 的简单应用。第八章:中断控制器 8259 及其应用概述8.1可编程中断控制器接口芯片 5259A 概述。(8259A 的主要作用、功能、工作方式和工作原理)。8.2 8259 主要内部结构、外部特性、引脚信号及其与系统的连接。8.3 8259A 的控制字及初
10、始化 编程简介。本章学习重点和要求:1、学习并了解 8259A 在系统中的作用、功能、工作方式和工作原理。2、学习并了解 8259 主要内部结构。3、学习并了解 8259A 的控制字及初始化编程。第九章:A/D 及 D/A 转换技术9.1 A/D 及 D/A 转换技术应用概述。9.2 D/A 转换的作用、工作原理和主要技术性能指标。9.3 8 位 D/A 芯片 DAC0832 概述及应用简介。9.4 A/D 转换的作用、工作原理和主要技术性能指标。9.5 8 位 A/D 转换 芯片 ADC0809 概述及应用简介。本章学习重点和要求:学习并了解 A/D 和 D/A 转换技术的主要作用和主要技术
11、性能指标。总复习第一章:计算机概述及基础知识一、计算机中常用的半导体存储器类型和缩写:1、只读存储器 ROM:(Read Only Memory)2、一次性可编程只读存储器 PROM(Programmable ROM)3、随机存取存储器:RAM(Random Access Memory)4、静态 RAM:SRAM(Static RAM)5、动态 RAM:DRAM(Dyanmic RAM)6、光可擦除电可编程只读存储器 EPROM(Erasable Programmable ROM)7、电擦除电可编程只读存储器 EEPROM(Electrically Erasable Programmable
12、ROM)8、闪烁存储器 Flash Memory二、常用存储器容量单位及表示方法:1字节=8 位二进制数,1字=2 字节=16 位二进制数,双字=4 字节=32 位二进制数1KB=1024B(字节) 1MB=1024KB1GB=1024MB 1TB=1024GB1节=16 字节 1页=256 字节 1段=64KB(字节)三、存储器中常用的术语、概念和含义:1、存储器的物理地址:使用 CPU 全部地址线对存储器进行的编址,称为存储器的物理地址或绝对地址。 (使用 CPU 全部寻址范围内的地址码对存储单元进行的编址称为存储器的物理地址或绝对地址。 )2、存储器的逻辑地址:由 CPU 内部段寄存器(
13、即段基址)和偏移地址寄存器( 例如: SI、DI、BP、和 SP 等寄存器) 的当前 值所构成的地址称为逻辑地址。3、一个存储单元的物理(绝对) 地址是唯一的,但可以有多个逻辑地址!(或:一个存储单元可以有多个逻辑地址,但仅有一个物理地址!)存储单元的物理地址可由段寄存器(即段基址)和偏移地址经运算或变换得到。其算法为:绝对地址=段基址 X16(左移 4 位)+偏移地址例 1:段基址存放在段寄存器 CS 中,即 CS=2000H,偏移地址在 IP 中,即 IP=2200H,则: 绝对 地址 =段基址 X16+偏移地址=20000H+2200H=22200H例 2:已知:CS=2200H IP=
14、0200H,试计算其绝对地址。绝对地址=段基址 X16+偏移地址=22000H+0200H=22200H由上可知绝对地址为 22200H 的存储单元它的逻辑地址可以有多个。四、关于计算机中断技术中的基本概念和技术术语:1、中断定义:计算机在执行当前程序或任务时,由于随机或突发事件的产生而暂停当前的工作转去为其服务,服务完成后再返回到刚才的断点处继续在这之前的工作,此过程称之为:中断。2、断点:CPU 响应中断时程序中止处的 CS 和 IP 的值( 即:程序中止处的下一条指令的地址)。3、中断源:采用中断方式与 CPU 或系统进行信息交换的外设或部件。4、中断向量:中断服务子程序的入口地址被称之
15、为:中断向量。5、中断向量表:用来存放中断服务子程序的入口地址的存储区域被称之为:中断向量表。6、中断类型码:在 CPU 响应外设中断请求时,由外设向 CPU 提供的用来查找中断向量表的索引码。7、现场:在中断服务子程序中所使用的那些与主程序中符号相同但定义或作用不同的全局变量、工作寄存器或工作单元等。 (即:在执行中断服务子程序时需要保护的内容)8、中断优先级:外设产生中断请求时 CPU 或中断控制器对其进行响应或处理的先后顺序。9、可屏蔽中断:可使用中断开、关指令控制 CPU 对中断请求的响应。这类中断称之为可屏蔽中断。8086 CPU 的开中断指令为 STI,可允许CPU 响应外部中断请
16、求。关中断指令为 CLI 可禁止 CPU 响应外部中断请求。10、非屏蔽中断:CPU 的中断响应不能使用中断开、关指令进行控制。这类中断称为不可屏蔽中断或非屏蔽中断(不可使用中断开、关指令控制CPU 对中断请求的响应。这类中断称之为不可屏蔽中断或非屏蔽中断)。非屏蔽中断的优先级要高于可屏蔽中断。11、中断优先级:多个中断源同时申请中断时 CPU 的响应策略或中断嵌套规则。12、采用中断技术的优点:CPU 工作效率高、实时性好、便于处理随机和突发事件。13、中断响应和处理的实质内容:确定发出中断请求的中断源(即外设)或随机事件,找到并执行为该中断源服务的中断服务子程序。也即:其实质就是为了执行一
17、段服务程序。五、8086/8088 CPU的中断系统1、中断分类:硬件中断、软件中断和内部操中断。a. 硬件中断:由外设或外部信号所产生的中断请求称之为:硬件中断。其硬件中断又可分为非屏蔽中断和可屏蔽中断,其中,非屏蔽中断请求信号要连接到 CPU 的 NMI 引脚,而可屏蔽中断请求信号要连接到 CPU 的 INTR 引脚.b. 软件中断: 由执 行 CPU 中断指令: INT n 所产生的中断称为软件中断。c. 内部操中断: 由 CPU 内部的一些特定操作(例如:除数为 0 时所引起的除数为 0 中断,符号数运算过程中产生溢出时所引起的溢出中断,为方便程序的调试,每执行完一条指令时都可产生一次
18、中断的单步中断等)所引起的中断称之为:内部操作中断。2、中断响应条件:a. 非屏蔽中断:将非屏蔽中断源的中断请求信号连接到 CPU 的 NMI引脚,编写好中断服务子程序,并在主程序的系统初始化程序中建立好中断向量表(即:将中断服务子程序的入口地址填写到中断向量表中,其向量表地址由分配给该外设的中断类型码确定)。b. 可屏蔽中断: 将可屏蔽中断源的中断 请 求信号连接到 CPU 的 INTR引脚,编写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量表,并在主程序中的适当位置处使用 CPU 的开中断指令 STI 打开 CPU 中断,允许 CPU 接收外部可屏蔽中断请求。c. 软件中断:编
19、写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量表,在需要中断时的程序位置处放一条 INT n 指令。d. 内部操中断:编写好中断服务子程序,在主程序的系统初始化程序中建立好中断向量表。当系统中出现特定内部操作(即:除数为 0、溢出和单步操作)时即可对其进行服务。e.3、中断向量表的建立:即:利用程序或指令将中断服务子程序的入口地址(逻辑地址)填写到中断向量表中。中断向量表的地址由外设的中断类型码确定。例如已知某外设的中断类型码为 20H,其中断服务子程序的入口地址为:1234H:5678H,为其建立中断向量表就是将中断服 务子程序的入口地址 1234H:5678H 填写到自内存空
20、间地址 0 段 20HX4 开始的连续 4个字节的存储单元中,即 0000H:20HX4+0-0000H:20HX4+3 的连续 4 个单元中,其存放顺序为:低地址存放低字节,高地址存放高字节:即自 20HX4开始的连续 4 个字节的存储单元的内容分别如下: (20H*4+3)=12H。(20H*4+2)=34H,(20H*4+1)=56H,(20H*4+0)=78H,4、可屏蔽中断的响应过程:(1). 从数据总线 D.B 上读取外设提供的中断类型码并暂存.(2). 将 FR 内容存入堆栈保护.(3). 将标志位 IF 和 TF 清 0,以便禁止 INTR 中断.(4). 将当前的程序断点 C
21、S:IP 存入堆栈 保护.(5). 利用外设提供的中断类型码计算中断向量表地址,并从中取出中断处理子程序的入口地址转去执行服务程序.(6). 执行完中断服务子程序后恢复断点和 FR 的内容.(7). 从中断返回。 (即执行一条中断返回指令 IRET)第 5 章 86 系列微型计算机的指令系统寻址方式:如何获得操作数的方法称之为寻址方式,8086CPU 的寻址方式有以下 4 类:1 立即寻址:当操作数直接出现在指令中时称为立即(数)寻址2 寄存器寻址:当操作数在 CPU 内部寄存器中时称为寄存器寻址3 直接寻址:当操作数的地址出现在指令中时称为直接寻址4 寄存器间接寻址:当操作数的地址出现在寄存
22、器中时称为寄存器寻址。在该寻址方式中操作数一定在存储单元中,但存储单元的有效地址要求使用寄存器指定,这些寄存器可以使用 BX、BP、SI 和 DI之一,即:存储单元的有效地址要放在这其中的某个寄存器中。有效地址:寻址所需要的偏移地址称之为有效地址注意:在以上寻址方式中若目标操作数是非 CS 的段寄存器时,只能采用寄存器寻址方式产生或获得操作数!例如:将数据段寄存器 DS 的内容设置为 2000H若直接使用指令:MOV DS, 2000H 是错误的,可改为以下方式:MOV AX, 2000HMOV DS, AX例 1:将 AX 内容加 1:即 AX+1-AX可以使用指令:ADD AX, 1 ;该
23、指令的寻址方式为立即数寻址,具体操作和指令执行时间见 P444 第 6 栏中的第 6 行:acc, imm即:ADD acc, imm;其中 acc 为累加器 AX,imm 表示立即数,该指令的时钟周期数为 4,字节数为 23。而如果改用:INC AX 指令也可实现 AX+1;但其指令的时钟周期数为 2,字节数仅为 1,见 P447 第 25 栏中第 1 行:reg16( 因 AX 为 16 位,如果使用 INC AL 时为 8 位操作,即为 reg8)。尽管以上 2 条指令的操作功能相同,但指令执行后对状态标志寄存器的影响是不一样的!ADD 指令能影响除控制标志之外的所有的状态标志:CF、P
24、F、AF、ZF 、SF、OF,但 INC 指令不影响 CF 标志!即:若 AL=0FFH 时,执行 INC AL 后 CF 的状态不变!例 2:将 AX 内容清 0可以使用指令:MOV AX, 0 ;该指令的寻址方式为立即数寻址,具体操作和指令执行时间见 P450 第 40 栏中第 6 行:reg, imm,即:MOV reg, imm,由表中可知 该指令的时钟周期数 为 4,字节数为 23。但如果改用:XOR AX, AX 指令,同样也可实现对 AX 清 0 的目的,但其指令的时钟周期数为 3,字节数为 2,见 P455 第 75 栏中的第 1 行:reg,reg,即:XOR reg, re
25、g.第 6 章 微型计算机的程序设计例 3:编一段程序完成符号函数。见 P151 习题 6.5,答案见 P471X DB ? ;定义自变量 DATA1Y DB 0 ;定义函数值存放单元 DATA2MOV AL, X ;取自变量送 AL 以便对其进行判断CMP AL, 0 ;影响所有标志位:ZF、SF、CF 等标志位JNZ PNZ ;X 不为 0 转移MOV AL, 0 ;X=0MOV Y, AL ;将 0 送函数值存放单元中HLTPNZ: JS PS ; 测试符号标志位若 X0MOV Y, AL ;将 1 送函数值存放单元中HLTPS: MOV AL, 0FFH ;X例:SEG DATA1 ;
26、求变量 DATA1 的段基址(2)OFFSET 求偏移地址;格式:OFFSET 例:OFFSET DATA1 ;求变量 DATA1 的偏移地址(3)TYPE求符号名或变量的类型值 ;格式:TYPE ;其变量的类型值见 P159 表 71例如:TYPE DATA1;=1 , TYPE DATA2;=2其中 DATA1、DATA2 的类型定义见上面例 1、例 25、组合运算符:(1)定义符号名为新类型;格式: PTR 例 1:MOV AX,WORD PTR DATA1 ;将 DATA1 重新定义为字类型例 2:MOV AL,BYTE PTR DATA2 ;将 DATA1 重新定义为字节类型7.2常
27、用伪指令 见 P1601、符号定义伪指令 作用:对所用符号进行赋值格式: EQU ;定义后不能重新赋值= ;定义后可以重新赋值2、内存数据(即变量)定义伪指令:即:DB、DW、DD作用:定义内存变量的类型属性变量名 DB 3、段定义伪指令 作用:对段进行命名和定位格式: SEGMENT 定位方式 连接方式 类别名编程时一般使用默认值(即段边界方式)即可。定位方式是指段的起始地址常用的定位方式(见 P162)如下:PAGA:页边 界,即段起始地址的低 8 位为 0PARA:段边界,即段起始地址的低 4 位为 0.该方式为系统默认方式WORD;字边界,即段起始地址的最低位为 0BYTE:任意值4、
28、段寄存器说明伪指令格式:ASSUME 段寄存器名:段定义名 15、过程定义伪指令:格式: PROC NEAR 或 FAR;括号内为过程属性ENDP6、模块开始伪指令: 格式:NAME 模块名作用:对程序模块进行命名,模块名可以自行定义,但不能使用关键字!可以默认,其默认名为列表文件标题的前 6 个字符,若无标题时则默认名为该程序模块的源文件名。7、模块结束伪指令: 格式:END 启动标号或过程名作用:通知汇编程序源文件结束,并给出执行程序的入口地址。启动地址只有在主程序模块才有意义。8、定位伪指令: 格式:ORG 作用:指定数据或程序在内存中的起始偏移地址,从表达式指定的起点开始连续存放直到遇
29、到新的 ORG 指令为止。表达式为无符号数。9、列表伪指令:(1)建立标题: 格式:TITLE 标题作用:为列表文件每页的第 1 行定义大标题(2)建立小标题:格式:SUBTTL 标题作用:为列表文件每页定义小标题,输出在大标题之后。(3)自动排版: 格式:PAGE 行数,每行字数(即列数)作用:为列表文件定义每页行数(10255 行)和每行字符数(60-132),默 认值是 66 行 80 列。伪指令或说明性语句的作用:对变量、工作单元或符号等进行定义或说明,以增加程序的可读性等。例如:已知 16 位发动机转速测量值存放在 2000H 和 2001H(高 8 位)单元中,8位温度测量值存放在
30、 2002H 单元中,试编一个程序将转速测量值送 AX 寄存器中,温度测量值送 DL 寄存器中。程序 1:MOV AX, 2000H ;将转速测量值送 AX 寄存器MOV DL, 2002H ;将温度测量值送 DL 寄存器分析:尽管程序简单,但不知内存单元中存放的是何数据,缺乏可读性!程序 2:DATA SEGMENT ;段定义伪指令ORG 2000H ;对存放数据的偏移地址进行定位伪指令ZS DW 0 ;分配转速存放单元WD DB 0 ;定义温度存放单元DATA ENDSMOV AX, ZS ;将转速测量值送 AX 寄存器MOV DL, WD ;将温度测量值送 DL 寄存器由此可知利用伪指令
31、对工作单元或变量进行了定义后,使得程序具有了可读性!7.3 宏指令7.3.1 宏指令概述:为简化汇编语言程序的书写,将程序中重复出现的内容或代码定义为“宏指令”(即用一条宏指令代替),在其原位置处只需放一条宏调用语句即可,于是可大大简化源程序的书写,提高源程序的可读性。宏指令类似于子程序或过程,但二者有明显的区别:1、执行方式不同:宏调用语句属于说明性语句由汇编程序 MASM-86 中的宏处理程序代换进行处理,不会引起 CPU 的任何操作,而子程序调用或过程调用语句是由 CPU 执行。2、对内存空间的占用方式不同:宏指令在执行时是由汇编程序将宏指令出现的地方将其原内容或原程序段换回!只简化书写
32、,不节省内存!而子程序或过程是将重复出现的内容或代码与主程序分开单独存放!其目标代码在内存中只保留一份!既简化书写又节省内存!3、CPU 工作时间开销不同:由于宏指令在汇编时是将该宏指令所代替的原内容换回,因此 CPU 在执行程序时无需额外耗费任何时间,而产生子程序或过程调用时,CPU 必须要进行断点甚至现场的保护和恢复,从而产生额外的时间开销,而降低程序的执行速度。4、对工作参数的要求不同:在进行宏调用时允许改变或修改其工作参数,使得同一条宏指令在各次不同的调用过程中可完成不同的操作,具有较好的灵活性,而子程序或过程一旦被定义,一般不允许修改参数,因此如何子程序或过程在各次调用中只能完成相同
33、的功能。其灵活性不如宏指令!由上归纳可知:一般情况下当程序中重复性的内容或代码较长,且工作参数相对固定时可采用子程序或过程,当程序中重复性的内容较少或代码较短,且希望在各次调用时能够修改工作参数时,宜采用宏调用方式。7.3.2 宏指令的定义和使用方法一、宏指令使用说明:宏指令在使用前必须要先进行定义!其步骤如下:1、宏定义:即对程序中所出现的重复性内容或代码进行定义,并起一个名。2、宏调用:在程序中出现重复性内容或代码位置处用一条宏调用语句进行替换。 (即将其重复性内容或代码位置处通过宏指令名来调用它)3、宏扩展(宏展开):由宏汇编程序在宏调用语句(即宏调用指令)处,将原内容换回。并在展开的指
34、令语句左端加上标识符:+二、宏代换和宏调用语句格式:1、宏代换语句格式:宏名 MACRO 形式参数 1,形式参数 2,;形式参数为可选项宏体 ;即需要进行宏代换的内容或代码ENDM2、宏调用语句格式:宏名 实在参数 1,实在参数 2, ;实在参数必须与形式参数对应P167 例:宏定义 AH MACRO Y,X ;Y、X 分别为形式参数MOV CL, XROAH 为宏名,Y、X 为形式参数MOV CL,XRO或为:RO 其中 R 为和形式参数表中的 Y 所对应的实在参数;5 为和形式参数表中的 X 所对应的实在参数宏展开: + MOV CL, 5+ ROR AL, CL补充:宏指令和子程序应用举
35、例:已知两位 LED数码显示器的 I/O地址分别是:个位为 LED0,十位为 LED1,试编一个程序将 DATA 单元的内容送 LED 进行显示。即该单元的低 4 位送个位 LED0,高 4 位送十位LED1。ORG 1000H ;程序模块定位DATA SEGMENT ;定义数据段LED_TBL DB 3FH,06H,5BH,;建立 09 的 7 段 LED 数码显示器段码表DATA DB 36H ;预置待显数据DATA ENDS ;数据段结束STAC SEGMENT PARA STACKDAT ;定义堆栈段STA1 DW 10 DUP(?)STAC ENDS ;堆栈段结束CODE SEGME
36、NT PARA CODE ;定义代码段ASSUME CS:CODE,DS :DAT,SS:STACSTAR PROC FAR ;过程定义PUSH DS ;保护操作系统当前的数据指针 DS:00( 即现场)以便执行XOR AX, AX ;完用户程序后恢复PUSH AXMOV AX, SEG LED_TBL ;获取并建立用户数据区的段基址MOV DS, AX ;建立用户段MOV AL, DATA ;取出数据送 ALAND AL, 0FH ;分离出低 4 位MOV BX, OFFSET LED_TBL ;获取用户数据区的偏移地址XLAT ;查表将低 4 位数据转换为 LED 七段码 CB LED0
37、;宏调用OUT LED0,AL ;将查表得到的 LED 七段码输出到 LED 外设MOV AL, DATA ;再次取出数据送 ALSHR AL, 1 ;右移 4 位分离出高 4 位SHR AL, 1 ;SHR AL, 1 ;SHR AL, 1 ;MOV BX, OFFSET LED_TBL ;获取用户数据区的偏移地址XLAT ;查表将低 4 位数据转换为 LED 七段码 CB LED1 ;宏调用OUT LED1,AL ;将查表得到的 LED 七段码输出到 LED 外设RETSTAR ENDP ;过程结束CODE ENDS ;代码段结束END STAR ;模块结束;宏定义;即宏代换语句CB MA
38、CRO X ;CB 为宏名,X 为形式参数MOV BX, OFFSET LED_TBL ;获取用户数据区的偏移地址 宏体XLAT ;查表将低 4 位数据转换为 LED 七段码 宏体OUT X, AL ;将查表得到的 LED 七段码输出到 LED 外设 宏体ENDM解法 2:采用宏指令方式ORG 1000HDATA SEGMENT ;定义数据段LED_TBL DB 3FH,06H,5BH,;建立 7 段 LED 数码显示器段码表:0-9DATA DB 36H ;待显数据DATA ENDS ;数据段结束;定位方式,连接方式, 类别名(自定义符)STAC SEGMENT PARA STACKDAT
39、;定义堆栈段STA1 DW 10 DUP(?)STAC ENDS ;堆栈段结束CB MACRO X ;宏定义(即宏代换语句):CB 为宏名,X 为形式参数。MOV BX, OFFSET LED_TBL ;获取用户数据区的偏移地址 宏体XLAT ;查表将低 4 位数据转换为 LED 七段码 宏体OUT X, AL ;将查表得到的 LED 七段码输出到 LED 外设 宏体ENDMCODE SEGMENT PARA CODE ;定义代码段ASSUME CS:CODE,DS :DAT,SS:STAC;STAR PROC FARPUSH DS ;保护操作系统当前的数据指针 DS:00( 即现场)以便执行
40、XOR AX, AX ;完用户程序后恢复PUSH AXMOV AX, SEG LED_TBL ;获取并建立用户数据区的段基址MOV DS, AX ;建立用户段MOV AL, DATA ;取出数据送 ALAND AL, 0FH ;分离出低 4 位CB LED0 ;宏调用指令MOV AL, DATA ;再次取出数据送 ALSHR AL, 1 ;右移 4 位分离出高 4 位SHR AL, 1 ;SHR AL, 1 ;SHR AL, 1 ; 宏展开时即为下面 3 条语句CB LED1 ;宏调用指令 ;+MOV BX,OFFSET LED_TBL;STAR ENDP ;+XLATCODE ENDS ;+
41、OUT LED1,AL ;LED1 为实参END STAR解法 3:采用子程序方式完成上例(可利用 DX 作为入口参数) ;只给出执行语句部分,其它内容略PUSH DS ;保护操作系统当前的数据指针 DS:00(即现场)以便执行XOR AX, AX ;完用户程序后恢复PUSH AXMOV AX, SEG LED_TBL ;获取并建立用户数据区的段基址MOV DS, AX ;建立用户段MOV AL, DATA ;取出数据送 ALAND AL, 0FH ;分离出低 4 位MOV DX, LED0 ;建立子程序的入口参数CALL CB ;调用子程序 MOV AL, DATA ;再次取出数据送 ALS
42、HR AL, 1 ;右移 4 位分离出高 4 位SHR AL, 1 ;SHR AL, 1 ;SHR AL, 1 ;MOV DX, LED1 ;建立子程序的入口参数CALL CB ;调用子程序HLTCB: MOV BX, OFFSET LED_TBL ;获取用户数据区的偏移地址XLAT ;查表将 4 位数据转换为 LED 七段码OUT DX, AL ;将查表得到的 LED 七段码输出到 LED 外设RET汇编语言编程练习:P194 习题 7.1 采用查表方式进行程序设计:见P150: 6.67.1 在数据区中,自 TABLE开始连续存放 06的立方值表,设任给一数 X(0X6),X在 TAB1单
43、元,查表求其立方值,并将结果存入 TAB2单元,在源程序中设置数据段、堆栈段及代码段。ORG 2000H ;程序或模块定位伪指令DAT SEGMENT PARA DAT ;定义数据段TABLE DB 0H,1H,8H,27H,64H,125H,216H ;定义数据区,并为其;分配内存单元,也可将其分为 2 行写TAB1 DB 3 ;定义 X 存放单元TAB2 DB ? ;定义存放结果数据单元,并为其分配内存单元DAT ENDS ;数据段结束STAC SEGMENT PARA STACKDAT ;定义堆栈段STA1 DW 10 DUP(?)STAC ENDS ;堆栈段结束CODE SEGMENT
44、 PARA CODE ;定义代码段ASSUME CS:CODE,DS :DAT,SS:STACSTAR PROC FARPUSH DS ;保护操作系统当前的数据指针 DS:00( 即现场)以便执行XOR AX, AX ;完用户程序后恢复PUSH AXMOV AX, SEG TABLE ;获取数据区的段基址MOV DS, AX ;建立用户段MOV BX, OFFSET TABLE ;获取数据区的偏移地址MOV AL, TAB1XLATMOV TAB2,ALRETSTAR ENDP ;过程结束CODE ENDS ;代码段结束END STAR ;程序模块结束若程序不是过程或子程序形式时,当用户程序执
45、行完后应使用以下指令返回操作系统MOV AH, 4CH ;返回操作系统。或使用 MOV AX,4C00HINT 21HP178 7.6 汇编语言程序设计例 7.1 将内存中自 A1 地址起连续存放的 8 个字节的数据转换成 ASCII 码存于其后,并利用 DOS 功能 2 号调用在屏幕上显示这些数据,每个数据之间用空格分隔。要求:在源程序中设置数据段、堆栈段及代码段。程序见 P179181工作寄存器分配:SI 为源数据指针,DI 为目的数据指针,CX 为循环控制计数器,AX、BX、DX 寄存器为工作单元解法 1 程序见 P1791811:NAME EX1 ;程序模块命名伪指令(见 P163 6
46、),程序名为:EX12:PAGE 50,70 ;列表伪指令(见 P163 9),用来定义每页行数 50,3: ;每行字符数 70,默认值为 66 行 80 列(即字符数)4:DAT SEGMENT PARA DAT ;定义数据段、段边界及类别5: A1 DB 12H,34H,56H,78H,9AH,0BCH,0DEH,0F0H6: B1 = $-A1 ;求符号地址 A1 到当前汇编指针地址 $之间的字节数,;即自 A1 起存放的数据个数。可使该计数值随数据个数变化7: B2 = B12 ;求 2 倍的 B1 做为 ASCII 码数据区的长度8:A2 DB B2 DUP(?) ;定义 ASCII
47、 码数据区,并为其分配内存单元9:DAT ENDS ;数据段结束10:;-11:STAC SEGMENT PARA STACKDAT ;定义堆栈段、段边界及类别12:STA1 DW 100 DUP(?) ;预留出堆栈区工作单元13:STAC ENDS ;堆栈段结束14:;-15:CODE SEGMENT PARA CODE ;定义代码段并对段寄存器进行说明16: ASSUME CS:CODE,DS :DAT,SS:STAC,ES :DAT17:STAR PROC FAR ;定义过程,过程名为:STAR,属性:远过程 FAR18: PUSH DS ;保护操作系统当前的数据指针 DS:00( 即现
48、场)以便执行19: XOR AX, AX ;完用户程序后恢复20: PUSH AX21: MOV AX, SEG DAT ;获取 DAT 的段基址22: MOV DS, AX ;建立用户的数据段基址23: MOV ES, AX ;建立用户的附加段基址24: LEA SI, A1 ;建立偏移地址指针,LEA 指令见 P11825: MOV DI,OFFSET A2 ;也可采用该指令26: MOV CX, B1 ;建立外循环计数器27:G1: MOV BL, 2 ;建立内循环计数器28: MOV AL, SI ;取出一个数据送 AL29: MOV BH, AL ;将原数保护到 BH30: PUSH
49、 CX ;保护 CX31: MOV CL, 4 ;设置循环移位次数32: ROR AL, CL ;AL 向右循环移位 4 位33: POP CX ;恢复 CX34:G2 AND AL, 0FH ;分离出高 4 位35: DAA ;十进制调整。蓝色语句为将分离出的高 4 位转换为 ASCII 码36: ADD AL, 0F0H ;37: ADC AL, 40H ;转换为十六进制数的 ASCII 码38: MOV DI, AL ;存高 4 位39: INC DI ;调整 ASCII 码数据区指针40: MOV AL, BH ;回复原数41: DEC BL ;内循环次数减 1 未完继续42: JNZ G2 ;43: INC SI ;调整原始数据指针44: LOOP G1 ;外循环次数减 1 未完继续45: MOV SI,