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