版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计第一页,共八十七页,2022年,8月28日
4.1概述一、汇编语言和高级语言相比具有下列优点:①占用的内存单元和CPU资源少②执行速度快③有效的利用计算机的专有特性。④适合实时控制上页下页回目录第二页,共八十七页,2022年,8月28日第三页,共八十七页,2022年,8月28日二、汇编语言程序设计的步骤:①建立数学模型②确定算法③制定流程图④确定数据结构⑤写出源程序⑥上机调试三、汇编语言程序的结构①定义有关变量字符名②定义程序的起始地址③程序主体④汇编结束标志上页下页回目录第四页,共八十七页,2022年,8月28日开始问题定义软件结构设计建立数学模型画出程序流程图编写程序汇编在线仿真调试程序错否?修改程序结束始固化NY图10-8单片机软件研制过程第五页,共八十七页,2022年,8月28日软件任务分析1、软件任务分析和硬件电路设计结合进行2、软件任务分析:
※执行软件:
※监控软件:单片机应用系统程序设计是在系统裸机条件下开发的,而且随应用系统的不同而不同。完成各种实质性功能,如测量、计算、显示、打印、输出控制、通讯等;设计偏重算法效率。进行功能定义、接口定义、数据结构、数据类型等定义。专门用来协调各执行模块和操作者的关系。着眼全局,逻辑严密。根据系统功能和键盘设置选择监控程序结构。第六页,共八十七页,2022年,8月28日数据类型和数据结构规划数据类型:※逻辑型※数值型:☆定点型☆浮点型数据结构:数据存放格式问题。大多采用线性结构。第七页,共八十七页,2022年,8月28日资源划分系统资源主要包括ROM、RAM、T/C、中断源等。主要工作是进行RAM资源的分配。片外RAM:容量大,存放批量大的数据。片内RAM:认真考虑。☆00H~1FH:工作积存器区。主程序用0区,中断、子程序用1区、2区、3区。☆20H~2FH:位寻址区,存放各种软件标志、逻辑变量、位输入信息、位输出信息副本、状态变量、逻辑运算中间结果等。保留1~2个字节备用,剩下作其它用途。☆30H~7FH(30H~FFH):堆栈空间、数据缓冲区、各种参数、指针、中间结果等。列出RAM资源详细分配清单,作为编程依据。第八页,共八十七页,2022年,8月28日;字节定义区X EQU 30HY EQU 31HZ EQU 32H
;40H~4FH,没有使用 SIOBUFEQU50H;50H~5FH,串行通信缓冲区16字节 ;0E0H~0FFH32字节堆栈空间 ;位变量、位标志变量定义TIMOUTBIT 00HOVER BIT 01HKEYFBIT 02H第九页,共八十七页,2022年,8月28日编程及调试软件设计方法:☆自上而下☆自下而上基本过程:用编辑软件编辑源程序、编译软件生成目标代码、程序测试、仿真运行、代码固化、样机试用、产品定型磨刀不误砍柴功:前期调研细致、软硬件论证充分、指标吃准、数据格式定好、模块功能和接口条件落实、操作规范要和用户谈妥、最后才开始设计程序设计、焊PCB板、调试样机。第十页,共八十七页,2022年,8月28日MCS-51单片机汇编程序一般格式内存变量定义ORG0000HLJMPMAIN中断向量地址区
ORG0030HMAIN:MOVSP,#XXH;设置堆栈CPU资源和内部变量初始化外部扩展功能部件初始化监控主程序(死循环程序)子程序区中断服务子程序区项表区(DBXXH,XXH,……END第十一页,共八十七页,2022年,8月28日例1:内部RAM从DATA1单元有一数据块,存放若干无符号数,第一单元为数据块长度,求这些无符号数之和。;首址送R0;长度送R1;检查长度是否为零;为零则结束;不为零则开始运算;加一个数;长度减1不为零则转移;存和起始地址程序主体汇编结束标志标号注释上页下页回目录MOVR1,DATA1
CJNER1,#0,NEXTORG0000H
START:MOVR0,#DATA1HERE:
SJMP$
NEXT:
CLRALOOP:
INCR0
ADDA,@R0
DJNER1,LOOP
MOVSUM,A
SJMPHEREDATA1
DATA20HSUMDATA1FH
END第十二页,共八十七页,2022年,8月28日上页下页回目录四、评价程序质量的标准:①程序的执行时间②程序所占用的内存字节数目③程序的逻辑性、可读性④程序的兼容性、可扩展性⑤程序的可靠性时间空间概念第十三页,共八十七页,2022年,8月28日4.2简单程序简单程序的特点:既无分支,又无循环,按照顺序执行例4-2:将一个字节内的压缩BCD码拆开并变成ASCII码,存入两个RAM单元。BCD码放在内部RAM的20H,转换后高半字节放到21H,低字节放22H。
BCDHBCDL00110011ROM21H22H20H方法1:BCD码0~9对应的ASCII码为30H~39H转换时,将20H中的BCD码拆开,高四位置为“0011”即可。BCDHBCDL上页下页回目录可完成一定的基本功能,是编写复杂程序的基础ASCII码附录1:ASCII码字符表第十四页,共八十七页,2022年,8月28日程序:0011BCDH00000000BCDHBCDLBCDL00000011BCDHBCDLROM21H22H20H0000BCDH0011A上页下页回目录ORG 0000HAJMP MAINORG 0030HMAIN:MOVA,20H ANLA,#0FH ORL A,#30H MOV 22H,A MOV A,20H SWAP A ANL A,#0FH ORLA,#30H MOV 21H,AHERE:SJMPHERE END第十五页,共八十七页,2022年,8月28日方法2:采用除10H取余法将两个BCD数拆开BCDHBCDLA000100000000BCDH0000BCDLBABDIVAB上页下页回目录ORL,#30HAB第十六页,共八十七页,2022年,8月28日0011BCDH0011BCDL
程序:
MOVA,20H
MOVB,#10H
DIVAB
ORLB,#30H
MOV22H,B
ORLA,#30H
ORG0000H
MOV21H,A
SJMP$
END;取BCD码至A;完成转换;存ASCII码;完成转换;存ASCII码;除10H取余,使BCDHA、BCDLBBCDHBCDLA000100000000BCDH0000BCDLBABDIVAB00110011BCDHBCDLROM21H22H20H上页下页回目录第十七页,共八十七页,2022年,8月28日方法2小结:以上程序用了7条指令,
16个内存字节,执行时间为13个机器周期。双字节求补设:两个字节原码数存在R1、R0中求补后结果,存在R3、R2中。例4-3:方法:求补采用“模-
原码”的方法上页下页回目录即用“0”去减“原码”R0R1原码-)R2R300H00H存在借位同样的功能,有不同的编程思路,出现不同的效果,影响程序的实时性及存储空间大小。第十八页,共八十七页,2022年,8月28日
程序:
CLRC
CLRA
SUBBA,R0
MOVR2,A
CLRA
SUBBA,R1
ORG0000H
MOVR3,A
SJMP$
END;CY0;A0;低字节求补;送R2;A清零;高字节求补;送R311111111R00000000011111111R100000000R300000001R2CY
000000001
100000000
000000000A上页下页回目录第十九页,共八十七页,2022年,8月28日将内部RAM的20H单元中的8位无符号二进制数,转换为3位BCD码,并将结果存放在BAI(百位)、SHI(十位)、GE(个位)单元中。例4-4:编程思路:可将被转换数除以100,得百位数;余数除以10得十位数;最后余数即为个位数。编程如下:例如:255(十进制)除以100,得2(百位数)余数除以10,得5(十位数)最后余数5即为个位数上页下页回目录第二十页,共八十七页,2022年,8月28日
BCDEQU20HBAIEQU21HSHIEQU22HGEEQU23H
ORG0000HAJMPMAINORG0030HMAIN:MOVSP,#60HMOVA,BCDMOVB,#100DIVABMOVBAI,AMOVA,BMOVB,#10DIVABMOVSHI,AMOVGE,BNOPLJMP$END;除100,得百位;余数除10,得十位、个位码制转换程序:HEXASCII码;BINASCII码第二十一页,共八十七页,2022年,8月28日4.3分支程序当执行完某一条指令时,为完成某些功能,根据某些条件判断,使程序或顺序执行,或转移到其它指令处执行,这就是分支程序。编程思路这是一个简单分支程序,可以使两数相减,若CY=1,则被减数小于减数。用JC指令进行判断。例4-5
设内部RAM30H,31H存放两个无符号数,试比较两数的大小,较小的数存入30H单元,较大的数存入31H单元。程序的流程图如下:上页下页回目录第二十二页,共八十七页,2022年,8月28日程序:;做减法比较两数CLRC
MOVA,30H
SUBBA,31HJCNEXT
MOVA,30H
XCHA,31HORG0000H
MOV30H,ANEXT
:NOPSJMP$END;CY0;若(30H)小,则转移;交换两数(30H)-(31H)CY=1?交换两数ENDSTART
Y
N流程图:上页下页回目录第二十三页,共八十七页,2022年,8月28日多重分支程序举例例4-7:设片内30H单元存放的是一元二次方程ax2+bx+c=0根的判别式△=b2–4ac的值。试根据30H单元的值,编写程序,判断方程根的三种情况,存入片内31H内。在31H中存放“0”代表无实根,存放“1”代表有相同的实根,存放“2”代表两个不同的实根。编程思路△为有符号数,有三种情况,即小于零,等于零、大于零。可以用两个条件转移指令来判断,首先判断符号位,用指令JNBACC.7,rel判断,若ACC.7=1,则一定为负数;此时0
若ACC.7=0,则△≥0。此时再用指令JNZrel判断若△≠0,则△>0,否则△=0上页下页回目录0△=0△>0第二十四页,共八十七页,2022年,8月28日上页下页回目录流程图:A←△ACC.7=0?ENDSTART
N
Y(A)=0?31H←031H←2
Y
N31H←1△0△=0△0第二十五页,共八十七页,2022年,8月28日程序:
ORG0000HSTART:MOVA,30HJNBACC.7,YESMOV31H,#0SJMPFINISHYES:JNZTOWMOV31H,#1SJMPFINISHTOW:MOV31H,#2FINISH:SJMP$END;△值送A;△≥0转YES;△<0无实根;△=0有相同实根;△>0转TOW;有两个不同实根上页下页回目录第二十六页,共八十七页,2022年,8月28日4.3.3N路分支程序根据前面程序运行结果,可以有N种选择,并转向其中任一处程序。例4-10128路分支程序:根据R3值转向128个目的地址。编程方法:顺序程序
MOVA,R3CJNEA,#00H,FZ1AJMPFZ00FZ1:CJNEA,#01H,FZ2AJMPFZ01FZ2:CJNEA,#02H,FZ3AJMPFZ02FZ3:….. 烦琐,程序太长。如作10000个分支程序…….第二十七页,共八十七页,2022年,8月28日使用JMP@A+DPTR指令实现:JMP128: MOVA,R3 CLRC SUBBA,#128 JNC ERROR MOV A,R3 MOVB,#3 MUL AB MOVDPTR,#PRGTAL
ADD A,DPL MOV DPL,A MOV A,DPH ADDCA,B MOV DPH,A CLR A JMP @A+DPTRPRGTAL: LJMP ROUT00 LJMP ROUT01 ……. LJMP ROUT127 ;入口条件检查
;分支跳转;LJMP指令占3字节例4-10:128分支程序第二十八页,共八十七页,2022年,8月28日JMP256:MOVA,R3;取N值MOVDPTR,#PRGTBL;DPTR指向分支地址表首址CLRC;RLCA;(A)×2JNCLOW128;是前128个分支程序,则转移INCDPH;否基址加256LOW128:MOVTEMP,A;暂存AINCA;指向地址低8位MOVCA,@A+DPTR;查表,读分支地址低8位PUSHACC;地址低8位入栈MOVA,TEMP;恢复A,指向地址高8位MOVCA,@A+DPTR;查表,读分支地址高8位PUSHACC;地址高8位入栈RET;分支地址弹入PC实现转移PRGTBL:DWROUT00;256个分支程序首地址DWROUT01
…;占用512个单元DWROUTFF;例4-11:256分支程序第二十九页,共八十七页,2022年,8月28日分支程序应用场所:1、键盘按键处理程序根据所按功能键转到相应的功能子程序2、通信协议处理程序例:某键盘如下:通信编号设置采样时间设置
+
-确认
MOV A,BCLR CSUBB A,#3JC FOUNRETFOUN:MOVA,B RL AADD A,B MOV DPTR,#KEYF JMP @A+DPTRKEYF:LJMPTONGXIN LJMPBIANHAOLJMPCAIYANG ;键编号第三十页,共八十七页,2022年,8月28日4.4循环程序循环程序:一些有规可循而又反复处理的问题利用比较转移指令CJNE、减1不为“0”转移指令DJNZ等实现例4-13:在内部RAM30H~4FH
连续32个单元中存放了单字节无符号数,求32个无符号数之和,并存入内部RAM51H,50H中。编程思路:这是重复相加问题,要设置一些工作单元设:R0做加数地址指针,R7做循环次数计数器,R3做和数的高字节寄存器。A做和数的低字节寄存器程序的流程图如下:上页下页回目录地址指针循环次数计数器第三十一页,共八十七页,2022年,8月28日流程图:31→R7#0→R3(30H)→A#31H→R0CY=0?ENDSTART
(R7)-1=0?
51H←(R3)50H←(A)
Y
N(A)+((R0))→A(R0+1)→R0(R3)+1→R3上页下页回目录NY第三十二页,共八十七页,2022年,8月28日
程序:;R7作循环次数计数器;R3作和数高字节寄存器;取被加数;R0作加数地址指针;CY=0,和<256,则转;作加法;CY=1,加到高字节;修改R0指针;未完,重复加;存和数初始化部分循环体部分结束部分
ORG0000HSTART:MOVR7,#31MOVR3,#0MOVA,30HMOVR0,#31HLOOP:ADDA,@R0JNCNEXTINCR3NEXT:INCR0DJNZR7,LOOPMOV51H,R3MOV50H,ASJMP$END上页下页回目录循环执行直到R7=0循环控制第三十三页,共八十七页,2022年,8月28日例4-14:从外部RAMBLOCK单元开始有一无符号数数据块,数据块长度存入LEN单元,求出其中最大数存入MAX单元。为了方便进行比较,我们使用CY标志来判断两数的大小,使用B寄存器作比较与交换的寄存器,使用DPTR作外部RAM地址指针。解:这是一个基本搜索问题,采用两两比较法。取两者较大的数再与下一个数进行比较,若数据块长度LEN=n则应比较n-1次,最后较大的数就是数据块中的最大数。程序的流程图如下:上页下页回目录第三十四页,共八十七页,2022年,8月28日流程图:DPTR←#BLOCKLEN←LEN-1A←(DPTR)CY=0?ENDSTART
Y
NLEN-1=0?
MAX←最大数
Y
NCY←0B←(A)DPTR+1A←(DPTR)A←(A)-(B)若(A)<(B)则A←(B)若(A)>(B)则A←(B)+(A)上页下页回目录A中的数较大较大数交换至A恢复较大数初始化工作单元第三十五页,共八十七页,2022年,8月28日编程:;定义数据块首址;定义最大数暂存单元;定义长度计数单元上页下页回目录FMAX:MOV
DPTR,#BLOCKORG0000HBLOCKDATA0100HMAXDATA31HLENDATA30HSJMP
NEXT1NEXT:ADDA,BNEXT1:DJNZLEN,LOOPMOVMAX,ASJMP$END
DECLENMOVXA,@DPTRLOOP:CLRCMOV
B,AINC
DPTRMOVXA,@DPTRSUBB
A,BJNC
NEXTMOVA,B;数据块首址送DPTR;长度减1;取数至A;0→CY;修改指针;暂存于B;取下一数;大者送A;若(A)>(B)则恢复A;未完继续比较;存最大数;*若用RET指令结尾则该程序可作子程序调用;作减法比较RET第三十六页,共八十七页,2022年,8月28日例4-15:从外部RAMBLOCK单元开始有一数据块,数据块长度存入LEN单元,试统计其中正数、负数和零的个数,分别存入PCOUNT、MCOUNT、ZCOUNT单元。解:这是一个多重分支的单循环问题。数据块中是带符号数先用JBACC.7,rel指令判断符号位。程序的流程图如下:若ACC.7=1,则该数一定是负数,MCOUNT单元加1;若ACC.7=0,则该数可能是正数,也可能是零;用JNZrel判断A是否为零若A≠0,则一定是正数,PCOUNT单元加1;若既不为正也不为负,则一定是零,ZCOUNT单元加1;上页下页回目录第三十七页,共八十七页,2022年,8月28日流程图:DPTR←#BLOCKPCOUNT←0MCOUNT←0ZCOUNT←0ACC.7=0?ENDSTART
Y
N(A)=0?
DPTR+1
Y
N
A←(DPTR)ZCOUNT+1MCOUNT+1LEN-1=0?PCOUNT+1
Y
N上页下页回目录第三十八页,共八十七页,2022年,8月28日程序:ORG0200HBLOCKDATA2000HLENDATA30HPCOUNTDATA31HMCOUNTDATA32HZCOUNTDATA33H;定义数据块首址;定义长度计数单元;定义正计数单元;定义负计数单元;定义零计数单元上页下页回目录第三十九页,共八十七页,2022年,8月28日;数据块首址送DPTR;计数单元清零;若ACC.7=1转负计数;取数;若(A)≠0,转正计数;若(A)=0,则零的个数加1;负计数单元加1;正计数单元加1;修正指针;未完继续NEXT:INCDPTR
DJNZLEN,LOOPSJMP$ENDSTART:MOVDPTR,#BLOCK
MOVPCOUNT,#0LOOP:MOVXA,@DPTRJBACC.7,MCONJNZPCONINCZCOUNTAJMPNEXTMCON:INC
MCOUNT
MOV
MCOUNT,#0
MOVZCOUNT,#0AJMPNEXTPCON:INCPCOUNT上页下页回目录第四十页,共八十七页,2022年,8月28日4.5查表程序上页下页回目录对于复杂参数的计算如:非线性参数对数、指数、三角函数微分、积分等用汇编编程十分困难甚至无法建立数学模型用查表的方法简单容易查表:把事先计算或测得的数据按一定顺序编制成表格,存放在程序存储器中。查表程序的任务就是根据被测数据,查出最终所需要的结果。第四十一页,共八十七页,2022年,8月28日例4-20:一个十六进制数放在HEX单元的低四位,将其转换成ASCII码查表程序:编程思路十六进制0~9的ASCII码为30H~39H,
A~F的ASCII码为41H~46H,
查表指令:MOVCA,@A+DPTRMOVCA,@A+PC表格定义:用伪指令DB或DW把表格的数据存入ROM上页下页回目录来获得数据ASCII码表格的首址为ASCIITAB不连续的第四十二页,共八十七页,2022年,8月28日ASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46H
END上页下页回目录编程1:
0123
456789
ABCDEFAJMP$
ORG0000HHEXEQU30HHEXASC:MOVA,HEXMOVDPTR,#ASCTABMOVCA,@A+DPTRMOVHEX,AANLA,#0FH第四十三页,共八十七页,2022年,8月28日编程2:
ORG0000HHEXEQU30HHEXASC:MOVA,HEXANLA,#0FHADDA,MOVCA,@A+PCMOVHEX,AAJMP$ASCTAB:DB30H,31H,32H,33HDB34H,35H,36H,37HDB38H,39H,41H,42HDB43H,44H,45H,46HEND;变址调整;2字节;2字节PCPC#4上页下页回目录;变址调整第四十四页,共八十七页,2022年,8月28日4.6子程序的设计及调用一、子程序的概念把能完成某种基本操作并具有相同操作的程序段单独编成子程序。如:函数、±、×、运算、代码转换、延时等子程序调用ACALL、LCALL子程序返回RET使用子程序的优点⑴不必重复书写同样的程序,提高编程效率⑵程序的逻辑结构简单,便于阅读⑶缩短了源程序和目标程序的长度,节省了存储器空间⑷使程序模块化、通用化、便于交流共享资源⑸便于按某种功能调试上页下页回目录操作第四十五页,共八十七页,2022年,8月28日二、调用子程序的要点⑴子程序的名字:子程序开头的标号段,也是其入口地址,供主程序调用。例如:调用延时子程序主程序指令:LCALLDELAY⑵子程序返回:结尾必须使用一条从子程序返回指令RET,它具有恢复断点的功能RET;PC15~8((SP)),(SP)(SP)
-1;PC7~0((SP)),(SP)(SP)
-1主程序LCALL断点子程序RET1、子程序的结构上页下页回目录子程序:DELAY:MOVR7,#100 DJNZ R7,$ RET 子程序名称第四十六页,共八十七页,2022年,8月28日2、参数传递子程序入口条件:在调用一个子程序时,主程序应先把有关参数放到某些约定的位置,子程序运行时,可以从约定的位置得到有关参数。子程序出口条件:子程序结束前,也应把处理结果送到约定位置参数传递的方法:⑴子程序无须传递参数这类子程序中所需要的参数是子程序赋予,不需要主程序给出上页下页回目录第四十七页,共八十七页,2022年,8月28日主程序:...LCALLDELY...子程序:不需主程序提供入口参数,从子程序开始到子程序返回,大约为20ms例4-23
调用延时子程序DELYDELY:MOVR7,#100DLY0:MOVR6,#98NOPDLY1:DJNZR6,DLY1DJNZR7,DLY0RET子程序开始的标号子程序返回指令调用子程序上页下页回目录98×2=196µs1µs1µs设:主频为12MHZ2µs(196+2+2)×100+3=20003µs=20.003ms2µs1µs+3第四十八页,共八十七页,2022年,8月28日⑵用累加器和工作寄存器传递参数入口参数:放在累加器A和工作寄存器中R0~R7中出口参数:放在累加器A和工作寄存器中R0~R7中例4-24
双字节求补子程序CPLD解:采用“取反加1”的方法,十六位数取反加1,不仅低字节要加1,高字节要加低字节的进位。故采用ADD指令,不采用INC指令。
INC指令不影响CY位上页下页回目录第四十九页,共八十七页,2022年,8月28日入口参数:(R7R6)=16位数出口参数:(R7R6)=求补后的16位数
CPLD:
MOVA,R6CPLA
ADDA,#1
MOVR6,A
MOVA,R7
CPLA
ADDCA,#0
MOVR7,A
RET上页下页回目录Cy+Cy第五十页,共八十七页,2022年,8月28日@R0@R0@R0⑶通过操作数地址传递参数入口参数:(R0)=求补数低字节指针,(R7)=n-1出口参数:(R0)=求补后高字节指针例4-25n字节求补子程序CPLNCPLN:
MOVA,@R0CPLAADD
A,#1MOV@R0,AMOVA,@R0CPLAADDCA,#0MOV@R0,ARETNEXT:INCR0DJNZR7,NEXT上页下页回目录内部RAM字节1字节2字节3……字节n@R0@R0地址第五十一页,共八十七页,2022年,8月28日⑷通过堆栈传递参数例4-26
在HEX单元存放两个十六进制数,将它们分别转换成ASCII码并存入ASC和ASC+1单元解:由于要进行两次转换,故可调用查表子程序完成MAIN:...PUSHHEX
LCALLHASCPOPASCMOVA,HEXSWAPAPUSHACCLCALLHASCPOPASC+1...;转子;压入被转换数;ASCL→ASC;取被转换数;处理高四位;压入;转子程序;ASC→ASC+1主程序*PCH*PCL
HEXSPSP+1SP+2SP+3栈底*PC断点地址上页下页回目录尽量少用第五十二页,共八十七页,2022年,8月28日MOVCA,@A+PC
HASC:
DECSPDECSPPOPACCANLA,#0FHADDA,#5PUSHACCINCSPINCSPRETASCTAB:DB‘012…7’DB‘89A…F’;弹出;修改SP指向HEX;屏蔽高四位;变址调整;查表;结果入栈;修改SP指向断点位置;;;子程序上页下页回目录*PCH*PCL
HEXSPSP+1SP+2SP+3栈底AHEXResultResultSP+1SP+2SP+3PC第五十三页,共八十七页,2022年,8月28日
HEX
SPSPSPSP
...PUSHHEX
LCALLHASCPOPASCMOVA,HEXSWAPAPUSHACCLCALLHASCPOPASC+1...MOVCA,@A+PCHASC:
DECSPDECSPPOPACCANLA,#0FHADDA,#5PUSHACCINCSPINCSPRETASCTAB:DB‘012…7’
DB‘89A…F’60H61H62H63H64H
HEX*PCL*PCHPC断点SP0000HEXL
ASCAASCSPSPSPSP主程序子程序上页下页回目录第五十四页,共八十七页,2022年,8月28日3、现场保护
现场保护:
如果子程序使用的寄存器与主程序使用的寄存器有冲突,在转入子程序前,特别是进行中断服务子程序时,要进行现场保护。保护内容:内部RAM内容, 各工作寄存器内容,主程序正在使用累加器A、BDPTRPSW保护方式:将要保护的单元压入堆栈。还可以用RS1RS0来选择其他通用寄存器组,以便保护主程序现场。上页下页回目录第五十五页,共八十七页,2022年,8月28日例如:某子程序的现场保护BCDCB:PUSHACCPUSHPSWPUSHDPLPUSHDPH...POPDPHPOPDPLPOPPSWPOPACCRET推入与弹出应按照“先进后出”,或“后进先出”的顺序;;保护现场;;子程序功能语句;;恢复现场;;;上页下页回目录第五十六页,共八十七页,2022年,8月28日三、子程序的调用及嵌套1、子程序的调用上页下页回目录2、子程序的嵌套子程序的嵌套:子程序中可调用其他子程序汇编语言子程序,可否自己调用自己?第五十七页,共八十七页,2022年,8月28日常见MCS-51子程序:1、算术运算子程序 多字节BCD码加法、减法、求补、移位;双字节二进制无符号数乘法、平方、除法、开平方;平均值2、代码转换子程序 单字节HEX数转双字节ASCII码、ASCII码转HEX;单字节HEX数转BCD码等3、查找 单字节HEX无(有)符号数据块极值;查表;排序;第五十八页,共八十七页,2022年,8月28日4.7程序设计举例例4-29
多字节无符号数减法子程序NSUB功能:n字节无符号数减法入口:(R0)=被减数低字节指针(R1)=减数低字节指针(R7)=字节数n出口:(R0)=差数高字节地址指针解:的若被减数大于减数,则差为正数;若被减数小于减数,则差为补码数(负数),且差数为n字节上页下页回目录第五十九页,共八十七页,2022年,8月28日流程图:0←CY
((R0))-((R1))-CY→(R0)RETNSUB(R7)-1=0?修改地址指针(R0)+1→R0,R1+1→R1
NNSUB:CLRCLOOP:MOVA,@R0
MOV@R0,ASUBBA,@R1INCR0INCR1DJNZR7,LOOPDECR0RET程序:上页下页回目录第六十页,共八十七页,2022年,8月28日例4-30
双字节无符号数快速乘法子程序MULD功能:双字节无符号数乘法,积为32位入口:
(R7R6)=
被乘数ab(R5R4)=
乘数cd(R0)=
有定义的内部RAM地址出口:
(R0)=
乘积的高字节地址指针解:于两个双字节无符号数相乘,用8位乘法指令来完成需要四次,每次的乘积为16位,会产生4个部分积,共需要8个单元存放,然后再按“位权”相加,和即为所求之积。这样所占存储单元太多,应该采用边乘边加的方法。用R3、R2、R1作暂存器或工作单元。上页下页回目录第六十一页,共八十七页,2022年,8月28日
R6
b
R7
a
R4
d
R5
c编程思路与手乘法相似:被乘数乘数上页下页回目录第六十二页,共八十七页,2022年,8月28日
R6
b
R4
dbdHbdL
R7
aadHadL
R5
cbcLbcHacLacHbdLadHbdH+adL+bcLadH+bcH+acL相乘过程上页下页回目录第六十三页,共八十七页,2022年,8月28日MULD:MOVA,R6MOVB,R4MULABMOV@R0,AMOVR3,BMOVA,R7MOVB,R4MULABADDA,R3MOVR3,AMOVA,BADDCA,#0MOVR2,AMOVA,R6MOVB,R5MULABADDA,R3程序;;b×d;存积7~0,bdL→(R0);;;adL+bdH;;;暂存,adL+bdH→R3;a×d;adH→A;bcL+adL+cy;adH+cy→A;b×c;暂存,adH+cy→R2;;上页下页回目录第六十四页,共八十七页,2022年,8月28日INCR0MOV@R0,AMOVR1,#0MOVA,R2ADDCA,BMOVR2,AJNCLASTINCR1LAST:MOVA,R7MOVB,R5MULABADDA,R2INCR0MOV@R0,AMOVA,BADDCA,R1INCR0MOV@R0,ARET;用R1记录cy;bcH+adH+cy;存积15~8,bcL+adL+bdH→(R0+1);暂存,bcH+adH+cy→R2;cy=0,则转LAST;;R0+1;;;cy=1,则(R1)=1;a×c;acL+bcH+adH+cy;(R0+3);R0+2;acH+cy;存积23~16,acL+bcH+adH+cy→(R0+2);存积31~24,acH+cy→(R0+3)上页下页回目录第六十五页,共八十七页,2022年,8月28日例4-33
多字节十进制加法子程序BCDADD功能:n字节十进制加法入口:(R0)=
被加数低字节指针(R1)=
加数低字节指针(R7)=字节数n出口:(R0)=
和数高字节地址指针解:两数相加,和数为n+1字节。若cy=0,则(n+1)字节为0;若cy=1,则(n+1)字节为1上页下页回目录第六十六页,共八十七页,2022年,8月28日BCDADD:CLRCADDL:MOVA,@R0ADDCA,@R1DAAMOV@R0,AINCR0INCR1DJNZR7,ADDLCLRAMOVACC.0,CMOV@R0,ARET程序:上页回目录过“9”补“6”CY
第六十七页,共八十七页,2022年,8月28日例4-6:空调机制冷时,若排出的空气温度比吸入的空气温度低8℃则认为工作正常,否则便认为是故障,并设置故障标志。解:为了可靠的监控空调机的工作情况,做两次减法:第一次(40H)-(41H),若CY=1,则肯定有故障;第二次两个温度的差值减去8℃,若CY=1,则肯定有故障程序的流程图如下:上页下页回目录首先定义一些工作单元内部RAM40H41H42H吸入温度值排出温度值故障标志第六十八页,共八十七页,2022年,8月28日A←(40H)-(41H)CY=1?(A)-8℃ENDSTART
Y
NCY=1?42H←FFH42H←0
Y
N流程图:上页下页回目录故障正常第六十九页,共八十七页,2022年,8月28日
ORG1000HSTART:MOVA,40HCLRCSUBBA,41HJCERRORMOV42H,#0JCERRORSUBBA,#8SJMPEXITERROR:MOV42H,#0FFHEXIT:SJMP$END程序:;吸入温度值送A;0→CY;A←(40H)-(41H);CY=1,则故障;是则故障;温度小于8℃?;工作正常标志;转出口;设置故障标志若CY≠1顺序执行CY=1转移CY=1转移若CY≠1顺序执行上页下页回目录第七十页,共八十七页,2022年,8月28日一般软件的容错设计1、堆栈溢出的预防☆堆栈设置在片内RAM区,片内资源有限,使堆栈区范围有限。☆堆栈溢出,将引起程序“跑飞”,危害极大。☆减少系统对堆栈的需求量方法:
1、取消部分子程序
2、尽量不用堆栈来传递参数和结果
3、根据需要减少子程序现场保护量☆系统对堆栈的极限需求量计算方法:主程序最大需量+低级中断最大需量+高级中断的最大需量第七十一页,共八十七页,2022年,8月28日2、状态转移的条件审查一般情况下,程序自当前状态进入下一状态,往往取决于一个特定的条件。对重要条件要进行审查,确保安全进入下一个状态。如:散转程序的入口条件;如:直线切削控制:当前状态为刀架快进,快进量完成后进入下一个状态,停止快进,开始切削。可靠性设计中,还要考虑:如冷却泵运转否?主轴电机运转否?等其它条件。好处:防止软件设计错误对条件破坏、干扰的结果 对条件的影响等 第七十二页,共八十七页,2022年,8月28日3、重要模块的安全性措施某些重要模块的执行对系统有重大影响,如果错误执行将引起严重后果。系统受到干扰后,程序有可能弹飞到该模块中引起非法执行,降低系统可靠性。1)、加强模块入口条件审查;2)、为执行模块配备“密码”措施:入口例行条件检查满足否?操作准备返回密码检查符合否?清除密码实质性操作出错处理返回NYNY第七十三页,共八十七页,2022年,8月28日4、软件算法的冗错设计1)、逻辑运算的冗错设计思路:画卡诺图、逻辑化简、程序设计、出错处理注意必须作逻辑变量的全覆盖设计2)、数值运算的容错设计容错功能从两个方面考察:一是对入口条件的要求是否苛刻;二是出口信息中是否包括出错信息⑴、入口条件审查如:双字节除单字节、商存单字节正整数的运算子程序的入口条件?考虑:除数是否为0?商是否超出一个字节的范围?第七十四页,共八十七页,2022年,8月28日⑵、必须对某些运算的中间结果和最终结果进行检查,并对结果做出处理如:A=235+√5B-6C,已知:B〈200,
C〈200,A是1字节的整数。首先做入口条件检查:B〈200?C〈200?能否保证结果正确?☆5B-6C〈0?☆B远大于C,出现A〉255情况(B=125,C=0,B〉〉C,A=235+25=260)⑶、出错信息的设计和使用出错信息要设计的丰富一些,便于人们了解出错的详细情况,以便对症处理。第七十五页,共八十七页,2022年,8月28日⑷、合理安排运算方案,减少舍入误差对最终结果的影响。如计算:9/5*6方法1:MOVA,#9MOV B,#5DIV ABMOV B,#6MUL AB方法2:MOV A,#9MOV B,#6MUL ABMOV B,#5DIV AB结果:6结果:101、先进行无偏差或偏差小的运算;2、尽量避免两数值相近的数过早相减;避免用绝对值小的数作分母等建议:第七十六页,共八十七页,2022年,8月28日⑸、将复杂运算过程用查表来代替。第七十七页,共八十七页,2022年,8月28日CPU抗干扰技术当干扰作用到CPU本身时,CPU有可能将操作数当做操作码来执行,使其不能按正常状态执行程序,从而引起混乱。如何及时发现CPU受到干扰、如何拦截失去控制的程序流向、如何使系统的损失减小、如何尽可能地恢复系统正常状态,便是CPU抗干扰技术研究的课题。1、睡眠抗干扰2、指令冗余;
3、软件陷阱;
4、程序运行监视系统(WATCHDOG)
第七十八页,共八十七页,2022年,8月28日CPU抗干扰技术当干扰作用到CPU本身时,CPU将不能按正常状态执行程序,从而引起混乱。1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024实体店铺租赁预付定金合同模板版B版
- 2024大连市肉鸡委托饲养合同范文
- 2024年度房地产估价报告编制合同3篇
- 2024婚前共同买房协议范本大全
- 2024年人力资源服务合同标的描述
- 2024年国际贸易出口协议履行操作指南版B版
- 2024年商场租赁协议标准化文本版B版
- 2024最标准多边投资担保合同
- 2024年度健身中心会员管理系统合同2篇
- 年度砂石、水泥运输碳排放减少合同2篇
- 未来食品2024年食品科技的重大突破与美食文化的变革
- 山西国开2024年《农业经营学》形考1-4答案
- 大学生药剂师职业生涯规划
- 职业健康检查机构执法监督检查表
- 辽宁省六校2023-2024学年高一年级上册12月联考历史试卷(含答案)
- 老年肺炎病人的护理
- 2024年大学试题(历史学)-中国近现代史纲要笔试历年真题荟萃含答案
- 2021年大学VB考试题库
- 2024年移动通信设备项目规划申请报告模本
- 广州起义烈士陵园英文导游词
- 形容词比较级与最高级通用课件
评论
0/150
提交评论