汇编语言程序设计(3)ppt课件_第1页
汇编语言程序设计(3)ppt课件_第2页
汇编语言程序设计(3)ppt课件_第3页
汇编语言程序设计(3)ppt课件_第4页
汇编语言程序设计(3)ppt课件_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4 4章章 汇编言语程序设计汇编言语程序设计4. 1 概概 述述4. 2 简单程序简单程序4. 3 分支程序分支程序4. 4 循环程序循环程序4. 6 子程序的设计及调用子程序的设计及调用 4. 7 程序设计举例程序设计举例4. 5 查表程序查表程序 4.1 概概 述述一、汇编言语和高级言语相比具有以下优点:一、汇编言语和高级言语相比具有以下优点:占用的内存单元和占用的内存单元和CPU资源少资源少执行速度快执行速度快有效的利用计算机的专有特性。有效的利用计算机的专有特性。适宜实时控制适宜实时控制 PC主机 打印机 键盘、显示终端 仿真器 用户系统 RS-232C 通用编程器 图 单片机基本

2、开发环境 二、汇编言语程序设计的步骤:二、汇编言语程序设计的步骤:建立数学模型建立数学模型确定算法确定算法制定流程图制定流程图确定数据构造确定数据构造写出源程序写出源程序上机调试上机调试三、汇编言语程序的构造三、汇编言语程序的构造定义有关变量字符名定义有关变量字符名定义程序的起始地址定义程序的起始地址程序主体程序主体汇编终了标志汇编终了标志开场开场问题定义问题定义软件构造设计软件构造设计建立数学模型建立数学模型画出程序流程图画出程序流程图编写程序编写程序汇汇 编编在线仿真调试在线仿真调试程序错否?程序错否?修正程序修正程序结结 束束 始始固化固化NY图图10-8 10-8 单片机软件研制过程单

3、片机软件研制过程软件义务分析软件义务分析1、软件义务分析和硬件电路设计结合进展、软件义务分析和硬件电路设计结合进展2、软件义务分析:、软件义务分析: 执行软件:执行软件: 监控软件:监控软件:单片机运用系统程序设计是在系统裸机条件下开单片机运用系统程序设计是在系统裸机条件下开发的,而且随运用系统的不同而不同。发的,而且随运用系统的不同而不同。完成各种本质性功能,如丈量、计算、完成各种本质性功能,如丈量、计算、显示、打印、输出控制、通讯等;设计显示、打印、输出控制、通讯等;设计偏重算法效率。进展功能定义、接口定偏重算法效率。进展功能定义、接口定义、数据构造、数据类型等定义义、数据构造、数据类型等

4、定义 。专门用来协调各执行模块和操作者的关专门用来协调各执行模块和操作者的关系。着眼全局,逻辑严密。根据系统功系。着眼全局,逻辑严密。根据系统功能和键盘设置选择监控程序构造。能和键盘设置选择监控程序构造。数据类型和数据构造规划数据类型和数据构造规划数据类型:数据类型:逻辑型逻辑型数值型:数值型: 定点型定点型 浮点型浮点型数据构造:数据存放格式问题。数据构造:数据存放格式问题。大多采用线性构造。大多采用线性构造。资源划分资源划分系统资源主要包括系统资源主要包括ROM、RAM、T/C、中断源等。、中断源等。主要任务是进展主要任务是进展RAM资源的分配。资源的分配。 片外片外RAM:容量大,存放批

5、量大的数据。:容量大,存放批量大的数据。 片内片内RAM:仔细思索。:仔细思索。00H1FH:任务积存器区。主程序用:任务积存器区。主程序用0区,中断、子程序用区,中断、子程序用1区、区、2区、区、3区。区。20H2FH:位寻址区,存放各种软件标:位寻址区,存放各种软件标志、逻辑变量、位输入信息、位输出信息志、逻辑变量、位输入信息、位输出信息副本、形状变量、逻辑运算中间结果等。副本、形状变量、逻辑运算中间结果等。保管保管12个字节备用,剩下作其它用途。个字节备用,剩下作其它用途。30H7FH30HFFH:堆栈空间、数:堆栈空间、数据缓冲区、各种参数、指针、中间结果等。据缓冲区、各种参数、指针、

6、中间结果等。列出列出RAM资资源详细源详细分配清分配清单,作单,作为编程为编程根据。根据。;字节定义区;字节定义区X EQU30HY EQU31HZ EQU32H ;40H4FH,没有运用,没有运用 SIOBUF EQU 50H ;50H5FH, 串行通讯缓冲区串行通讯缓冲区16字节字节 ;0E0H0FFH 32字节堆栈空间字节堆栈空间;位变量、位标志变量定义;位变量、位标志变量定义TIMOUT BIT 00HOVER BIT01HKEYF BIT02H编程及调试编程及调试软件设计方法:软件设计方法:自上而下自上而下自下而上自下而上根本过程:根本过程:用编辑软件编辑源程序、编译软件生成目的代码

