版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、机械电子工程学院机械电子工程学院第第4章章 汇编语言程序设计汇编语言程序设计4. 1 概概 述述4. 2 简单程序简单程序4. 3 分支程序分支程序4. 4 循环程序循环程序4. 6 子程序的设计及调用子程序的设计及调用 4. 7 程序设计举例程序设计举例4. 5 查表程序查表程序机械电子工程学院机械电子工程学院4.1 概述概述占用的内存单元和占用的内存单元和CPU资源少资源少执行速度快执行速度快有效地利用计算机的有效地利用计算机的专有特性专有特性适合实时控制适合实时控制 可计算程序运行时间可计算程序运行时间MOV P1, A如:如: 输出操作输出操作一、汇编语言和高级语言相比具有下列优点:一
2、、汇编语言和高级语言相比具有下列优点:机械电子工程学院机械电子工程学院二、汇编语言程序设计的步骤:二、汇编语言程序设计的步骤:建立数学模型建立数学模型确定算法确定算法制定流程图制定流程图确定数据结构确定数据结构写出源程序写出源程序上机调试上机调试三、汇编语言程序的结构三、汇编语言程序的结构定义有关字符名定义有关字符名定义程序的起始地址定义程序的起始地址程序主体程序主体汇编结束标志汇编结束标志4.1 概述概述机械电子工程学院机械电子工程学院例例1:内部内部RAM从从DATA1单元开始有一数据块,存放若干单元开始有一数据块,存放若干无符号数,第一单元为数据块长度,求这些无符号数之和。无符号数,第一
3、单元为数据块长度,求这些无符号数之和。;首址送首址送R0 ;长度送长度送R1;检查长度是否为零检查长度是否为零;为零则结束为零则结束;不为零则开始运算不为零则开始运算;加一个数加一个数;长度减长度减1,不为零则转移,不为零则转移;存和存和起始地址起始地址程序主体程序主体汇编结束标志汇编结束标志标号标号注释注释MOV R1, DATA1 CJNE R1, #0 , NEXTORG 2000H START:MOV R0,#DATA1HERE: SJMP $ NEXT: CLR ALOOP: INC R0 ADD A,R0 DJNZ R1, LOOP MOV SUM , A SJMP HEREDAT
4、A1 DATA 20HSUM DATA 1FH END 机械电子工程学院机械电子工程学院四、评价程序质量的标准:四、评价程序质量的标准: 程序的执行时间程序的执行时间 程序所占用的内存字节数目程序所占用的内存字节数目 程序的逻辑性、可读性程序的逻辑性、可读性 程序的兼容性、可扩展性程序的兼容性、可扩展性 程序的可靠性程序的可靠性时时 间间空空 间间概概念念4.1 概述概述机械电子工程学院机械电子工程学院BCD码码09对应的对应的ASCII码为码为30H39H,转换时,将转换时,将20H中的中的BCD码拆开,高四位码拆开,高四位置为置为“0011”即可。即可。4.2 简单程序简单程序简单程序的特
5、点:简单程序的特点:既无分支,又无循环,按照顺序执行。既无分支,又无循环,按照顺序执行。例例2将一个字节内的两个将一个字节内的两个BCD码拆开并变成码拆开并变成ASCII码,码, 存入两个存入两个RAM单元。单元。BCD码放在内部码放在内部RAM的的20H, 转换后高半字节放到转换后高半字节放到21H,低字节放,低字节放22H。 BCDH BCDL00110011RAM21H22H20H方法方法1:BCDHBCDL可完成一定的基本功能,是编写复杂程序的基础。可完成一定的基本功能,是编写复杂程序的基础。ASCII码码机械电子工程学院机械电子工程学院 程序:程序:0011 BCDH0000 000
6、0 MOV R0, #22H MOV R0, #0 MOV A, 20H XCHD A, R0 ORL 22H, #30H SWAP A ORG 1000H ORL A, #30H MOV 21H, A SJMP $ END;R0 22H; 22H 0;两个两个BCD数送数送A;BCDL数送数送22H;完成转换完成转换;BCDH数送数送A的低的低4位位;完成转换完成转换;存数存数BCDH BCDLBCDL00000011BCDH BCDLRAM21H22H20H0000BCDH0011AR0;原地踏步,相当于停机原地踏步,相当于停机4.2 简单程序简单程序机械电子工程学院机械电子工程学院方法方
7、法1小结:小结: 以上程序用了以上程序用了8条指令,条指令,15个内存字节,执行时间为个内存字节,执行时间为9个个机器周期。机器周期。方法方法2:采用除以采用除以10H取余法将两个取余法将两个BCD数拆开。数拆开。BCDH BCDLA0001 00000000 BCDH0000 BCDLBABDIV ABORL , #30H AB4.2 简单程序简单程序机械电子工程学院机械电子工程学院0011 BCDH0011 BCDL 程序:程序: MOV A, 20H MOV B,#10H DIV AB ORL B, #30H MOV 22H, B ORL A, #30H ORG 1000H MOV 21
8、H, A SJMP $ END;取取BCD码至码至A; 完成转换完成转换;存存ASCII码码;完成转换完成转换;存存ASCII码码;除除10H取余,使取余,使BCDH A 、BCDL BBCDH BCDLA0001 00000000 BCDH0000 BCDLBABDIV AB00110011BCDH BCDLRAM21H22H20H4.2 简单程序简单程序机械电子工程学院机械电子工程学院方法方法2小结:小结: 以上程序用了以上程序用了7条指令,条指令, 16个内存字节,个内存字节, 执行时间为执行时间为13个机器周期。个机器周期。双字节求补双字节求补设:两个字节原码数存在设:两个字节原码数存
9、在R1、R0中。中。要求:求补后的结果存到要求:求补后的结果存到R3、R2中。中。例例3:方法:方法:求补采用求补采用“模模 - 原码原码”的方法,的方法,即用即用“0”去减去减“原码原码”。R0R1原码原码-)R2R300H00H4.2 简单程序简单程序机械电子工程学院机械电子工程学院程序:程序: CLR C CLR A SUBB A, R0 MOV R2, A CLR A SUBB A, R1 ORG 1000H MOV R3 , A SJMP $ END ;CY 0; A 0;低字节求补低字节求补;送送R2;A清零清零;高字节求补高字节求补;送送R34.2 简单程序简单程序R0R1原码原
10、码-)R2R300H00H机械电子工程学院机械电子工程学院 将内部将内部RAM的的20H单元中的单元中的8位无符号二进制数,位无符号二进制数,转换为转换为3位位BCD码,并将结果存放在码,并将结果存放在FIRST(百位)和(百位)和SECOND(十位、个位)两个单元中。(十位、个位)两个单元中。例例4:解:解: 可将被转换数除以可将被转换数除以100,得百位数;余数除以,得百位数;余数除以10得十位数;最后余数即为个位数。得十位数;最后余数即为个位数。例例如如:255(十进制)除以(十进制)除以100,得,得 2(百位数);(百位数); 余数除以余数除以10,得,得5(十位数);(十位数);
11、最后余数最后余数5即为个位数。即为个位数。4.2 简单程序简单程序机械电子工程学院机械电子工程学院 5 5 H 程序(设程序(设(20H)=0FFH):): ;取数取数; 除数除数 B; 除以除以100;百位百位BCD;除以除以10;除数除数10 B;十位数送高位十位数送高位;A为十位、个位为十位、个位BCDMOV A, 20HMOV B, #64HDIV AB MOV FIRST, A MOV B, #0AH DIV ABORG 1000H SWAP A ORL A, BMOV SECOND, ASJMP $FIRST DATA 21HSECOND DATA 22HEND;存十位、个位数存十
12、位、个位数A0FFHB 6 4H 0 2H 3 7H 0 AH 3 7HMOV A, B 0 5H 0 5H 5 0H 5 5H0 FFHRAM21H22H20H 0 2 HFIRSTSECOND机械电子工程学院机械电子工程学院4.3 分支程序分支程序简单分支:简单分支:测试标志位,判断程序设置的条件。测试标志位,判断程序设置的条件。解:解:这是一个简单分支程序,可以使两数相减,若这是一个简单分支程序,可以使两数相减,若CY=1,则被减数小于减数。用则被减数小于减数。用JC指令进行判断。指令进行判断。N路分支:路分支:利用散转指令利用散转指令JMP A+DPTR可转向任一处理程序。可转向任一处
13、理程序。例例5 设内部设内部RAM 30H、31H存放两个无符号数,试比较存放两个无符号数,试比较 两数的大小,较小的数存入两数的大小,较小的数存入30H单元,较大的数单元,较大的数 存入存入31H单元。单元。多重分支:多重分支:判断判断2个以上的条件,被称为复合条件。个以上的条件,被称为复合条件。根据程序运行情况,可以有根据程序运行情况,可以有N种选择。种选择。简单分支程序举例简单分支程序举例机械电子工程学院机械电子工程学院 程序:程序: CLR C MOV A, 30H SUBB A, 31H JC NEXT MOV A, 30H XCH A, 31HORG 1000H MOV 30H,
14、A NEXT :NOPSJMP $END;CY 0;做减法比较两数做减法比较两数;若(若(30H)小,)小,则转移则转移;交换两数交换两数(30H)-(31H)CY=1?交换两数交换两数ENDSTART Y N流程图:流程图:CY=1则转移则转移若若CY1则则顺序执行顺序执行4.3 分支程序分支程序机械电子工程学院机械电子工程学院例例6:空调机制冷时,若排出的空气温度比吸入的空气温度空调机制冷时,若排出的空气温度比吸入的空气温度低低8,则认为工作正常(标志为,则认为工作正常(标志为00H),否则便认为是故障,),否则便认为是故障,并设置故障标志(并设置故障标志(0FFH)。)。解:解:为了可靠
15、地监测空调机的工作情况,做两次减法:为了可靠地监测空调机的工作情况,做两次减法:第一次(第一次(40H)-(41H),若),若CY=1 ,则表明有故障;,则表明有故障;第二次两个温度的差值减去第二次两个温度的差值减去8 ,若,若CY=1 ,则表明,则表明有故障。有故障。首先定义一些工作单元首先定义一些工作单元内部内部RAM40H41H42H进气温度值进气温度值排气温度值排气温度值故障标志故障标志低低高高制热制热?制冷能力不足制冷能力不足?4.3 分支程序分支程序机械电子工程学院机械电子工程学院A(40H)-(41H)CY=1?(A)-8ENDSTART Y NCY=1?42HFFH42H0 Y
16、 N流程图:流程图:故故 障障正常正常进气进气 排气排气故故 障障4.3 分支程序分支程序40H41H42H进气温度值进气温度值排气温度值排气温度值故障标志故障标志机械电子工程学院机械电子工程学院 ORG 1000HSTART:MOV A, 40HCLR CSUBB A, 41HJC ERRORMOV 42H, #0JC ERRORSUBB A, #8SJMP EXITERROR:MOV 42H, #0FFHEXIT: SJMP $END程序:程序:;进气温度值送;进气温度值送A; 0 CY; A(40H)-(41H);CY=1,则故障,则故障;是则故障是则故障;温度小于温度小于8?;工作正常
17、标志工作正常标志;转出口转出口;设置故障标志设置故障标志若若CY1顺顺序执行序执行CY=1转转移移CY=1转转移移若若CY1顺顺序执行序执行;停机;停机4.3 分支程序分支程序40H41H42H进气温度值进气温度值排气温度值排气温度值故障标志故障标志机械电子工程学院机械电子工程学院多重分支程序举例多重分支程序举例例例7:设:设30H单元存放的是一元二次方程单元存放的是一元二次方程ax2+bx+c = 0 根的判别式根的判别式= b2 4ac的值。的值。试根据试根据30H单元的值,编写程序,判断方程根的三种情况。单元的值,编写程序,判断方程根的三种情况。在在31H中存放中存放“0”代表无实根,代
18、表无实根, 存放存放“1”代表有相同的实根,代表有相同的实根, 存放存放“2”代表两个不同的实根。代表两个不同的实根。解:解:为有符号数,有三种情况,即小于零、等于零、大于为有符号数,有三种情况,即小于零、等于零、大于零。零。这是一多重分支程序。这是一多重分支程序。可以用两个条件转移指令来判断,首先判断符号位,用可以用两个条件转移指令来判断,首先判断符号位,用指令指令“JNB ACC.7, rel”判断,判断,若若ACC.7 = 1,则一定为负数,此时,则一定为负数,此时0;若若ACC.7 = 0,则,则0。此时再用指令。此时再用指令JNZ rel 判断。判断。若若0,则,则 0,否则,否则=
19、 0。4.3 分支程序分支程序机械电子工程学院机械电子工程学院流程图:流程图:AAcc.7=1?ENDSTART Y N(A)= 0?31H031H2 Y N31H1 0,则无实根则无实根= 0,则则 1个实根个实根 0,则则2个实根个实根4.3 分支程序分支程序机械电子工程学院机械电子工程学院程序:程序: ORG 1000HSTART:MOV A, 30HJNB ACC.7, YESMOV 31H, #0SJMP FINISHYES: JNZ TOWMOV 31H, #1SJMP FILISHTOW: MOV 31H, #2FINISH:SJMP $END;值送值送A;0 转转YES; 0转
20、转 TOW;有两个不同实根有两个不同实根4.3 分支程序分支程序机械电子工程学院机械电子工程学院4.4 循环程序循环程序循环程序:一些有规可循而又反复处理的问题。循环程序:一些有规可循而又反复处理的问题。利用利用CJNE(比较转移指令)、(比较转移指令)、 DJNZ(减(减1不为不为“0”转移指令)转移指令)等实现。等实现。例例8:在内部在内部RAM 30H4FH 连续连续32个单元中存放了单字节无个单元中存放了单字节无符号数,求符号数,求32个无符号数之和,并存入内部个无符号数之和,并存入内部RAM 51H、50H中。中。解:解:这是重复相加问题,这是重复相加问题,要设置一些工作单元。要设置
21、一些工作单元。 设:设:R0 作加数作加数地址指针地址指针,R7 作作循环次数计数器循环次数计数器,R3 作和数的高字节寄存器。作和数的高字节寄存器。机械电子工程学院机械电子工程学院流程图:流程图:#31R7 #0R3(30H)A #31HR0CY=0?ENDSTART (R7)-1=0? 51H(R3)50H (A) Y N(A)+(R0)A(R0+1)R0(R3)+1R3NYNY(A)+(R0)A(R3)+1R3R0 -加数加数地址指针地址指针R7 -循环次数计数器循环次数计数器R3 -和数的高字节寄存器和数的高字节寄存器机械电子工程学院机械电子工程学院 程序:程序:;R7作循环次数计数器
22、作循环次数计数器;R3作和数高字节寄存器作和数高字节寄存器;取被加数取被加数;R0作加数地址指针作加数地址指针;CY=0,和,和256,则转则转;作加法作加法;CY=1,加到高字节,加到高字节;修改修改R0指针指针;未完,继续加未完,继续加;存和数存和数初始化部分初始化部分循环体部分循环体部分结束部分结束部分 ORG 0200HSTART:MOV R7, #31MOV R3, #0MOV A, 30HMOV R0, #31HLOOP:ADD A, R0JNC NEXTINC R3NEXT :INC R0DJNZ R7, LOOPMOV 51H, R3MOV 50H, ASJMP $END循环执
23、行循环执行直到直到R7=0循环循环控制控制循环程序循环程序的结构的结构循环控制循环控制R0 -加数加数地址指针地址指针R7 -循环次数计数器循环次数计数器R3 -和数的高字节寄存器和数的高字节寄存器机械电子工程学院机械电子工程学院例例9:从外部从外部RAM BLOCK单元开始有一无符号数数据块,单元开始有一无符号数数据块,数据块长度存于数据块长度存于LEN单元,求出其中最大数,并存入单元,求出其中最大数,并存入MAX单元。单元。为了方便进行比较,我们使用:为了方便进行比较,我们使用:CY:判断两数的大小,判断两数的大小,B:比较与交换的寄存器,比较与交换的寄存器,DPTR:外部外部RAM地址指
24、针地址指针。解:解:这是一个基本搜索问题,采用两两比较法。这是一个基本搜索问题,采用两两比较法。取两者较大的数再与下一个数进行比较,取两者较大的数再与下一个数进行比较,若数据块长度若数据块长度LEN=n,则应比较则应比较n-1次,次,最后较大的数就是数据块中的最大数。最后较大的数就是数据块中的最大数。4.4 循环程序循环程序机械电子工程学院机械电子工程学院流程图:流程图:DPTR#BLOCK LENLEN-1A(DPTR)CY=0?ENDSTART Y NLEN-1=0? MAX最大数最大数 Y NCY0 B(A) (DPTR)+1 A(DPTR) A(A)-(B)若(若(A)(B)则则A(B
25、)+(A)A中中 的数总是较大的数总是较大较大数较大数交换至交换至A恢复恢复较大数至较大数至A初始化初始化工作单元工作单元机械电子工程学院机械电子工程学院程序程序;定义数据块首址定义数据块首址;定义最大数暂存单元定义最大数暂存单元;定义长度计数单元定义长度计数单元FMAX: MOV DPTR, #BLOCKORG 0200HBLOCK DATA 0100HMAX DATA 31HLEN DATA 30HSJMP NEXT1NEXT: ADD A, BNEXT1: DJNZ LEN, LOOPMOV MAX, ASJMP $END DEC LENMOVX A, DPTRLOOP: CLR CMO
26、V B, AINC DPTRMOVX A, DPTRSUBB A, BJNC NEXTMOV A, B;数据块首址送数据块首址送DPTR;长度减长度减1;取数至取数至A;0CY;修改指针修改指针;暂存于暂存于B;取下一数取下一数;大者送大者送A;若(若(A)(B)则恢复)则恢复A;未完继续比较未完继续比较;存最大数存最大数;*若用若用RET指令结尾则指令结尾则 该程序可作子程序调用该程序可作子程序调用;作减法比较作减法比较RET机械电子工程学院机械电子工程学院例例10:从外部从外部RAM BLOCK单元开始有一数据块,单元开始有一数据块, 数据块长度存于数据块长度存于LEN单元,单元,试统计其
27、中试统计其中正数正数、负数负数和和零零的个数的个数,分别存入分别存入PCOUNT、MCOUNT、ZCOUNT单元。单元。解:解:这是一个多重分支的单循环问题。数据块中是带符号数。这是一个多重分支的单循环问题。数据块中是带符号数。先用先用JB ACC.7,rel 指令判断符号位。指令判断符号位。若若ACC.7=1,则该数一定是负数,则该数一定是负数,MCOUNT单元加单元加1;若若ACC.7=0,则该数可能是正数,也可能是零。,则该数可能是正数,也可能是零。用用JNZ rel 判断判断A是否为零。是否为零。若若A0,则一定是正数,则一定是正数,PCOUNT单元加单元加1;若既不为正也不为负,则一
28、定是零,若既不为正也不为负,则一定是零,ZCOUNT单元加单元加1。4.4 循环程序循环程序机械电子工程学院机械电子工程学院流程图:流程图:DPTR#BLOCK PCOUNT0MCOUNT0 ZCOUNT0ACC.7=0?ENDSTART Y N(A)=0? DPTR+1 Y N A(DPTR)ZCOUNT+1MCOUNT+1LEN-1=0?PCOUNT+1 Y N负数负数正数正数零零机械电子工程学院机械电子工程学院程序:程序:ORG 0200HBLOCK DATA 2000HLEN DATA 30HPCOUNT DATA 31HMCOUNT DATA 32HZCOUNT DATA 33H;定
29、义数据块首址定义数据块首址;定义长度计数单元定义长度计数单元;定义正计数单元定义正计数单元;定义负计数单元定义负计数单元;定义零计数单元定义零计数单元4.4 循环程序循环程序机械电子工程学院机械电子工程学院;数据块首址送数据块首址送DPTR;计数单元清零计数单元清零;若若ACC.7=1 转负计数转负计数;取数取数;若(若(A)0,转正计数,转正计数;若(若(A)=0,则零的个数加,则零的个数加1;负计数单元加负计数单元加1;正计数单元加正计数单元加1;修正指针修正指针;未完继续未完继续NEXT: INC DPTR DJNZ LEN,LOOPSJMP $ENDSTART:MOV DPTR, #B
30、LOCK MOV PCOUNT, #0LOOP: MOVX A,DPTRJB ACC.7, MCNTJNZ PCNTINC ZCOUNTAJMP NEXTMCNT: INC MCOUNT MOV MCOUNT, #0 MOV ZCOUNT, #0AJMP NEXTPCNT:INC PCOUNT4.4 循环程序循环程序机械电子工程学院机械电子工程学院4.5 查表程序查表程序对于复杂函数的计算如对于复杂函数的计算如:非线性函数非线性函数对数、指数、三角函数对数、指数、三角函数微分、积分等微分、积分等用汇编编程十分困难,用汇编编程十分困难,甚至无法建立数学模型,甚至无法建立数学模型,用用查表查表的方
31、法简单便捷。的方法简单便捷。MCS-51指令系统中有两条指令具有极强的查表功能。指令系统中有两条指令具有极强的查表功能。(1) MOVC A, A+DPTR作作基址寄存器基址寄存器作作变址寄存器变址寄存器长查表指令长查表指令寻址寻址64KB(2) MOVC A, A + PC作基址寄存器作基址寄存器作变址作变址短查表指令短查表指令页内查表指令页内查表指令指向表格首址指向表格首址指向表格的第指向表格的第 i 项项16位数据指针位数据指针第第i项加项加变址调整值变址调整值不能不能机械电子工程学院机械电子工程学院例例11:一个十六进制数放在一个十六进制数放在HEX单元的低四位单元的低四位, 将其转换
32、成将其转换成ASCII码码 。实现方法:实现方法:解:解:十六进制十六进制 09 的的ASCII码为码为 30H39H, AF 的的ASCII码为码为 41H46H, 2、利用查表指令、利用查表指令 MOVC A, A+DPTRMOVC A, A+PC1、先用伪指令、先用伪指令 DB 或或 DW 把表格的数据存入把表格的数据存入ROMASCII码表格的首址为码表格的首址为ASCTAB4.5 查表程序查表程序机械电子工程学院机械电子工程学院ASCTAB:DB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39H, 41H, 42HDB 43H, 4
33、4H, 45H, 46H END方法方法1: 0 1 2 3 4 5 6 7 8 9 A B C D E F ORG 0200HHEX EQU 30HHEXASC: MOV A, HEXMOV DPTR, #ASCTABMOVC A, A+DPTRMOV HEX, ARETANL A, #0FHDPTR(A)= 333H(A)= 1546H4.5 查表程序查表程序机械电子工程学院机械电子工程学院0200H0202H0204H0207H0208H020AH020BH020CHPCPCPCPCA ALU01HPC31H 查十六进制数查十六进制数“01H”的的ASCII码(码(DPTR做基址)做基址
34、)MOV A, HEXANL A, #0FHMOV DPTR, #ASCTABMOVC A, A+DPTRMOV HEX, ARET30H 46H31HDPTR020BHDPTR4.5 查表程序查表程序机械电子工程学院机械电子工程学院方法方法2: ORG 0200HHEX EQU 30HHEXASC: MOV A, HEXANL A, #00001111BADD A, #3MOVC A, A+PCMOV HEX, ARETASCTAB:DB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39H, 41H, 42HDB 43H, 44H, 45H,
35、 46HEND;变址调整变址调整;2字节字节;1字节字节PCPC#3;变址调整变址调整4.5 查表程序查表程序机械电子工程学院机械电子工程学院HEXASC:MOV A, HEXANL A, #0FHADD A, #3MOVC A, A+PCMOV HEX, ARET30H 46H31H0200H0202H0204H0206H0207H0209H020AH020BHPCPCPCPCA ALU(PC) = 0207H01HPC04H31H 查十六进制数查十六进制数“01H”的的ASCII码(码(PC做基址)。做基址)。4.5 查表程序查表程序机械电子工程学院机械电子工程学院4.6 子程序的设计及调
36、用子程序的设计及调用4.6.1 子程序的概念子程序的概念把能完成某种基本操作,并具有相同操作的程序段,单独编把能完成某种基本操作,并具有相同操作的程序段,单独编成子程序。成子程序。如:函数、如:函数、 运算、代码转换、数据采集、延时等。运算、代码转换、数据采集、延时等。利用调用子程序指令(利用调用子程序指令(ACALL或或LCALL)和从子程序返)和从子程序返回指令回指令RET。使用子程序的优点:使用子程序的优点: 不必重复书写同样的程序,提高编程效率。不必重复书写同样的程序,提高编程效率。 程序的逻辑结构简单,便于阅读。程序的逻辑结构简单,便于阅读。 缩短了源程序和目标程序的长度,节省了存储
37、器空间。缩短了源程序和目标程序的长度,节省了存储器空间。 使程序模块化、通用化、便于交流共享资源。使程序模块化、通用化、便于交流共享资源。 便于按某种功能进行调试。便于按某种功能进行调试。机械电子工程学院机械电子工程学院4.6.2 调用子程序的要点调用子程序的要点1)子程序开头的标号段必须有一个标志,该)子程序开头的标号段必须有一个标志,该标志标志既是子程序既是子程序的的名字,名字,又是其又是其入口地址入口地址,以便主程序调用。,以便主程序调用。在主程序中利用指令在主程序中利用指令ACALL或或LCALL可转入子程序。该可转入子程序。该指令具有保护指令具有保护断点断点的功能。的功能。例如:调用
38、延时子程序例如:调用延时子程序LCALL(ACALL) DELYLCALL addr16; PC addr16,转向子程序,转向子程序;(PC) (PC)+3;SP (SP)+1,(SP) PC70;SP (SP)+1,(SP) PC158;在调用子程序之前,保护在调用子程序之前,保护断点地址断点地址1、子程序的结构、子程序的结构4.6 子程序的设计及调用子程序的设计及调用机械电子工程学院机械电子工程学院2)子程序结尾必须使用一条从子程序返回指令)子程序结尾必须使用一条从子程序返回指令RET, 它具有恢复断点的功能。它具有恢复断点的功能。RET;PC158 (SP) ,(,(SP) (SP)
39、-1;PC70 (SP) ,(,(SP) (SP) -1主程序主程序CALL断点断点子程序子程序RET4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院2、参数传递、参数传递子程序入口条件:子程序入口条件: 在调用一个子程序时,主程序应先把有关参数放到某些在调用一个子程序时,主程序应先把有关参数放到某些约定的位置约定的位置,子程序运行时,可以从约定的位置得到有关参,子程序运行时,可以从约定的位置得到有关参数。数。子程序出口条件:子程序出口条件:子程序结束前,也应把处理结果送到子程序结束前,也应把处理结果送到约定位置约定位置。参数传递的方法:参数传递的方法:1)子程序无
40、须传递参数)子程序无须传递参数 这类子程序中所需要的参数由子程序赋予,不需要主这类子程序中所需要的参数由子程序赋予,不需要主程序给出。程序给出。4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院主程序:主程序:.LCALL DELY.子程序:子程序:不需主程序提供入口参数,从子程序开始到子程序返回,不需主程序提供入口参数,从子程序开始到子程序返回,大约大约为为20ms。例例13:调用延时子程序调用延时子程序DELYDELY: MOV R7, #100DLY0: MOV R6, #98NOPDLY1: DJNZ R6, DLY1DJNZ R7, DLY0RET子程序开始
41、的标号子程序开始的标号子程序返回指令子程序返回指令调用子程序调用子程序982=196s1s1s设:主频为设:主频为12MHZ2s(196+2+1+1) 100+3 =20003s = 20.003ms2s1s+3意味着每个机器周期为意味着每个机器周期为1s机械电子工程学院机械电子工程学院2)用)用累加器累加器和和工作寄存器工作寄存器传递参数传递参数入口参数:入口参数:放在累加器放在累加器A和工作寄存器中和工作寄存器中R0 R7中。中。出口参数:出口参数:放在累加器放在累加器A和工作寄存器中和工作寄存器中R0 R7中。中。例例14 双字节求补子程序双字节求补子程序CPLD。解:解:采用采用“变反
42、加变反加1”的方法,十六位数变反加的方法,十六位数变反加1, 不仅低字节要加不仅低字节要加1,高字节要加低字节的进位。,高字节要加低字节的进位。 故采用故采用ADD指令,不采用指令,不采用INC指令。指令。 INC指令不影响指令不影响CY位位。4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院入口参数:(入口参数:(R7R6)=16位数位数出口参数:(出口参数:(R7R6)=求补后的求补后的16位数位数 CPLD: MOV A, R6CPL A ADD A, #1 MOV R6, A MOV A, R7 CPL A ADDC A, #0 MOV R7, A RETCy
43、+ Cy4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院 R0 R0 R03)通过操作数)通过操作数地址地址传递参数传递参数入口参数:(入口参数:(R0)=求补数低字节指针,(求补数低字节指针,(R7)=n-1。出口参数:(出口参数:(R0)=求补后高字节指针。求补后高字节指针。例例15 n字节求补子程序字节求补子程序CPLNCPLN: MOV A, R0CPL AADD A, #1MOV R0, AMOV A, R0CPL AADDC A, #0MOV R0, ARETNEXT: INC R0DJNZ R7, NEXT内部内部RAM字节字节1字节字节2字节字节3字
44、节字节n R0 R04.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院4)通过)通过堆栈堆栈传递参数传递参数例例16:在在HEX单元存放两个十六进制数,将它们分别转换单元存放两个十六进制数,将它们分别转换成成ASCII码并存入码并存入ASC和和ASC+1单元。单元。解:解:由于要进行两次转换,故可调用查表子程序完成。由于要进行两次转换,故可调用查表子程序完成。MAIN:.PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.;转子程序转子程序;压入压入 被转换数被转换数;ASCLAS
45、C;取被转换数取被转换数;准备处理高四位准备处理高四位;压入压入;转子程序转子程序;ASCASC+1主程序主程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底*PC 断点地址断点地址4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院MOVC A, A+PC HASC: DEC SPDEC SPPOP ACCANL A, #0FHADD A, #5PUSH ACCINC SPINC SPRET ASCTAB: DB 0 1 2 7 DB 8 9 A F ;弹出弹出;修改修改SP指向指向HEX;屏蔽高四位屏蔽高四位;变址调整变址调整;查表查表;结果入栈结果入
46、栈(2);修改修改SP指向断点位置指向断点位置(1);子程序子程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底AHEXResultResultSP+1SP+2SP+3PC4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院 HEX SPSPSPSP .PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.MOVC A, A+PCHASC: DEC SPDEC SPPOP ACCANL A, #0FHADD A, #5PUSH ACCINC SPINC SPRETASCT
47、AB: DB 0 1 2 7 DB 8 9 A F60H61H62H63H64H HEX *PCL *PCHPC断点断点SP0000 HEXL ASCAASCSPSPSPSP主程序主程序子程序子程序机械电子工程学院机械电子工程学院3、现场保护、现场保护 现场保护:现场保护:如果子程序使用的寄存器与主程序使用的寄存器如果子程序使用的寄存器与主程序使用的寄存器 有有冲突冲突,在转入子程序前,特别是进行中断服务,在转入子程序前,特别是进行中断服务 子程序时,要进行现场保护。子程序时,要进行现场保护。保护内容:保护内容:主程序使用的内部主程序使用的内部 RAM 内容,各工作寄存器内容,内容,各工作寄存
48、器内容, 累加器累加器 A 和和 DPTR 以及以及 PSW 等寄存器内容。等寄存器内容。保护方式:保护方式:将要保护的单元压入堆栈。将要保护的单元压入堆栈。中断保护时:中断保护时:还可以用还可以用 RS1、RS0 来选择其他来选择其他工作寄存器组工作寄存器组, 以便保护主程序现场。以便保护主程序现场。R0 R74.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院例例17:某子程序的现场保护:某子程序的现场保护BCDCB: PUSH ACCPUSH PSWPUSH DPLPUSH DPH.POP DPHPOP DPLPOP PSWPOP ACCRET压入与弹出应按照压入
49、与弹出应按照“先进后出先进后出”,或,或“后进先出后进先出”的顺的顺序。序。; 保护现场保护现场; 某子程序某子程序; 恢复现场恢复现场;4.6.2 调用子程序的要点调用子程序的要点机械电子工程学院机械电子工程学院4.6.3 子程序的调用及嵌套子程序的调用及嵌套1、子程序的调用、子程序的调用例:例:将内部将内部RAM 41H43H中内容左移中内容左移4位,移出部分位,移出部分 送送40H单元。单元。解:解: 由于多字节移位是程序设计中经常用到的,有一定的由于多字节移位是程序设计中经常用到的,有一定的普遍性。为了程序设计的灵活性,我们编一个普遍性。为了程序设计的灵活性,我们编一个“n字字节节 左
50、移一位左移一位”子程序,反复调用子程序,反复调用4次即为次即为n字节左移字节左移4位。位。功能:功能:n字节左移一位字节左移一位入口:入口:(R0)指向内部)指向内部RAM的原始数低字节地址(最右)。的原始数低字节地址(最右)。(R4)= 字节长度字节长度出口出口:(R0)指向内部)指向内部RAM的结果高字节地址(最左)。的结果高字节地址(最左)。使用使用 LCALL 或或 ACALL 指令指令机械电子工程学院机械电子工程学院主程序:主程序:RLC4: MOV R7, #4NEXT: MOV R0, #43HMOV R4, #03HACALL RLC1DJNZ R7, NEXTMOV A, R
51、0ANL A, #0FHMOV R0, ARET;为进入子程序设置入口条件为进入子程序设置入口条件;R7为左移位数计数器,左移为左移位数计数器,左移4位位;共共3个字节个字节;转子程序转子程序;未完,继续未完,继续;存结果(移出的高四位)存结果(移出的高四位);屏蔽高四位结果屏蔽高四位结果4.6.3 子程序的调用及嵌套子程序的调用及嵌套机械电子工程学院机械电子工程学院 子程序:子程序:RLC1: CLR CLOOP0: MOV A, R0RLC AMOV R0, ADEC R0DJNZ R4, LOOP0MOV A, R0RLC AMOV R0, A RETR0CYA40H41H42H43HA
52、37A30A27A20A17A10A07A00A37 A3000A37A36A36A30R0A26A20A37A16A10A27A06A10A17机械电子工程学院机械电子工程学院2、子程序的嵌套、子程序的嵌套子程序的嵌套:子程序的嵌套: 子程序中可调用其他子程序。子程序中可调用其他子程序。 子程序与主程序的概念是相对的,在一个子程序子程序与主程序的概念是相对的,在一个子程序中又可调用其他子程序,这就是子程序的多重嵌套。中又可调用其他子程序,这就是子程序的多重嵌套。4.6.3 子程序的调用及嵌套子程序的调用及嵌套机械电子工程学院机械电子工程学院多重嵌套的过程多重嵌套的过程SPSP *PC0L *
53、PC0H *PC1L*PC1H5FH60H61H62H63H64H65H*PC2H*PC2L主主程程序序 SUB1 SUB2 SUB3LCALL SUB1继继续续主主程程序序*PC0断点入栈断点入栈LCALL SUB2*PC1断点入栈断点入栈SPSPLCALL SUB3*PC2断点断点入栈入栈SPSPRETSPSP弹出断点弹出断点RET弹出断点弹出断点SPSPRET弹出断点弹出断点SPSP栈栈 底底堆栈的设置十分重要。堆栈的设置十分重要。机械电子工程学院机械电子工程学院4.7 程序设计举例程序设计举例例例18:多字节无符号数减法子程序多字节无符号数减法子程序NSUB。功能:功能:n字节无符号数
54、减法。字节无符号数减法。入口:入口:(R0)=被减数低字节地址指针被减数低字节地址指针 (R1)=减数低字节地址指针减数低字节地址指针(R7)= 字节数字节数n出口出口:(R0)=差数高字节地址指针差数高字节地址指针解:解:若被减数大于减数,则差为正数;若被减数小于减数,若被减数大于减数,则差为正数;若被减数小于减数,则差为补码数(负数),且差数为则差为补码数(负数),且差数为n字节。字节。机械电子工程学院机械电子工程学院流程图:流程图:0CY (R0)-(R1)-CY(R0)RETNSUB(R7)-1=0?修改地址指针修改地址指针(R0)+1R0, (R1)+1R1 NNSUB: CLR CLOOP: MOV A, R0 MOV R0, ASUBB A, R1INC R0INC R1DJNZ R7, LOOPDEC R0;R0的值要调整回来的值要调整回来RET程序:程序:4.7 程序设计举例程序设计举例机械电子工程学院机械电子工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年国庆节后工作部署课件
- 氧化扩散工岗前责任制考核试卷含答案
- 锂冶炼工安全教育模拟考核试卷含答案
- 矿石破碎筛分工岗中安全管理考核试卷含答案
- 理货员工艺控制测试考核试卷含答案
- 2026年秋季高中班主任励志教育常态化开展课件
- 2025年邯郸市大名县三年级数学第二学期期末考试模拟试题(含答案解析)
- 2026事业单位工勤技能-内蒙古-内蒙古印刷工三级(高级工)历年参考题库含答案详解
- 2025年辽阳市弓长岭区数学四下期中达标检测模拟试题含答案
- 2025年中南大学web技术期末试题及答案
- T/CECS 10263-2023负氧离子发生纳米矿物粉
- 一年级劳动教育课程计划
- 放射卫生与安全防护专题培训
- 解剖学基础及人体正常结构教案
- 电镀车间安全培训资料
- HG∕T 4600-2014 化工装置用高温高压套管热电偶
- AQ 1064-2008 煤矿用防爆柴油机无轨胶轮车安全使用规范(正式版)
- 2024年设备监理师之质量投资进度控制题库及答案【各地真题】
- 新闻标题的翻译与技巧课件
- 了解月经周期与女性乳腺健康的关系
- GB/T 7000.201-2023灯具第2-1部分:特殊要求固定式通用灯具
评论
0/150
提交评论