【文档说明】第4章--MCS51汇编语言程序的设计课件-.ppt,共(80)页,336.523 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44749.html
以下为本文档部分文字说明:
第四章MCS-51汇编语言程序设计4.1汇编语言程序设计概述4.2顺序与循环程序设计4.3子程序的设计4.4分支转移程序设计4.5查表程序设计4.6综合编程举例4.1汇编语言程序设计概述4.1.1概述MCS-51单片机的汇编语言指
令系统,每一条指令就是汇编语言的一条命令语句。由于汇编语言是面向机器硬件的语言,因此使用汇编语言进行程序设计,必须熟悉MCS-51单片机的硬件结构、指令系统、寻址方式等,才能编写出符合要求的程序。汇编语言语
句有两种基本类型:1.指令语句每一条指令在汇编时都产生一个指令代码,也称为机器代码,该机器代码对应着机器的一种操作。2.伪指令语句伪指令语句没有目标代码,它主要是为汇编程序服务的,在汇编过程中起控制作用。标号字段
和操作字码段之间要有冒号“:”相隔;操作码字段和操作数字段间的分界符是空格;双操作数之间用逗号相隔;操作数字段和注释字段之间的分界符用分号“;”相隔。标号字段操作码字段操作数字段注释字段(LABLE)(OPCODE)(OPRAND)(COMMEN
T)MCS-51汇编语言的4分段格式:1.标号字段标号是语句所在地址的标志符号2.操作码字段规定语句执行的操作,不能空缺3.操作数字段存放指令的操作数或操作数地址,可以采用字母和数字的多种表示形式4.注释字段在MCS-51汇编语言中应有
向汇编程序发出的指示信息,告诉它如何完成汇编工作,这一任务是通过使用伪指令来实现的。“伪”体现在汇编时,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入输出、定义数据和符号、条件汇编、分配存储空间等功能。不同汇编语言的伪指令也有所不同,
但一些基本的内容却是相同的。伪指令下面介绍在MCS-51汇编语言程序中常用的伪指令。ORG汇编起始地址命令END汇编语言程序结束伪指令EQU赋值伪指令DB定义字节伪指令DW定义字伪指令BIT位地址符号伪指令DATA定义标号数值伪指令ORG汇编起始地址命令
功能:规定程序的起始地址。如果不用ORG规定,则汇编的得到的目标程序将从0000H开始。通用形式ORGM,M为十或十六进制数.例如:ORG2000HSTART:MOVA,#00H┇注意:在一个源程序中,可以多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由
小到大排列,不能交叉、重叠。END汇编语言程序结束伪指令功能:用在程序末尾,表示程序已经结束。汇编程序对END以后的指令不再汇编。EQU赋值伪指令功能:把操作数段中的地址或数据赋值给标号字段中的标号。格式
:标号(字符名称)EQU数或汇编符号例:AAEQUR1;R1与AA等值DB定义字节伪指令功能:从指定单元开始定义(存储)若干个字节的数值或ASCII码字符。常用于定义数据常数表。格式:操作码操作数DB字节常数或ASC
II字符例:ORG1000HDB76H,73,‘C’,‘B’DB0ACH则(1000H)=76H(1001H)=49H(1002H)=43H(1003H)=42H(1004H)=0ACHDW定义字伪指令功能:从指定单元开始定义(或存储)
若干个字的数据或ASCII码字符。格式:操作码操作数DW字常数或ASCII字符BIT位地址符号伪指令功能:把位地址赋予所规定的字符名称。格式:字符名称操作码操作数BIT位地址例:ABCBITP1.0Q4BITP2.2汇编后,位地址P1.0、P2.2分别赋给变量ABC和Q4。DATA定义标号数值伪指
令功能:给标号段中的标号赋以数值。格式:标号操作码操作数字符名称:DATA表达式例:MN:DATA3000H汇编后MN的值为3000H.DATA与EQU的区别在于:用DATA定义的标识符汇编时作为标号登记在符号表中,所以可以先使用后定义;而EQU
定义的标识符必须先定义后使用,因后者不登记在符号表中。4.1.2汇编语言程序设计步骤使用汇编语言作为程序设计语言的步骤与高级语言编程步骤类似,但略有差异。其程序设计步骤大致可分为以下几步:1.分析课题,确定算法或解题思路。2.画工作流程图(图形的符号规定均同于高级语言流程图)3.分配内存单
元,确定程序与数据区存放地址。4.编写源程序。5.上机调试、修改,最后确定源程序。程序设计时,必须根据实际问题和所使用的计算机的特点来确定算法,然后按照尽可能使程序简短和缩短运行时间两个原则编写程序。4.1.3汇编语言源程序的汇编语言源程序翻译成机器代码(指令代码)的过程称为“汇编”。手工汇编通
过查指令的机器代码表,逐个把助记符指令翻译成机器代码,再进行调试和运行。缺点:繁琐、容易出错。所以只有小程序或受条件限制时才使用。在实际的程序设计中,都是采用机器汇编来自动完成。机器汇编借助于微计算机来代替手工汇编。它实际上是通过执行汇编程序来对源程序进行汇编的。由于使用微型计算机完成了
汇编,而汇编后得到的机器代码却是在单片机上运行,所以这种机器汇编又称为交叉汇编。交叉汇编后,通过微机的串口(或并口)将汇编得到的机器代码送到用户样机(或在线仿真器)再进行程序的调试和运行。有时,在分析现成产品的ROM/EPROM中的程序时,要将二进制数的
机器代码语言程序翻译成汇编语言源程序,该过程称为反汇编。4.2顺序与循环程序设计顺序结构的程序是一种最简单、最基本的程序(也称为简单程序)。它的特点是按程序编写的顺序一次执行,程序流向不变。这类程序是所有复杂程序的基础。在很多实际程序中会遇到需多次重复执行某段程序的情况,可把这段
程序设计为循环结构程序,这样可大大缩短程序。4.2.1顺序程序设计要写出高质量的程序还是需要掌握一定的技巧,需要熟悉指令系统,正确地选择指令,最大限度地优化程序的目的。例1:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元
。〈方法一〉采用把BCD数除以10H的方法,除后相当于把此数右移了4位,这样两个BCD码分别移到A、B的低4位,然后再各自与30H相“或”即变为ASCII码。地址机器码周期数源程序ORG2000H2000H74201MOVA,20H2002H75F010
2MOVB,#10H2005H844DIVAB2006H43F0302ORLB,#30H2009H8522F02MOV22H,B200CH44301ORLA,#30H200EHF5211MOV21H,AE
ND此程序占用字节数为16,执行机器周期数为13。〈方法二〉采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。地址机器码周期数源程序ORG2000H
2000H78221MOVR0,#22H2002H76001MOV@R0,#02004HE5201MOVA,20H2006HD61XCHDA,@R02007H4322301ORL22H,#30H200AHC41SWAPA200BH44301O
RLA,#30H200DHF5211MOV21H,AEND此程序占用字节数为15,执行机器周期为9。例2:设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求它们的和,并送入43H、42H单元
中去。解:由于BCD码是分放在高、低位两个字节中,因而要从低位字节开始相加,且每进行一次加法运算,需要进行一次BCD码调整。ORG2000HCLRCMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ALL:SJMPLLEND4.
2.2循环程序设计循环程序的基本结构:1.循环初态设置循环过程中工作单元的初始值。例如:设置循环次数计数器、地址指针赋初值。2.循环体重复执行的程序段部分称为循环体,完成主要的操作(包括对地址指针的修改)。3.循环控制部分用于控制循环的执行和结束。在循环初态已经给出了循环结束条件,
即循环次数初值。循环程序每执行一次,都检查结束条件。当条件不满足时,修改地址指针和控制变量;当条件满足时,停止循环。若循环程序的循环体中不再包含循环程序,即为单重循环程序。如果在循环体中还包含循环程序,那么这种现象称为循环嵌套。注意:多重循环程序中,只允许外重循
环嵌套内重循环程序,不允许循环互相相交,也不允许从循环程序的外部跳入循环程序的内部。Xi为单字节数,,顺序存放在RAM从50H开始的单元,n放在R2中现在要求它们的和(双字节)并放在R3R4中,则有:MOVR3,#0MOVR4,#0MOVR0
,#50HLOOP:MOVA,R4ADDA,@R0MOVR4,AINCR0CLRAADDCA,R3MOVR3,ADJNZR2,LOOPEND〈思考〉多字节加(减)法是否可用循环程序实现?如何实现?例2:多重循环---软件延时程序(50ms延时)。我们知道
使用12MHz晶振时,1个机器周期为1us,执行1条DJNZ指令的时间就为2us。用双重循环可以写出如下程序段:DEL:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2;125×2=250usDJNZR7,DEL1;0
.25ms×200=50msRET由于没有考虑到除“DJNZR6,DEL2”,指令外的其他指令的时间,如把其它指令的时间计算在内,则延时时间为:(250+1+2)*200+1=50.601ms比较精确的延时,可修改程序如下:DEL:M
OVR7,#200DEL1:MOVR6,#123NOPDEL2:DJNZR6,DEL2;2×123+2=248usDJNZR7,DEL1;(248+2)×200+1=50.001ms注意:用软件实现延时程序,不允许有中断
,否则将严重影响定时的准确性。4.3子程序的设计在实际应用中通常把多次使用的程序段按一定结构编好,存放在内存中,当需要时,程序可以去调用这些独立的程序段。通常将这种可以被调用的程序段称为子程序。调用子程序的程序称为主程序。使用子程序的过程,称为调用子程序。4.3.1子程序结
构与设计注意事项由于子程序的资源需要被所有调用程序共享,所以子程序在功能上具有通用性、在结构上应具有独立性。子程序的末尾有一条子程序返回指令(RET)。子程序的结构与一般程序的主要区别:编写子程序时的注意事项:1.每个子
程序赋一个名字(实际上是一个入口地址的代号)。2.能正确地传递参数。首先要有入口条件,说明进入子程序时它所要处理的数据如何得到。另外,要有出口条件,即处理的结果是如何存放的。3.注意保护现场和恢复现场。保护和恢复现场通常用堆栈
来进行。4.为了使子程序具有一定的通用性,子程序中的操作对象应尽量用地址或寄存器形式,而不采用立即数形式。子程序中如果含有转移指令,应尽量用相对转移指令,以便在内存的哪个区域都能正确执行。4.3.2子程序的调
用与返回调用:ACALLaddr11(2字节,2周期,2K范围)LCALLaddr16(3字节,2周期,64K范围)返回:RET(1字节,2周期)4.3.3子程序嵌套子程序嵌套指,在子程序执行过程中还可以调用另一个子程序。子程序嵌套的次数从理论上说是无限的
,但实际上,由于受堆栈深度的限制,嵌套次数是有限的。子程序嵌套过程(实现多重转子)。从上述过程可以看出,堆栈在子程序调用中是必不可少的,因为断点地址是自动按先进后出的原则存入堆栈区的,从而保证了存入的断点地址能依
次正确地返回。4.4.4子程序设计(参数的不同传递方法)例:编写一个子程序,将片内的一组单元清零。子程序不包含这组单元的起始地址和单元的个数。1.通过寄存器传递参数SUBRT:MOVA,#00HLOOP:MOV@R0,AINCR0DJNZR7,LOOPRETMA
IN:……MOVR0,#30H;MOVR7,#0AH;ACALLSUBRT……2.通过堆栈传递参数假设数据区的起始地址事先存放在70H单元,被清零单元的个数事先存放在71H单元,主程序为:MAIN:…………PUSH70HPUSH71HACALLSUBRTPc:……..SUBRT
:POPDPHPOPDPLPOPR7POPR0SUB1:MOVA,#00HLOOP:MOV@R0,AINCR0DJNZR7,LOOPPUSHDPLPUSHDPHRET例3:通过数据指针传递参数主程序:…………地址:5000H:ACALLPRINT5002H:DB‘THISISANE
XAMPLE’DB0AH,0DH,00HNEXT:…………子程序:PRINT:POPDPHPOPDPLPPP1:MOVA,#00HMOVCA,@A+DPTRINCDPTRJZPPPEND;(A)=0转PPPEND,此时(DPTR)=N
EXT地址PPP2:……;打印程序……SJMPPPP1PPPEND:JMP@A+DPTR;指向NEXT处,取代返回指令。4.4分支转移程序设计分支转移程序的最大特点是程序中含有转移指令,转移指令又分为无条件转移和有条件转移,因此分支程序也可分为无条件分支转移程序和有条件分支转移程序
。我们在这里讲述的重点是有条件分支转移。单分支转移结构结构特点:程序的判别只有两个出口,两者选一。单分支转移的程序设计一般根据运算结果的状态标志,用条件判跳指令来选择并转移。例:求单字节有符号数的二进制补码应该首先判断被转换数的符号,负数进行
转换,正数即为补码。CMPT:JNBACC.7,RETURN;(A)>0,不需转换MOVC,ACC.7;符号位保存CPLAADDA,#1MOVACC.7,CRETURN:RET最简单的分支程序设计,一般采用逐次比较法,
就是把所有不同情况一个一个地进行比较,发现符合就转向对应的处理程序。此法的缺点:程序太长,有N种可能的情况,就需要N个判断和转移。可用多分支程序解决例:求符号函数的值。符号函数的定义Y=1当X>00当X=0-1当X<0X存放在40H单元,Y存放在41H单元开始X=0?0Y结束X>0?1Y-1YN
YYN程序:SIGNFUC:MOVA,40HCJNEA,#00H,NZEARAJMPNEGTNZEAR:JBACC.7,POSIMOVA,#01HAJMPNEGTPOSI:MOVA,#81HNEGT:MOV41H,AEND思考:设5AH单元中有一变量
X,编写计算下述函数式的程序,结果存入5BH单元。Y=X2–1X2+841X<=1010<X<15X>=15X2→R1X>=15?41→Y结束X<=10?X2-1→YX2+8→YNYYN开始ORG0000HMOV
A,5AHMOVB,AMULABMOVR1,AMOVA,5AHCJNEA,#15,L1L0:AJMPL4L1:JNCL0CJNEA,#10,L3L2:MOVA,R1CLRCSUBBA,#1HMOVR0,ASJMPL5L3:
JCL2MOVA,R1ADDA,#08HMOVR0,AAJMPL5L4:MOVR0,#41L5:MOV5BH,R0L:SJMPLEND散转程序散转程序为分支程序的另一种,它是根据某种输入或运算的结果,分别转向各个处理程序。JMP@A+DPTR
使用转移指令表的散转程序使用地址偏移量表的散转程序使用转向地址表的散转程序使用转移指令表的散转程序例:根据R2的内容转向各个处理程序。(R2)=0,转PRG0(R2)=1,转PRG1……(R2)=n,转
PRGnJMP1:MOVDPTR,#TBJ1MOVA,R2ADDA,R2JNCNADD;c=0转移INCDPH;(R2)*2>256NADD:JMP@A+DPTRTBJ1:AJMPPRG0AJMPPRG1……A
JMPPRGn注意:所有的处理程序入口PRG0、PRG1……PRGn和散转表TBJ1都必须与AJMP指令在同一个2K范围内,对于一个2K内放不下所有的处理程序的情况,可把一些较长的处理程序放于其它地方,而在2K外用L
JMP指向这些处理程序。上例修改为:PRG1:LJMPXPRG1PRG2:LJMPXPRG2例:据(R3)转向不同处理程序JMP7:MOVDPTR,#TBJ7MOVA,R3MOVB,#3MULAB;(A)低8位
(B)高8位XCHA,B;(A)高8位(B)低ADDA,DPH;(R2)*3低位在A中MOVDPH,AXCHA,B;(R2)*3高位加到DPH上JMP@A+DPTRTBJ7:LJMPPRG0;3字节LJMPPRG1……LJMPPRGn注意:对散转点超过256个时,即n>
255时,寄存器R2放不下,必须用两个字节存放(R3R2)。并利用对DPTR进行加法运算的方法,直接修改DPTR然后再用指令:JMP@A+DPTR使用地址偏移量表散转点较少,所有操作程序处在同一页时,考虑使用此法。例:按R2的内容转向6个处理程序JMP:MOVA,R2
MOVDPTR,#TBJ3MOVCA,@A+DPTRJMP@A+DPTRTBJ3:DBPRG0-TBJ3DBPRG1-TBJ3……DBPRG5-TBJ3PRG0:处理程序0PRG1:处理程序1……PRG5:
处理程序5R2=0时MOVCA,@A+DPTR中(A)=PRG0-TBJ3(8位);(DPTR)=TBJ3(16位)执行JMP@A+DPTR时(A+DPTR)=PRG0-TBJ3+TBJ3=PRG0。(16位)条件:转移表的大小加上各个程序长度必须小于256
B,而转移表和各处理程序可位于ROM中的任何地方。使用转向地址表转向范围较大时,考虑采用此法.例:根据R2的内容转向各个处理程序,设转向入口为PRG0-PRGn,则散转程序和转移表如下:JMP9:MOVDPTR,#TBL9MOVA,
R2ADDA,R2;(R2)*2(A)JNCNADDINCDPH;(R2)*2>256NADD:MOVR3,AMOVCA,@A+DPTRXCHA,R3;转移地址高8位INCAMOVCA,@A+DPTR
MOVDPL,A;转移地址低8位MOVDPH,R3CLRAJMP@A+DPTRTBL9:DWPRG0DWPRG1……DWPRGn注意:此法可实现64K范围内转移,但散转数n<256。若n>255时,则应用双字节加法运算来修改DPTR。
4.5查表程序设计所谓查表法,就是对一些复杂的函数运算,例如sinx等,事先把其全部可能范围的函数值按一定规律存放在程序存储器。当程序中要用到这些函数时,可以直接按编排好的索引值进行查找。当然,索引值和函数值应该有直接的对应关系。查表法的优点:节省运算步骤,
程序简洁,执行速度提高。查表法的缺点:占用较多的存储单元。随着存储器价格的大幅度下降,这个问题已微不足道,所以查表法的应用越来越广泛。4.5.1查表程序总述为了便于实现查表的功能,MCS-51汇编语言中专门设置了两条查表指令:uMOVCA,@A+DPTR采用DPTR存放数据表格的地址,查表过
程比较简单。查表前,应先把数据表格起始地址存入DPTR,然后把所查表的索引值送入累加器A中,最后使用该条查表指令完成查表。uMOVCA,@A+PC操作过程如下:1.使用传送指令将所查数据的索引值送入累加器A。2.用“ADDA,#data指令对累加器A进行修正。data修正式为
:PC+data=数据表首地址PC是“MOVCA,@A+PC”的下一条指令的地址。因此,data值实际等于查表指令和数据表格之间的字节数。3.采用该条查表指令完成查表。4.5.2查表程序设计举例例1:设有一个循环检测报警装置,需对16路输入进行控制,
每路有一个最大允许值,它为双字节数,控制时需根据测量的路数,找出该路的最大允许值,看输入值是否大于允许值,如大于即报警。路数X(0≤X≤15)放于R2中。Y为最大允许值,放在表格中查表后最大值放于R3R4中。TAB:MOVA,R2ADDA,R2MOVR3,AADDA,#06MOVCA
,@A+PCXCHA,R3;1字节ADDA,#03;2字节MOVCA,@A+PC;1字节MOVR4,A;1字节RET;1字节TAB1:DW1520H,3721H,4264H,7850HDW3483H,3657H,
883H,9943HDW1000H,4051H,6758H,8931HDW4468H,5871H,3284H,7808H这个查表程序具有局限性,表格长度不能超过255B,表格只能存放在MOVCA,@A+PC指令以下的256个单元。如果表格长度超过256B,则需要把表格放在64KB
程序存储器空间的任何地方,则应使用指令“MOVCA,@A+DPTR”且对DPH、DPL进行计算,求出表目的地址。例2:一个温度控制器中,测出电压与温度的非线性关系,需对它进行线性化补偿,测量值为10位二进制数,设测量输
入值放于R2R3中,可用如下程序把它转换成线性温度值,仍存放R2R3中,设R2R3:0000001111110111=03F7HLTB2:MOVDPTR,#TAB2MOVA,R3CLRCRLCAMOVR3,A;(R3
)=EEHXCHA,R2;(R2)=EEH,(A)=03HRLCAXCHR2,AADDA,DPL;EEH+DPLAMOVDPL,A;(R3R2)*2+(DPTR)DPTRMOVA,DPHADDCA,R2MOVDPH,ACLRAMOVCA,@A+DPTRM
OVR2,ACLRAINCDPTRMOVCA,@A+DPTRMOVR3,ARETTAB2:DW……;温度值表由于使用指令MOVCA,@A+DPTR,表TAB2可放在64KB程序存储器的任何位置,此外表格长度可大于256B。4.6综合编程举例代码
转换类程序在计算机内部的运算一般都是用二进制,而在计算机与外设的数据传送中常采用BCD码、ASCII码和其他代码,这就存在一个代码之间转换的问题。在程序设计中常采用算法处理和查表方式。前者是根据待转换的两种代码的某种数学上的运算关系,通过一定的算法进行转换;后者是将两种待转换
的代码对应列表,然后用查表指令进行转换。例1将累加器A中0~FFH范围内的二进制数转换为BCD数。BB:MOVB,#100DIVABMOV@R0,AINCR0MOVA,#10XCHA,BDIVABSW
APAADDA,BMOV@R0,ARET本程序通过两次“DIV”指令分离出百位数和十分数,这样的转换方法避免了循环程序,十分简单。例2把A中的压缩BCD码转换成二进行制数。BIN:MOVR2,AANLA,#0F0HSWAPAMOVB,#10MULABMOVR3,AMOVA,R2ANLA,#0FHA
DDA,R3RET例3ASCII码转换成二进制数。要求:ASCII二进制数,并拼装成一个字节,放到70H单元之中。(60H)=33H(字符“3”的ASCII码值),(61)=43H(字符“C”的ASCI
I码值)。字符0~9对应的ASCII码值30H~39H。字符A~F对应的码值41H~46H。主程序:ATOH:MOVR0,#61HMOVR1,#70HACALLCVERT;结果存放在A中SWAPAMOV@R1,A;存高位DECR0ACALLCVERTXCHDA
,@R1子程序:CVERT:MOVA,@R0CLRCSUBBA,#30HCJNEA,#0AH,NEQAJMPBIG;(A)=OAHNEQ:JCLEND;(A)<OAH,cy=1BIG:SUBBA,#07H;(A)>OAH,cy=0LEND:
RET算术逻辑指令在多字节运算中的应用多字节十进制数(BCD码)加法:被加数和加数分别存放在40H和50H为起始地址的单元,求这两个数的和,并将和存放到起始地址为40H单元中去。R040H,R150H.字节数存放在R2中,将36701985存放在43H~40H,12663459
存放在53H~50H.MAIN:MOVRO,#40HMOVR1,#50HMOVR2,#04HACALLJ1ABCD1……J1ABCD1:CLRCJ1ABCD2:MOVA,@R0ADDCA,@R1DAAMO
V@R0,AINCR0INCR1DJNZR2,J1ABCD2RET采用重复加法的双字节无符号乘法功能(R2R3)*(R6R7)→(R4R5R6R7)入口:R2R3中存放被乘数,R6R7中存放乘数。出口:结果存放在R4R5R6R7中例:编制一多字节乘法子程序。设被乘数
为3个字节(分别存储在符号地址J、K、L单元中)乘数为单字节(存于符号地址M单元中)JKLM*LOMLHIMLHIMK+LOMKHIMJLOMJRES3RES2RES1RES0被乘数乘数部分积乘积MULJKLM:P
USHAPUSHBMOVA,MMOVB,LMULABMOVLOML,AMOVHIML,BMOVA,MMOVB,KMULABMOVLOMK,AMOVHIMK,BMOVA,MMOVB,JMULABMOVLOMJ,AMOVHIMJ,BMOVRES0,LOMLMOVA,HIMKADDA,LOMK
MOVRES1,AMOVA,HIMKADDCA,LOMJMOVRES2,ACLRAADDCA,HIMJMOVRES3,APOPBPOPARET例:从22H单元开始有一无符号数据块,其长度在20H单元,求出数据块中最大值,并存入21H单元。ORG2000HCLRAMO
VR2,20HMOVR1,#22HLP:CLRCSUBBA,@R1JNCNEXTMOVA,@R1SJMPNEXT1NEXT:ADDA,@R1NEXT1:INCR1DJNZR2,LPMOV21H,ALP1:SJMPLP1END思考:如何在该例的基础上改为求最小值?