7、、程序用编辑软件编辑源程序、编译软件生成目的代码、程序测试、仿真运转、代码固化、样机试用、产品定型测试、仿真运转、代码固化、样机试用、产品定型磨刀不误砍柴功:磨刀不误砍柴功:前期调研细致、软硬件论证充分、目的吃准、数据格式前期调研细致、软硬件论证充分、目的吃准、数据格式定好、模块功能和接口条件落实、操作规范要和用户谈定好、模块功能和接口条件落实、操作规范要和用户谈妥、最后才开场设计程序设计、焊妥、最后才开场设计程序设计、焊PCB板、调试样机。板、调试样机。MCS-51单片机汇编程序普通格式内存变量定义ORG 0000HLJMP MAIN中断向量地址区 ORG 0030HMAIN:MOV SP,

8、#XXH;设置堆栈CPU资源和内部变量初始化外部扩展功能部件初始化监控主程序死循环程序子程序区中断效力子程序区项表区DB XXH,XXH,END例例1:内部:内部RAM从从DATA1单元有一数据块,存放假设干单元有一数据块,存放假设干无符号数,无符号数, 第一单元为数据块长度,求这些无符号数之和。第一单元为数据块长度,求这些无符号数之和。; 首址送首址送R0 ;长度送;长度送R1;检查长度能否为零;检查长度能否为零;为零那么终了;为零那么终了;不为零那么开场运算;不为零那么开场运算;加一个数;加一个数;长度减;长度减1不为零那么转不为零那么转移移;存和;存和起始地址起始地址程序主体程序主体汇编

9、终了标志汇编终了标志标号标号注释注释MOV R1, DATA1 CJNE R1, #0 , NEXTORG 0000H START:MOV R0,#DATA1HERE: SJMP $ NEXT: CLR ALOOP: INC R0 ADD A,R0 DJNE R1, LOOP MOV SUM , A SJMP HEREDATA1 DATA 20HSUM DATA 1FH END 四、评价程序质量的规范:四、评价程序质量的规范: 程序的执行时间程序的执行时间 程序所占用的内存字节数目程序所占用的内存字节数目 程序的逻辑性、可读性程序的逻辑性、可读性 程序的兼容性、可扩展性程序的兼容性、可扩展性

10、程序的可靠性程序的可靠性时时 间间空空 间间概概念念 BCDH BCDL BCDH BCDL0011001100110011ROMROM21H21H22H22H20H20HBCD码码09对应的对应的ASCII码为码为30H39H转换时,将转换时,将20H中的中的BCD码拆开,码拆开,高四位置为高四位置为“0011即可。即可。BCDHBCDHBCDLBCDLASCII码码附录附录1:ASCII码字符表码字符表0011 BCDH0011 BCDH0000 00000000 0000BCDH BCDLBCDH BCDLBCDLBCDL0000000000110011BCDH BCDLBCDH BCD

11、LROMROM21H21H22H22H20H20H00000000 BCDHBCDH00110011AORG 0000HAJMP MAINORG 0030HMAIN:MOV A,20HANL A,#0FHORL A,#30HMOV 22H,AMOV A,20HSWAP AANL A,#0FHORL A,#30HMOV 21H,AHERE:SJMP HEREEND采用除采用除10H取余法将两个取余法将两个BCD数拆开数拆开BCDH BCDLBCDH BCDLA0001 00000001 00000000 BCDH0000 BCDH0000 BCDL0000 BCDLBABDIV ABORL ,

12、#30H AB0011 BCDH0011 BCDH0011 BCDL0011 BCDL MOV A, 20H MOV B,#10H DIV AB ORL B, #30H MOV 22H, B ORL A, #30H ORG 0000H MOV 21H, A SJMP $ END;取取BCD码至码至A; 完成转换完成转换;存存ASCII码码;完成转换完成转换;存存ASCII码码;除除10H取余,使取余,使BCDH A 、BCDL BBCDH BCDLBCDH BCDLA0001 00000001 00000000 BCDH0000 BCDH0000 BCDL0000 BCDLBABDIV AB0

13、011001100110011BCDH BCDLBCDH BCDLROMROM21H21H22H22H20H20H 以上程序用了以上程序用了7条指令,条指令, 16个内存字节,个内存字节, 执行时间为执行时间为13个机器周期。个机器周期。双字节求补双字节求补设:两个字节原码数存在设:两个字节原码数存在R1、R0中中求补后结果,存在求补后结果,存在R3、R2中。中。求补采用求补采用“模模 - 原码的方法原码的方法即用即用“0去减去减“原码原码R0R1原码原码-R2R300H00H存在借位存在借位同样的功能,有不同的编程同样的功能,有不同的编程思绪,出现不同的效果,影思绪,出现不同的效果,影响程序

14、的实时性及存储空间响程序的实时性及存储空间大小。大小。 CLR C CLR A SUBB A, R0 MOV R2, A CLR A SUBB A, R1 ORG 0000H MOV R3 , A SJMP $ END ;CY 0; A 0;低字节求补低字节求补;送送R2;A清零清零;高字节求补高字节求补;送送R31111 11111111 1111R00000 00000000 00001111 11111111 1111R10000 00000000 0000R30000 00010000 0001R2CY 0 00000 00010000 0001 1 10000 00000000 00

