第四章 汇编语言程序设计 §4-1 程序设计语言 §4-2 汇编语言源程序格式 §4-3 伪指令 §4-4 汇编语言程序设计基础
§4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: §4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: 机器语言、汇编语言和高级语言。 编程时采用哪种语言由程序设计语言的特点和适用场合决定。 机器语言、汇编语言和高级语言比较一览表 返回
§4-1 程序设计语言 74H 02H 24H 05H 80H 计算机程序设计语言是指计算机能够理解和执行的语言。 FEH §4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: 机器语言、汇编语言和高级语言。 编程时采用哪种语言由程序设计语言的特点和适用场合决定。 特点:用机器码书写程序。 缺点:不易被人们识别和读写。难写、难读、难交流 。 优点:计算机可以直接识别和执行。 适用场合:无。 返回
§4-1 程序设计语言 MOV A,#02H ADD A,#05H SJMP $ 计算机程序设计语言是指计算机能够理解和执行的语言。 §4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: 机器语言、汇编语言和高级语言。 编程时采用哪种语言由程序设计语言的特点和适用场合决定。 特点:用符号书写指令(用助记符表示操作码,特殊符号表 示操作数)。 缺点:机器不能直接识别;程序员必须了解机器的结构和指 令系统,不易推广和普及;不能移植,不具备通用性。 优点:易为人们识别、记忆和读写。 适用场合:实时控制系统 。 返回
§4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: §4-1 程序设计语言 计算机程序设计语言是指计算机能够理解和执行的语言。 程序设计语言的种类很多,归纳起来有三种: 机器语言、汇编语言和高级语言。 编程时采用哪种语言由程序设计语言的特点和适用场合决定。 特点:用以英语为基础的语句编程。 缺点:机器不能直接识别;执行时间长。 优点:易于推广和交流;不依赖于机器,具有通用性。 适用场合:科学运算和数据处理 。 返回
机器语言、汇编语言和高级语言比较一览表 返回 名 称 特 点 缺 点 优 点 适用场合 机器语言 用机器码书写指令 名 称 特 点 缺 点 优 点 适用场合 机器语言 用机器码书写指令 不易被人们识别和读写。难写、难读、难交流 计算机可以直接识别和执行 无 汇编语言 用符号书写指令(用助记符表示操作码,特殊符号表示操作数) 机器不能直接识别;程序员必须了解机器的结构和指令系统,不易推广和普及;不能移植,不具备通用性 易为人们识别、记忆和读写 实时控制系统 高级语言 用以英语为基础的语句编程 机器不能直接识别;执行时间长 易于推广和交流;不依赖于机器,具有通用性 科学运算和数据处理 1、高级语言程序转换为机器语言程序的过程称为编译过程,通过编译程序实现。 2、汇编语言源程序转换为机器语言目的程序的过程称为汇编过程,通过手工查表 或汇编程序实现。 3、用汇编程序将汇编语言源程序转换为机器语言时,汇编语言源程序的格式 必须正确,程序员还要了解伪指令。 返回
汇编语言源程序是用汇编语言编写的用户程序。 §4-2 汇编语言源程序格式 汇编语言源程序是用汇编语言编写的用户程序。 汇编语言源程序格式如下: 1、汇编语言源程序由一条一条汇编语句组成。 2、每条汇编语句独占一行,以CR—LF结束。 3、典型的汇编语句由四部分组成: 标号:操作码 操作数;注释 指令系统中的指令 习题 返回
汇编语言源程序是用汇编语言编写的用户程序。 §4-2 汇编语言源程序格式 1、标号是指指令的符号地址。 2、一般情况下可以省略,只用在转移的目的指令前。 3、它必须符合以下规定: ⑴ 由8个或8个以内的字母、数字构成,第一个必须 是字母。 ⑵ 同一程序内,不能有相同的标号。 ⑶ 不能用助记符、寄存器名和特殊符号等作标号。 ⑷ 标号必须以冒号结束。 汇编语言源程序是用汇编语言编写的用户程序。 汇编语言源程序格式如下: 1、汇编语言源程序由一条一条汇编语句组成。 2、每条汇编语句独占一行,以CR—LF结束。 3、典型的汇编语句由四部分组成: 标号:操作码 操作数;注释 返回
汇编语言源程序是用汇编语言编写的用户程序。 §4-2 汇编语言源程序格式 汇编语言源程序是用汇编语言编写的用户程序。 汇编语言源程序格式如下: 1、汇编语言源程序由一条一条汇编语句组成。 2、每条汇编语句独占一行,以CR—LF结束。 3、典型的汇编语句由四部分组成: 标号:操作码 操作数;注释 1、操作码说明语句的功能。 2、它是汇编语句中必不可少的部分。 返回
汇编语言源程序是用汇编语言编写的用户程序。 §4-2 汇编语言源程序格式 1、操作数说明操作的对象。 2、操作数有二种表示方法: 数本身和数所在地方。 3、操作数存在与否由指令决定:1个、2个、3个或没有。 如果有2个或3个,则各个操作数之间用逗号隔开。 汇编语言源程序是用汇编语言编写的用户程序。 汇编语言源程序格式如下: 1、汇编语言源程序由一条一条汇编语句组成。 2、每条汇编语句独占一行,以CR—LF结束。 3、典型的汇编语句由四部分组成: 标号:操作码 操作数;注释 1、内RAM:其地址可以用B、H、D、已定义的符号、含有+、-号的表达式表示。 2、SFR:用特殊功能寄存器名 表示。 3、工作寄存器:用工作寄存器名表示。 4、外RAM:用@dptr表示. 参与运算的数可以用D、B、H、或ASCII码、表达式来表示。 返回
汇编语言源程序是用汇编语言编写的用户程序。 §4-2 汇编语言源程序格式 1、注释用于说明语句的功能,增加程序的可读性。 2、可有可无,如果有,则必须以分号开头,以CR-LF结束,若一行不够,可以另起一行,新行必须以分号开头。 汇编语言源程序是用汇编语言编写的用户程序。 汇编语言源程序格式如下: 1、汇编语言源程序由一条一条汇编语句组成。 2、每条汇编语句独占一行,以CR—LF结束。 3、典型的汇编语句由四部分组成: 标号:操作码 操作数;注释 返回
习题与思考: 1、程序设计语言有几种?分别适用于何种场合? 2、汇编程序与汇编语言源程序的区别? 3、汇编语言程序中为什么要用标号?它代表什么意义?下列字符能否做标号: LOOP 123 ACC P OV ADD1 DEC JNZ 返回
§4-3 伪指令 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 习题 返回
§4-3 伪指令 ORG(汇编起始命令) 功能: 规定下面的目标程序的起始地址。 格式: [标号:] ORG 16位地址。 说明: §4-3 伪指令 ORG(汇编起始命令) 功能: 规定下面的目标程序的起始地址。 格式: [标号:] ORG 16位地址。 说明: 1、括号内是选项,可以没有。 2、一般在一个汇编语言源程序的开始,都用一条ORG伪指令来规定程序存放的起始位置,故称为汇编起始命令。 3、在一个源程序中,可以多次使用ORG指令,以规定不同的程序段的起始位置。所规定的地址应该是从小到大,而且不允许有重叠,即不同的程序段之间不能有重叠。一个源程序若不用ORG指令开始,则从0000H开始存放目标码。 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS ORG 2000H START: MOV A,#64H ………… 返回
§4-3 伪指令 END(汇编结束命令) 功能:汇编到此结束。 格式:[标号:] END 说明: 1、END是汇编语言源程序的结束标志, §4-3 伪指令 END(汇编结束命令) 功能:汇编到此结束。 格式:[标号:] END 说明: 1、END是汇编语言源程序的结束标志, 在END以后所写的指令,汇编程序都不予处理。 2、一个源程序只能有一个END命令。在同时包含有主程序和子程 序的源程序中,也只能有一个END命令。 ORG 2000H START: MOV A,#64H ………… END INC DPTR 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 返回
§4-3 伪指令 EQU(等值命令) 功能:将一个数或者特定的汇编符号 赋予规定的字符名称。 格式:字符名称 EQU 数或汇编符号 说明: 1、注意这里使用的是“字符名称”而不是标号,而且也不用“:”来作分隔符,若加上“:”,反而被汇编程序认为是一种错误。 2、用EQU指令赋值以后的字符名称可以用作数据地址、代码地址、位地址或者直接当作一个立即数使用。因此,给字符名称所赋的值可以是8位数也可以是16位二进制数。 3、使用EQU伪指令时必须先赋值,后使用,而不能先使用,后赋值。 对于有的汇编程序来讲,用EQU伪指令赋值的字符名称不能在表 达式中运算。 例如,不能这样使用:MOV A,A10+1 1、 AA EQU R1 MOV A , AA 2、 Al0 EQU 10H DELY EQU 07EBH MOV A,#A10 LCALL DELY §4-3 伪指令 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 返回
§4-3 伪指令 DATA(数据地址赋值命令) 功能:将数据地址或代码地址赋予 MOV A,TAB 规定的字符名称。 ………… DATA伪指令的功能和EQU有些相似,使用时要注意它们的差别: 1、EQU伪指令定义的符号必须先定义后使用,而DATA伪指令定义的符号可以先使用后定义。 2、用EQU伪指令可以把一个汇编符号赋给一个字符名称,而DATA伪指令则不能。 3、DATA伪指令可将一个表达式的值赋给一个字符名称,所定义的 字符名称也可以出现在表达式中,而用EQU定义的字符,则不能这 样使用。 4、DATA伪指令常在程序中用来定义数据地址。 MOV A,TAB ………… TAB DATA 30H §4-3 伪指令 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 返回
§4-3 伪指令 DB(定义字节指令) 功能:从指定的地址单元开始,定义若干个8位内存单元的内容。 格式: [标号:] DB 8位二进制数表 说明: 1、这个伪指令是在程序存贮器的某一部分存入一组规定好的8位二进制数,或者是将一个数据表格存入程序存贮器。它在汇编以后,将影响程序存贮器的内容。 2、8位二进制数表可以写成二进制、十进制、十六进制或“ASCII码”、表达式。 §4-3 伪指令 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 例1 例2 例3 返回
例1 2000H : DB 45H,73,"5","A" TAB : DB 101B 以上伪指令经汇编以后,将对2000H开始的若干ROM单元赋值: ROM 2000H 45H 2001H 49H 2002H 35H 2003H 41H 2004H 05H 返回
例2 ORG 2000H LOOP EQU 10 TAB: DB 45H,73,“5”,-4,LOOP,LOOP+2 以上伪指令经汇编以后,相关单元的内容如何变化? ROM 2000H 45H 2001H 49H 2002H 35H 2003H FCH 2004H 0AH 2005H 0CH 返回
例3 将0—9的平方表存入1000H开始的ROM单元中 解: ORG 1000H TAB : DB 0,1,4,9, 16 DB 25,36,49,64,81 ROM 1000H 00H 1001H 01H 1002H 04H 1003H 09H 1004H 10H 1005H 19H 1006H 24H 1007H 31H 1008H 40H 1009H 51H 返回
§4-3 伪指令 DW(定义字命令) 功能:从指定地址开始,定义若干个16位数据。 格式: [标号] DW 16位数据表 说明: 1、每个16位数要占R0M的两个单元,在MCS-51系统中,16位二进制数的高8位先存入(低地址字节),低8位后存人(高地址字节)。这和MCS-51指令中的16位数据存放的方式一致。 2、 8位二进制数表可以写成二进制、十进制、十六进制、表达式的形式。 §4-3 伪指令 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS 例 返回
例 ORG 1500H HETAB: DW 7234H,8AH,10 汇编以后:相关单元的内容如何变化? ROM 1500H 72H 1501H 34H 1502H 00H 1503H 8AH 1504H 00H 1505H 0AH 返回
§4-3 伪指令 DS(定义空间命令) 功能:从指定的地址开始,保留若干字节内存空间备用。 格式: [标号] DS 表达式 说明: 1、在汇编以后,将根据表达式的值来决定 从指定地址开始留出多少个字节空间。 2、表达式也可以是一个指定的数值。 §4-3 伪指令 例: ORG 1500H DS 03H DB 30H,8AH 一、伪指令与指令的区别: 伪指令由汇编程序识别,用来对汇编过程进行某种控制,或者对符号、标号赋值。在汇编过程中, 伪指令不产生可执行的目标代码;而指令由CPU执行,在汇编过程中,产生可执行的目标代码,完成对数据的运算与处理。 二、常用的伪指令: ORG END EQU DATA DB DW DS ROM 1500H 1501H 1502H 1503H 30H 1504H 8AH 返回
习题与思考: 返回 1 、写出下面程序段经过汇编后,以2000H单元开始的有关存储单元和标号的值。 ORG 2000H ADR:DS 5 DB 01H,-58,99 ABC EQU 30H DW 4200H ORG 2050H DB ‘ABC’ 、用伪指令将0—9的平方表存入以3000H为首地址的ROM单元中。 3、下列语句汇编后,TAB2的值为( ) ORG 2800H TAB EQU 2200H TAB1 EQU 2300H TAB2 EQU 2400H a) 2400H b) 2802H c) 2804H d) 00H 返回
§4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 按程序的走向可以将程序分成4种结构: 简单程序 分支程序 循环程序 子程序 返回
当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。 返回
根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。 返回
§4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来的图形。 返回
§4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语言程序。 返回
§4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 §4-4 汇编语言程序设计基础 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 二、程序结构 在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。 返回
简单程序 简单程序是指一种无分支的直接程序,即CPU从第一条指令开始依次执行每一条指令,直到最后一条指令。 这种程序虽然比较简单,但也能完成一定的功能,并且往往也是构成复杂程序的基础。 拆字程序 拼字程序 求和程序 返回
拆字程序 32H 08H 31H 30H 09H 89H 分析命题 确定算法 画流程图 编写程序 上机调试 返回 例:将30H单元中存放的一个两位的BCD拆开并存入31H 和32H单元单 元,高字节存入32H单元。 解 : 开始 分析命题 将30H单元的内容送A 分别屏蔽高4位与低4位,再将高4位交换 屏蔽A中内容的低4位 确定算法 将A中高、低4位交换 画流程图 MOV A,30H ANL A,#0F0H SWAP A MOV 32H,A MOV 31H,32H ANL 31H,#0FH SJMP $ 将A中内容存入32H单元 编写程序 屏蔽30H单元内容的高4位 上机调试 将30H单元内容存入31H单元 结束 返回
拼字程序 32H 47H 31H 30H 07H 04H 分析命题 确定算法 画流程图 MOV A,31H SWAP A ANL A,30H 例:将30H和31H单元中存放的2个一字节BCD码组合成一个2位的BCD码存入32H单元,31H单元中的数为低4位。 解 : 开始 将30H单元的高4与低4交换,再与31H单元相或 分析命题 将30H单元的内容送A 将A中高、低4位交换 确定算法 将A中内容与 31H单元内容相或 画流程图 MOV A,31H SWAP A ANL A,30H MOV 32H,A SJMP $ 编写程序 将A中内容存入32H单元 结束 上机调试 返回
求和程序 分析命题 确定算法 画流程图 编写程序 上机调试 返回 例:设2个16位二进制数存于以30H为首址的连续单元中,求二者的和,并将和存于以40H为首址的区域。(低字节在前) 解 : MOV A,30H ADD A,32H MOV 40H,A MOV A,31H ADDC A,33H MOV 41H,A MOV A,#00H ADDC A,#0 MOV 42H,A SJMP $ (30H)+(32H)送40H单元;(31H)+(33H)+Cy送41H单元; Cy+0送42H单元 分析命题 确定算法 开始 画流程图 (30H)+(32H)送40H单元 编写程序 (31H)+(33H)+Cy 送41H单元 上机调试 Cy+0送42H单元 返回 结束
分支程序 分支程序就是条件分支程序,即根据不同的条件,执行不同的程 序段。在编写分支程序时,关键是如何判断分支的条件。 在MCS-51中可以直接用来判断分支条件的指令不是很多,只 有累加器为零(或不为零)、比较条件转移指令CJNE等,但它还 提供位条件转移指令,如JC,JB等。把这些指令结合在一起使用, 就可以完成各种各样的条件判断,如正负判断、溢出判断、大 小判断等。 符号函数 分段函数 比较大小 返回
符号函数 解 : Y= 分析命题 确定算法 N A=0? 画流程图 N A > 0? Y 编写程序 Y 上机调试 返回 例:设变量X存放于VAR单元,函数值Y存放在FUNC单元。试按照下式的要求给Y赋值。 解 : Y= 开始 VAR DATA 30H FUNC DATA 31H MOV A,VAR JZ COMP JNB ACC.7,POSI MOV A,#0FFH SJMP COMP POSI: MOV A,#1 COMP: MOV FUNC,A SJMP $ 将VAR单元 的内容送A 分析命题 确定算法 A=0? N 画流程图 N A > 0? Y 编写程序 Y 将0送 FUNC单元 将1送 FUNC单元 将-1送 FUNC单元 上机调试 结束 返回
分段函数 解 : Y= 分析命题 Y A > 20? 确定算法 N 画流程图 Y A <1 0? 编写程序 N 上机调试 返回 例:设变量X存放于VAR单元,函数值Y存放在FUNC单元。试按照下式的要求给Y赋值。 解 : Y= MOV A,VAR CJNE A,#10,NEXT1 NEXT1: JC NEXT2 MOV R0,#1 CJNE A,#21,NEXT3 NEXT3: JNC NEXT4 MOV R0,#0 SJMP NEXT4 NEXT2: MOV R0,#0FFH NEXT4: MOV FUNC,R0 SJMP $ 开始 将VAR单元的内容送A 分析命题 A > 20? Y 确定算法 N 画流程图 A <1 0? Y 编写程序 N 将0送 FUNC单元 将-1送 FUNC单元 将1送 FUNC单元 上机调试 结束 返回
比较大小 解 : 分析命题 Y 确定算法 N 画流程图 编写程序 上机调试 返回 例:两个无符号数分别存于ONE和TWO单元,试比较它们的大小,将较大者存人MAX单元。若两数相等则任存入一个即可。 解 : 开始 MOV A,ONE CJNE A, TWO,NEXT1 NEXT1: JC NEXT2 MOV MAX,ONE SJMP $ NEXT2: MOV MAX,TWO 将ONE单元的内容送A 分析命题 A ≥ TWO Y 确定算法 N 画流程图 将TWO单 元内容送 MAX单元 将ONE单 元内容送 MAX单元 编写程序 上机调试 结束 返回
循环程序 一、循环程序的应用场合 二、循环程序的组成 三、循环程序举例 数组清0 字符串长度 求最大值 返回
循环程序 方法1:MOV 00H,#0 MOV 01H,#0 ……… MOV 7FH,#0 方法2: MOV R0,#128 CLR A UP:MOV @R0,A DEC R0 CJNE R0,#00H,UP SJMP $ 循环程序 一、循环程序的应用场合 在程序执行时,往往同样的一组操作要重复许多次。当然可以采用简单程序,重复使用同样的指令来完成,但若使用循环程序,重复执行同一条指令许多次来完成重复操作,就可大大减化程序。 例如:要使00H—7FH单元的内容清0。 方法1:用128条赋值指令完成。 方法2:只用一条赋值指令,并使之执行128次,每次执行时操作数亦作相应的变化以完成规定的操作。 符号函数 分段函数 比较大小 返回
循环程序 确定循环开始时的状态,如使得工作单元清0,计数器置初值等 。 一、循环程序的应用场合 二、循环程序的组成 要求重复执行的部分 。 循环程序一般由四部分组成: 置循环初值 循环体 循环修改部分 循环控制部分 每循环一次就要需要修改一次初值,以便在一定情况下,能结束循环。 根据循环结束条件,判断是否结束循环 流 程 图 返回
循环程序 图 1 图 2 返回
数组清0 7FH 00H … 00H 00H 00H 例:使00H---7FH单元清0。 分析命题 开始 给R0赋128、 确定算法 A清0 用MOV @R0,A 做循环主体,修改R0的值,可以将0送入00H—7FH单元中。 分析命题 开始 给R0赋128、 A清0 确定算法 MOV R0,#128 CLR A UP:MOV @R0,A DEC R0 CJNE R0,#00H,UP SJMP $ 画流程图 A送@R0 编写程序 R0减1 N 上机调试 R0=00H? Y 结束 返回 思 考
思考:如下程序能使00H—7FH单元清0吗?为什么? 数组清0 思考:如下程序能使00H—7FH单元清0吗?为什么? MOV R0,#0 MOV R7,#128 CLR A UP:MOV @R0,A INC R0 DJNZ R7,UP SJMP $ 返回
字符串长度 例:内存中以STRING开始的区域有若干个字符和数字,一般称为一个字符串,最末一个字符为"$",试统计这些字符数字的数目,结果存人NUM单元 开始 NUM DATA 2DH STRING DATA 21H CLR A MOV R0,#STRING LOOP: CJNE @R0,#24H,NEXT SJMP COMP NEXT: INC A INC R0 SJMP LOOP COMP: INC A MOV NUM,A SJMP $ 分析命题 给R0赋21H 、A清0 确定算法 @ R0=24H? Y 画流程图 N 编写程序 A加1 R0加1 A加1,并 送2DH单元 上机调试 结束 返回
求最大值 例:从BLOCK单元开始有一个无符号数数据块,其长度存于LEN单元,试求出数据块中最大的数,并存入MAX单元。 开始 分析命题 LEN DATA 20H MAX DATA 21H BLOCK DATA 22H CLR A MOV R2,LEN MOV R1,#BLOCK LOOP: CLR C SUBB A,@R1 JNC NEXT MOV A,@R1 SJMP NEXT1 NEXT: ADD A,@R1 NEXT1:INC R1 DJNZ R2,LOOP MOV MAX,A SJMP $ 开始 分析命题 给R2赋个数,A清0 给R1赋BLOCK 确定算法 A与内RAM内容相减 画流程图 N Cy=0? Y 编写程序 @R1 送A 恢复A 上机调试 R2减1;R1加1 N R2=0? Y A送MAX单元 思 考 返回 结束
求最大值 思考:如果用CJNE指令实现比较,则如何修改程序? MOV R2,LEN MOV R1,#BLOCK MOV MAX,@R1 LOOP: MOV A,@R1 CJNE A,MAX ,NEXT NEXT: JC NEXT1 MOV MAX,A NEXT1:INC R1 DJNZ R2,LOOP SJMP $ 返回
子程序 一、子程序的应用场合 二、子程序的优缺点 三、编制子程序注意事项 四、子程序举例 两个无符号数据块的最大值 带延时功能的移位操作 返回
子程序 例:求两个无符号数据块的最大值。数据块的首地址为BLOCK1和BLOCK2,每个数据块的第一个字节都存放数据块的长度,设长度都不为0,结果存入MAX单元。 主程序: MOV R1,#BLOCK1 ACALL FMAX MOV TEM,A MOV R1,#BLOCK2 ACALL FMAX CJNE A,TEM,NEXT NEXT: JNC NEXTl MOV A,TEM NEXT1: MOV MAX,A SJMP $ TEM DATA 20H 子程序: FMAX: MOV A,@R1 MOV R2,A CLR A LOOP: INC R1 CLR C SUBB A,@R1 JNC NEXT MOV A,@R1 SJMP NEXT1 NEXT: ADD A,@R1 NEXT1: DJNZ R2,LOOP RET 返回
子程序 返回 例:每1秒使A中的内容左移一位。 子程序: 主程序: D1ms : MOV R7,#10 MOV A,#01H UP:RL A ACALL D1ms SJMP UP 子程序: D1ms : MOV R7,#10 D1ms2:MOV R6, #100 D1ms1:MOV R5, #250 DJNZ R5, $ DJNZ R6, D1ms1 DJNZ R7,D1ms2 RET 返回