15、00 0 00000 00000000 0000A 将内部将内部RAM的的20H单元中的单元中的8位无符号二进制数,转换为位无符号二进制数,转换为3位位BCD码,并将结果存放在码,并将结果存放在BAI百位、百位、SHI十位、十位、GE个位单元中。个位单元中。例例4-4:编程思绪:编程思绪: 可将被转换数除以可将被转换数除以100,得百位数;余数除以,得百位数;余数除以10得十位数;最后余数即为个位数。得十位数;最后余数即为个位数。编程如下:编程如下:例如:例如:255十进制除以十进制除以100,得,得 2百位数百位数 余数除以余数除以10,得,得5十位数十位数 最后余数最后余数5即为个位数即为

16、个位数 BCD EQU 20H BAI EQU 21H SHI EQU 22H GE EQU 23H ORG 0000H AJMP MAIN ORG 0030HMAIN: MOV SP,#60H MOV A,BCD MOV B,#100 DIV AB MOV BAI,A MOV A,B MOV B,#10 DIV AB MOV SHI,A MOV GE,B NOP LJMP $ END ;除;除100,得百位,得百位;余数除;余数除10,得十,得十位、个位位、个位码制转换程序:码制转换程序:HEX ASCII码;码;BIN ASCII码码4.3 分支程序分支程序 当执行完某一条指令时,为完成某

17、些功能,根据某当执行完某一条指令时,为完成某些功能,根据某些条件判别,使程序或顺序执行,或转移到其它指令处些条件判别,使程序或顺序执行,或转移到其它指令处执行,这就是分支程序。执行,这就是分支程序。这是一个简单分支程序,可以使两数相减,假设这是一个简单分支程序,可以使两数相减,假设CY=1,那么被减数小于减数。用那么被减数小于减数。用JC指令进展判别。指令进展判别。程序的流程图如下:程序的流程图如下:;做减法比较两数做减法比较两数CLR C MOV A,30H SUBB A, 31H JC NEXT MOV A,30H XCH A,31HORG 0000H MOV 30H,A NEXT :NO

18、PSJMP $END;CY 0;假设假设30H小,那么转移小,那么转移;交换两数交换两数(30H)-(31H)CY=1?交换两数交换两数ENDSTART Y N流程图:流程图:多重分支程序举例多重分支程序举例试根据试根据30H单元的值,编写程序,判别方程根的三种情况,单元的值,编写程序,判别方程根的三种情况,存入片内存入片内31H内。内。在在31H中存放中存放“0代表无实根,代表无实根, 存放存放“1代表有一样的实根,代表有一样的实根, 存放存放“2代表两个不同的实根。代表两个不同的实根。为有符号数,有三种情况,即小于零,等于零、大于为有符号数,有三种情况,即小于零,等于零、大于零。可以用两个

19、条件转移指令来判别,零。可以用两个条件转移指令来判别, 首先判别符号位,用指令首先判别符号位,用指令JNB ACC.7, rel判别,判别, 假设假设ACC.7 = 1,那么一定为负数;此时,那么一定为负数;此时0 假设假设ACC.7 = 0,那么,那么0。此时再用指令。此时再用指令JNZ rel 判别判别 假设假设0,那么,那么 0,否那么,否那么= 00= 0 0流程图:流程图:AACC.7=0?ENDSTART N YA= 0?31H031H2 Y N31H1 0= 0 0程序:程序: ORG 0000HSTART:MOV A,30HJNB ACC.7,YESMOV 31H,#0SJMP

20、 FINISHYES: JNZ TOWMOV 31H,#1SJMP FINISHTOW: MOV 31H,#2FINISH:SJMP $END;值送;值送A; 0 转转YES; 0转转 TOW;有两个不同实根有两个不同实根4.3.3 N路分支程序路分支程序根据前面程序运转结果,可以有根据前面程序运转结果,可以有N种选择,并转向其种选择,并转向其中任一处程序。中任一处程序。例例4-10 128路分支程序:根据路分支程序:根据R3值转向值转向128个目的地址。个目的地址。编程方法:顺序程序编程方法:顺序程序 MOV A,R3 CJNE A,#00H,FZ1 AJMP FZ00FZ1: CJNE A

21、,#01H,FZ2 AJMP FZ01 FZ2: CJNE A,#02H,FZ3 AJMP FZ02FZ3: . 烦琐,程序太长。烦琐,程序太长。如作如作10000个分支个分支程序程序.运用运用 JMP A+DPTR指令实现:指令实现:JMP128:MOV A,R3CLR CSUBB A,#128JNC ERRORMOV A ,R3MOV B,#3MUL ABMOV DPTR,#PRGTALADD A,DPLMOV DPL,AMOV A,DPHADDC A,BMOV DPH,ACLRAJMP A+DPTRPRGTAL:LJMP ROUT00LJMP ROUT01.LJMP ROUT127;入口

22、条件检查入口条件检查 ;分支跳转分支跳转;LJMP指令占指令占3字节字节例例4-10:128分支程序分支程序JMP256JMP256:MOVA A,R3R3;取;取N N值值MOVMOVDPTRDPTR,#PRGTBL#PRGTBL;DPTRDPTR指向分支地址表首址指向分支地址表首址CLRCLRC C;RLCRLCA A;(A) (A) 2 2JNCJNCLOW128LOW128;是前;是前128128个分支程序,那么个分支程序,那么转移转移INCINCDPHDPH;否基址加;否基址加256256LOW128LOW128:MOVMOVTEMPTEMP,A A;暂存;暂存A AINCINCA

23、A;指向地址低;指向地址低8 8位位MOVCMOVCA A,A+DPTRA+DPTR;查表,读分支地址低;查表,读分支地址低8 8位位PUSHPUSHACCACC;地址低;地址低8 8位入栈位入栈MOVMOVA A,TEMPTEMP;恢复;恢复A A,指向地址高,指向地址高8 8位位MOVCMOVCA A,A+DPTRA+DPTR;查表,读分支地址高;查表,读分支地址高8 8位位PUSHPUSHACCACC;地址高;地址高8 8位入栈位入栈RETRET;分支地址弹入;分支地址弹入PCPC实现转移实现转移PRGTBLPRGTBL:DWDWROUT00ROUT00; 256256个分支程序首地址个

24、分支程序首地址DWDWROUT01ROUT01 ; 占用占用512512个单元个单元例例4-11:256分支程序分支程序分支程序运用场所:分支程序运用场所:1、键盘按键处置程序、键盘按键处置程序 根据所按功能键转到相应的功能子程序根据所按功能键转到相应的功能子程序2、通讯协议处置程序、通讯协议处置程序例:某键盘如下:例:某键盘如下:通通信信编号编号设置设置采样采样时间时间设置设置 + -确确认认 MOV A,B CLRC SUBB A,#3 JC FOUN RETFOUN:MOV A,B RL A ADD A,B MOV DPTR,#KEYF JMP A+DPTRKEYF:LJMP TONGX

25、IN LJMP BIANHAO LJMP CAIYANG;键编号键编号4.4 循环程序循环程序循环程序:一些有规可循而又反复处置的问题循环程序:一些有规可循而又反复处置的问题利用比较转移指令利用比较转移指令CJNE、减、减1不为不为“0转移指令转移指令DJNZ等实现等实现例例4-13:在内部:在内部RAM 30H4FH 延续延续32个单元中存放了个单元中存放了 单字节无符号数,求单字节无符号数,求32个无符号数之和,个无符号数之和, 并存入内部并存入内部RAM 51H,50H中。中。编程编程思绪思绪:这是反复相加问题,要设置一些任务单元这是反复相加问题,要设置一些任务单元 设:设:R0 做加数

26、地址指针,做加数地址指针,R7 做循环次数计数器,做循环次数计数器,R3 做和数的高字节存放器。做和数的高字节存放器。A 做和数的低字节存放器做和数的低字节存放器程序的流程图如下:程序的流程图如下:地址指针地址指针循环次数计数器循环次数计数器 流程图:流程图:31R7 #0R330HA #31HR0CY=0?ENDSTART R7-1=0? 51HR350H (A) Y N(A)+(R0)AR0+1R0R3+1R3NY 程序:程序:;R7作循环次数计数器作循环次数计数器;R3作和数高字节存放器作和数高字节存放器;取被加数取被加数;R0作加数地址指针作加数地址指针;CY=0,和,和256,那么那

27、么转转;作加法作加法;CY=1,加到高字节,加到高字节;修正修正R0指针指针;未完,反复加未完,反复加;存和数存和数初始化部分初始化部分循环体部分循环体部分终了部分终了部分 ORG 0000HSTART:MOV R7,#31MOV R3,#0MOV A,30HMOV R0,#31HLOOP:ADD A, R0JNC NEXTINC R3NEXT :INC R0DJNZ R7,LOOPMOV 51H,R3MOV 50H,ASJMP $END循环执行循环执行直到直到R7=0循环循环控制控制例例4-14:从外部:从外部RAM BLOCK单元开场有一无符号数数据块,单元开场有一无符号数数据块,数据块长

28、度存入数据块长度存入LEN单元,单元,求出其中最大数存入求出其中最大数存入MAX单元。单元。为了方便进展比较,为了方便进展比较,我们运用我们运用CY标志来判别两数的大小,标志来判别两数的大小,运用运用B存放器作比较与交换的存放器,存放器作比较与交换的存放器,运用运用DPTR作外部作外部RAM地址指针。地址指针。解:这是一个根本搜索问题解:这是一个根本搜索问题,采用两两比较法。取两者较采用两两比较法。取两者较 大的数再与下一个数进展比较,假设数据块长度大的数再与下一个数进展比较,假设数据块长度LEN=n那么应比较那么应比较n-1次,最后较大的数就是数据块中的最大数。次,最后较大的数就是数据块中的

29、最大数。程序的流程图如下:程序的流程图如下:流程图:流程图:DPTR#BLOCK LENLEN-1ADPTRCY=0?ENDSTART Y NLEN-1=0? MAX最大数最大数 Y NCY0 BA DPTR+1 ADPTR AA-B假设假设AB那么那么A(B)+(A)A中中 的数较大的数较大较大数较大数交换至交换至A恢复恢复较大数较大数初始化初始化任务单元任务单元编程:编程:;定义数据块首址定义数据块首址;定义最大数暂存单元定义最大数暂存单元;定义长度计数单元定义长度计数单元FMAX: MOV DPTR,#BLOCKORG 0000HBLOCK DATA 0100HMAX DATA 31HL

30、EN DATA 30HSJMP NEXT1NEXT: ADD A, BNEXT1: DJNZ LEN, LOOPMOV MAX, ASJMP $END DEC LENMOVX A,DPTRLOOP: CLR CMOV B, AINC DPTRMOVX A,DPTRSUBB A, BJNC NEXTMOV A, B;数据块首址送数据块首址送DPTR;长度减长度减1;取数至取数至A;0CY;修正指针修正指针;暂存于暂存于B;取下一数取下一数;大者送大者送A;假设假设AB那么恢复那么恢复A;未完继续比较未完继续比较;存最大数存最大数;*假设用假设用RET指令结尾那么指令结尾那么 该程序可作子程序调用

31、该程序可作子程序调用;作减法比较作减法比较RET例例4-15:从外部:从外部RAM BLOCK单元开场有一数据块,单元开场有一数据块, 数据块长度存入数据块长度存入LEN单元,单元,试统计其中正数、负数和零的个数试统计其中正数、负数和零的个数,分别存入分别存入PCOUNT、MCOUNT、ZCOUNT单元。单元。解:这是一个多重分支的单循环问题。数据块中是带符号数解:这是一个多重分支的单循环问题。数据块中是带符号数先用先用JB ACC.7,rel 指令判别符号位。指令判别符号位。程序的流程图如下:程序的流程图如下:假设假设ACC.7=1,那么该数一定是负数,那么该数一定是负数,MCOUNT单元加

32、单元加1;假设假设ACC.7=0,那么该数能够是正数,也能够是零;,那么该数能够是正数,也能够是零;用用JNZ rel 判别判别A能否为零能否为零假设假设A0,那么一定是正数,那么一定是正数,PCOUNT单元加单元加1;假设既不为正也不为负,那么一定是零,假设既不为正也不为负,那么一定是零,ZCOUNT单元单元加加1;流程图:流程图:DPTR#BLOCK PCOUNT0MCOUNT0 ZCOUNT0ACC.7=0?ENDSTART Y N(A)=0? DPTR+1 Y N ADPTRZCOUNT+1MCOUNT+1LEN-1=0?PCOUNT+1 Y N程序:程序:ORG 0200HBLOCK

33、 DATA 2000HLEN DATA 30HPCOUNT DATA 31HMCOUNT DATA 32HZCOUNT DATA 33H;定义数据块首址定义数据块首址;定义长度计数单元定义长度计数单元;定义正计数单元定义正计数单元;定义负计数单元定义负计数单元;定义零计数单元定义零计数单元;数据块首址送数据块首址送DPTR;计数单元清零计数单元清零;假设假设ACC.7=1 转负计转负计数数;取数取数;假设假设A0,转正计数,转正计数;假设假设A=0,那么零的个数,那么零的个数加加1;负计数单元加负计数单元加1;正计数单元加正计数单元加1;修正指针修正指针;未完继续未完继续NEXT: INC D

34、PTR DJNZ LEN,LOOPSJMP $ENDSTART:MOV DPTR,#BLOCK MOV PCOUNT,#0LOOP: MOVX A,DPTRJB ACC.7,MCONJNZ PCONINC ZCOUNTAJMP NEXTMCON: INC MCOUNT MOV MCOUNT,#0 MOV ZCOUNT,#0AJMP NEXTPCON:INC PCOUNT4.5 查表程序查表程序对于复杂参数的计算如对于复杂参数的计算如:非线性参数非线性参数对数、指数、三角函数对数、指数、三角函数微分、积分等微分、积分等用汇编编程非常困难用汇编编程非常困难甚至无法建立数学模型甚至无法建立数学模型用

35、查表的方法简单容易用查表的方法简单容易查表:把事先计算或测得的数据按一定顺序编制查表:把事先计算或测得的数据按一定顺序编制成表格,存放在程序存储器中。查表程序的义务成表格,存放在程序存储器中。查表程序的义务就是根据被测数据,查出最终所需求的结果。就是根据被测数据,查出最终所需求的结果。例例4-20:一个十六进制数放在:一个十六进制数放在HEX单元的低四位,单元的低四位, 将其转换成将其转换成ASCII码码 查表程序:查表程序:编程编程思绪思绪十六进制十六进制 09 的的ASCII码为码为 30H39H, AF 的的ASCII码为码为 41H46H, 查表指令:查表指令: MOVC A,A+DP

36、TRMOVC A,A+PC表格定义:用伪指令表格定义:用伪指令 DB 或或 DW 把表格的数据存把表格的数据存入入ROM来获得数据来获得数据ASCII码表格的首址为码表格的首址为ASCIITAB不延续的不延续的ASCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46H END编程编程1: 0 1 2 3 4 5 6 7 8 9 A B C D E FAJMP $ ORG 0000HHEX EQU 30HHEXASC: MOV A,HEXMOV DPTR,#ASCTABMOVC A,A+DPTRM

37、OV HEX,AANL A,#0FH编程编程2: ORG 0000HHEX EQU 30HHEXASC: MOV A,HEXANL A,#0FHADD A,MOVC A,A+PCMOV HEX,AAJMP $ASCTAB:DB 30H,31H,32H,33HDB 34H,35H,36H,37HDB 38H,39H,41H,42HDB 43H,44H,45H,46HEND;变址调整变址调整;2字节字节;2字节字节PCPC#4;变址调整变址调整4.6 子程序的设计及调用子程序的设计及调用一、子程序的概念一、子程序的概念把能完成某种根本操作并具有一样操作的程序段单独把能完成某种根本操作并具有一样操作

38、的程序段单独 编成子程序。如:函数、编成子程序。如:函数、 运算、代码转换、延运算、代码转换、延时等时等子程序调用子程序调用 ACALL、LCALL子程序前往子程序前往 RET运用运用子程子程序的序的优点优点 不用反复书写同样的程序,提高编程效率不用反复书写同样的程序,提高编程效率 程序的逻辑构造简单,便于阅读程序的逻辑构造简单,便于阅读 缩短了源程序和目的程序的长度,节省了存储器空间缩短了源程序和目的程序的长度,节省了存储器空间 使程序模块化、通用化、便于交流共享资源使程序模块化、通用化、便于交流共享资源 便于按某种功能调试便于按某种功能调试操作操作二、调用子程序的要点二、调用子程序的要点

39、子程序的名字:子程序开头的标号段,也是其入口地址,子程序的名字:子程序开头的标号段,也是其入口地址, 供主程序调用。供主程序调用。例如:调用延时子程序例如:调用延时子程序主程序指令:主程序指令: LCALL DELAY 子程序前往子程序前往: 结尾必需运用一条从子程序前往指结尾必需运用一条从子程序前往指令令RET,它具有恢复断点的功能,它具有恢复断点的功能RETRET; PC15PC158 (SP) ,8 (SP) ,SPSP SPSP -1-1; PC7PC70 (SP) ,0 (SP) ,SPSP SPSP -1-1主程序主程序LCALL断点断点子程序子程序RET1、子程序的构造、子程序的

40、构造子程序:子程序: DELAY:MOV R7,#100DJNZ R7,$RET子程序称号子程序称号2、参数传送、参数传送子程序入口条件:子程序入口条件: 在调用一个子程序时,主程序应先把有关参数放到在调用一个子程序时,主程序应先把有关参数放到某些商定的位置,子程序运转时,可以从商定的位置得某些商定的位置,子程序运转时,可以从商定的位置得到有关参数。到有关参数。子程序出口条件:子程序出口条件:子程序终了前,也应把处置结果送到商定位置子程序终了前,也应把处置结果送到商定位置参数传送的方法:参数传送的方法: 子程序无须传送参数子程序无须传送参数 这类子程序中所需求的参数是子程序赋予,这类子程序中所

41、需求的参数是子程序赋予,不需求主程序给出不需求主程序给出主程序:主程序:.LCALL DELY.子程序:子程序:不需主程序提供入口参数,从子程序开场到子程序前往,不需主程序提供入口参数,从子程序开场到子程序前往,大约为大约为20ms例例4-23 调用延时子程序调用延时子程序DELYDELY: MOV R7, #100DLY0: MOV R6, #98NOPDLY1: DJNZ R6, DLY1DJNZ R7, DLY0RET子程序开场的标号子程序开场的标号子程序前往指令子程序前往指令调用子程序调用子程序982=196s1s1s设:主频为设:主频为12MHZ2s196+2+2 100+3 =20

42、003s = 20.003ms2s1s+3 用累加器和任务存放器传送参数用累加器和任务存放器传送参数入口参数:入口参数:放在累加器放在累加器A和任务存放器中和任务存放器中R0 R7中中出口参数:出口参数:放在累加器放在累加器A和任务存放器中和任务存放器中R0 R7中中例例4-24 双字节求补子程序双字节求补子程序CPLD解:采用解:采用“取反加取反加1的方法,十六位数取反加的方法,十六位数取反加1, 不仅低字节要加不仅低字节要加1,高字节要加低字节的进位。,高字节要加低字节的进位。 故采用故采用ADD指令,不采用指令,不采用INC指令。指令。 INC指令不影响指令不影响CY位位入口参数:入口参

43、数: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+ Cy R0 R0 R0 经过操作数地址传送参数经过操作数地址传送参数入口参数:入口参数:R0=求补数低字节指针求补数低字节指针,R7=n-1出口参数:出口参数:R0=求补后高字节指针求补后高字节指针例例4-25 n字节求补子程序字节求补子程序CPLNCPLN: MOV A,R0CPL AADD A,#1MOV R0,AMOV A,R0CPL AADDC

44、A,#0MOV R0,ARETNEXT: INC R0DJNZ R7, NEXT内部内部RAM字节字节1字节字节2字节字节3字节字节n R0 R0地址 经过堆栈传送参数经过堆栈传送参数例例4-26 在在HEX单元存放两个十六进制数,将它们分别单元存放两个十六进制数,将它们分别 转换成转换成ASCII码并存入码并存入ASC和和ASC+1单元单元解:解: 由于要进展两次转换,故可调用查表子程序完成由于要进展两次转换,故可调用查表子程序完成MAIN:.PUSH HEX LCALL HASCPOP ASCMOV A, HEXSWAP APUSH ACCLCALL HASCPOP ASC+1.;转子转子

45、;压入压入 被转换数被转换数;ASCLASC;取被转换数取被转换数;处置高四位处置高四位;压入压入;转子程序转子程序;ASCASC+1主程序主程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底*PC 断点地址断点地址尽量少用尽量少用MOVC A,A+PC HASC: DEC SPDEC SPPOP ACCANL A,#0FHADD A,#5PUSH ACCINC SPINC SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F;弹出弹出;修正修正SP指向指向HEX;屏蔽高四位屏蔽高四位;变址调整变址调整;查表查表;结果入栈结果入栈;修正修正SP指向断点位置指向断点

46、位置;子程序子程序*PCH*PCL HEXSPSP+1SP+2SP+3栈底栈底AHEXResultResultSP+1SP+2SP+3PC 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 SPRETASCTAB: DB 0 1 2 7 DB 8 9 A F60H61H62H63H64H HEX *PCL *PCHPC断点断点SP000

47、0 HEXL ASCAASCSPSPSPSP主程序主程序子程序子程序3、现场维护、现场维护 现场维护现场维护: 假设子程序运用的存放器与主程序运用的存放器假设子程序运用的存放器与主程序运用的存放器 有冲突,在转入子程序前,特别是进展中断效力有冲突,在转入子程序前,特别是进展中断效力 子程序时,要进展现场维护。子程序时,要进展现场维护。例如:某子程序的现场维护例如:某子程序的现场维护BCDCB: PUSH ACCPUSH PSWPUSH DPLPUSH DPH.POP DPHPOP DPLPOP PSWPOP ACCRET推入与弹出应按照推入与弹出应按照“先进后出,或先进后出,或“后进先出的顺序

48、后进先出的顺序; 维护现场维护现场; 子程序功子程序功能语句能语句; 恢复现场恢复现场;三、子程序的调用及嵌套三、子程序的调用及嵌套1、子程序的调用、子程序的调用2、子程序的嵌套、子程序的嵌套汇编言语子程序,可否本人调用本人?汇编言语子程序,可否本人调用本人?常见常见MCS-51子程序:子程序:1、算术运算子程序、算术运算子程序多字节多字节BCD码加法、减法、求补、移位;双字节码加法、减法、求补、移位;双字节二进制无符号数乘法、平方、除法、开平方;平均值二进制无符号数乘法、平方、除法、开平方;平均值2、代码转换子程序、代码转换子程序单字节单字节HEX数转双字节数转双字节ASCII码、码、ASC

49、II码转码转HEX;单字节单字节HEX数转数转BCD码等码等3、查找、查找单字节单字节HEX无有符号数据块极值;查表;排无有符号数据块极值;查表;排序;序;4.7 程序设计举例程序设计举例R7= 字节数字节数n 减数,那么差为补码数负数,且差数为减数,那么差为补码数负数,且差数为n字节字节流程图:流程图:0CY (R0)-(R1)-CYR0RETNSUBR7-1=0?修正地址指针修正地址指针R0+1R0,R1+1R1 NNSUB: CLR CLOOP: MOV A,R0 MOV R0, ASUBB A, R1INC R0INC R1DJNZ R7, LOOPDEC R0RET程序:程序:R0=

50、 有定义的内部有定义的内部RAM地址地址需求四次,每次的乘积为需求四次,每次的乘积为16位,会产生位,会产生4个部分积,共需个部分积,共需求求8个单元存放,然后再按个单元存放,然后再按“位权相加,和即为所求之位权相加,和即为所求之积。这样所占存储单元太多,应该采用边乘边加的方法。积。这样所占存储单元太多,应该采用边乘边加的方法。用用R3、R2、R1作暂存器或任务单元。作暂存器或任务单元。 R6 b R7 a R4 d R5 c编程思绪与手乘法类似:编程思绪与手乘法类似:被乘数被乘数乘数乘数 R6 b R4 d R7 a R5 c相乘过程相乘过程MULD:MOV A, R6MOV B, R4MU

51、L ABMOV R0, AMOV R3, BMOV A, R7MOV B, R4MUL ABADD A, R3MOV R3, AMOV A, BADDC A, #0MOV R2, AMOV A, R6MOV B, R5MUL ABADD A, R3 程序程序;bd;存积存积70, bdL(R0);adL+bdH;暂存,暂存,adL+bdHR3;ad; adHA;bcL+adL+cy; adH+cyA;bc;暂存,暂存, adH+cyR2;INC R0MOV R0, AMOV R1, #0MOV A,R2ADDC A, BMOV R2, AJNC LASTINC R1LAST: MOV A, R

52、7MOV B, R5MUL ABADD A, R2INC R0MOV R0, AMOV A, BADDC A, R1INC R0MOV R0, ARET;用用R1记录记录cy;bcH+adH+cy;存积存积158, bcL+ adL+bdH(R0+1);暂存,暂存, bcH+adH+cyR2;cy=0, 那么转那么转LAST;R0+1;cy=1,那么那么R1=1; ac; acL+bcH+adH+cy ;(R0+3);R0+2; acH+cy ;存积存积2316, acL+bcH+adH+cy (R0+2);存积存积3124, acH+cy (R0+3)R7= 字节数字节数n 为为0;假设;假

53、设cy=1,那么,那么n+1字节为字节为1BCDADD: CLR CADDL: MOV A, R0ADDC A, R1DA AMOV R0, AINC R0INC R1DJNZ R7, ADDLCLR AMOV ACC.0, CMOV R0, ARET程序:程序:过过 “9 补补 “6CY 为了可靠的监控空调机的任务情况,做两次减法:为了可靠的监控空调机的任务情况,做两次减法:第一次第一次40H-41H,假设,假设CY=1 ,那么一定有缺,那么一定有缺点;点;第二次两个温度的差值减去第二次两个温度的差值减去8 ,假设,假设CY=1 ,那么一,那么一定定有缺点有缺点程序的流程图如下:程序的流程图

54、如下:首先定义一些任务单元首先定义一些任务单元内部内部RAM40H41H42H吸入温度值吸入温度值排出温度值排出温度值缺点标志缺点标志A(40H)-(41H)CY=1?A-8ENDSTART Y NCY=1?42HFFH42H0 Y N流程图:流程图:故故 障障正常正常 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,

55、那么缺,那么缺点点;是那么缺是那么缺点点;温度小于温度小于8?;任务正常标志任务正常标志;转出口转出口;设置缺点标志设置缺点标志假设假设CY1顺序执行顺序执行CY=1转转移移CY=1转转移移假设假设CY1顺序执行顺序执行普通软件的容错设计普通软件的容错设计1、堆栈溢出的预防、堆栈溢出的预防堆栈设置在片内堆栈设置在片内RAM区,片内资源有限,使堆栈区范围有限。区,片内资源有限,使堆栈区范围有限。堆栈溢出,将引起程序堆栈溢出,将引起程序“跑飞,危害极大。跑飞,危害极大。减少系统对堆栈的需求量方法:减少系统对堆栈的需求量方法:1、取消部分子程序、取消部分子程序2、尽量不用堆栈来传送参数和结果、尽量不

56、用堆栈来传送参数和结果3、根据需求减少子程序现场维护量、根据需求减少子程序现场维护量系统对堆栈的极限需求量计算方法:系统对堆栈的极限需求量计算方法: 主程序最大需量主程序最大需量+低级中断最大需量低级中断最大需量+高级中断的最大需量高级中断的最大需量2、形状转移的条件审查、形状转移的条件审查普通情况下,程序自当前形状进入下一形状,往往取普通情况下,程序自当前形状进入下一形状,往往取决于一个特定的条件。对重要条件要进展审查,确保决于一个特定的条件。对重要条件要进展审查,确保平安进入下一个形状。平安进入下一个形状。如:散转程序的入口条件;如:散转程序的入口条件;如:直线切削控制:当前形状为刀架快进

57、,快进量如:直线切削控制:当前形状为刀架快进,快进量完成后进入下一个形状,停顿快进,开场切削。完成后进入下一个形状,停顿快进,开场切削。可靠性设计中,还要思索:如冷却泵运转否?主轴可靠性设计中,还要思索:如冷却泵运转否?主轴电机运转否?等其它条件。电机运转否?等其它条件。益处:防止软件设计错误对条件破坏、干扰的结果益处:防止软件设计错误对条件破坏、干扰的结果对条件的影响等对条件的影响等3、重要模块的平安性措施、重要模块的平安性措施某些重要模块的执行对系统有艰苦影响,假设错误执行某些重要模块的执行对系统有艰苦影响,假设错误执行将引起严重后果。系统遭到干扰后,程序有能够弹飞到将引起严重后果。系统遭

58、到干扰后,程序有能够弹飞到该模块中引起非法执行,降低系统可靠性。该模块中引起非法执行,降低系统可靠性。1、加强模块入口条件审查;、加强模块入口条件审查;2、为执行模块配备、为执行模块配备“密码密码措施:措施:入口入口例行条件检查例行条件检查满足否?满足否?操作预备操作预备前往前往密码检查密码检查符合否?符合否?去除密码去除密码本质性操作本质性操作出错处置出错处置前往前往NYNY4、软件算法的冗错设计、软件算法的冗错设计1、逻辑运算的冗错设计、逻辑运算的冗错设计思绪:画卡诺图、逻辑化简、程序设计、出错处置思绪:画卡诺图、逻辑化简、程序设计、出错处置留意必需作逻辑变量的全覆盖设计留意必需作逻辑变量

59、的全覆盖设计2、数值运算的容错设计、数值运算的容错设计容错功能从两个方面调查:一是对入口条件的要求容错功能从两个方面调查:一是对入口条件的要求能否苛刻;二是出口信息中能否包括出错信息能否苛刻;二是出口信息中能否包括出错信息、入口条件审查、入口条件审查如:双字节除单字节、商存单字节正整数如:双字节除单字节、商存单字节正整数的运算子程序的入口条件?的运算子程序的入口条件?思索:除数能否为思索:除数能否为0?商能否超出一个?商能否超出一个字节的范围?字节的范围?、必需对某些运算的中间结果和最终结果进展检、必需对某些运算的中间结果和最终结果进展检查,并对结果做出处置查,并对结果做出处置如:如:A=23

60、5+5B-6C ,知:,知:B200, C200,A是是1字节的整数。字节的整数。首先做入口条件检查:首先做入口条件检查:B200?C200?能否保证结能否保证结果正确?果正确?5B-6C0?B远大于远大于C,出现,出现A255情况情况B=125, C=0, BC, A=235+25=260)、出错信息的设计和运用、出错信息的设计和运用出错信息要设计的丰富一些,便于人们了解出出错信息要设计的丰富一些,便于人们了解出错的详细情况,以便对症处置。错的详细情况,以便对症处置。、合理安排运算方案,减少舍入误差对最终结果的影响。、合理安排运算方案,减少舍入误差对最终结果的影响。如计算:如计算:9/5*6

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论