嵌入式系统概论单片机基础汇编语言程序设计教学目的:熟悉80C51系列单片机的汇编语言,能够熟练编写汇编语言源程序。教学重点:常用汇编语言程序设计方法。教学难点:分支程序、散转程序与子程序的设计程序设计语言机器语言是一种用二进制代码“0”和“1”表示指令和数据最原始的程序设计语言,是计算机唯一能够识别和执行的语言。计算机能够快速识别立即执行。汇编语言是用助记符表示的面向机器程序设计语言,比机器语言直观、易懂、易用且便于记忆。汇编语言在交由计算机执行之前,必须将其翻译成机器语言,这一翻译过程称为“汇编”。高级语言是一种面向过程且独立于计算机硬件结构的通用计算机语言。高级语言同样需要翻译成机器语言,这一过程称为“编译”或“解释”,这一编译或解释的程序称为“编译程序”或“解释程序”。高级语言功能强,但用较多的存储空间,执行时间长,故不适用于高速实时控制。汇编语言规范汇编语言由四部分组成标号:操作码,操作数;注释标号段:以字母开头的1-8个字母和数字串组成,不能用助记符、伪指令和寄存器名,标号只有在需要时才设置。操作码段:是指令或伪指令助记符,用来表示指令的操作性质,在指令中是必不可少的。操作数段:给出参加运算(或其它操作)的数据或数据地址。可使用二(B)、十(D)、十六(H)进制码.也可用标号及表达式表示。注释段:是本指令执行目的和所起作用的说明。它不参加汇编。例HY1:MOVA,#08H;#08H→A(表示将立即数08H送到累加器A中)标号段:LABEL操作码段OPCODE,操作数段OPRAND;注释段COMMENT80C51汇编程序设计中常用的伪指令在汇编程序对汇编语言编写的源程序进行汇编时,有一些控制汇编用的特殊指令不属于指令系统,不产生机器代码,称为“伪指令”。为编程提供方便。1、ORG(Origin)汇编起始指令:用于规定目的程序在程序存储器中存放的起始地址。格式如下:标号操作码操作数ORG表达式(exp)注exp必须是16位的地址值2、END汇编结束指令:表示程序已结束。3、EQU(Equate)赋值指令:把操作数段中的地址或数据赋值给标号,格式如下:标号操作码操作数字符名称EQU数或汇编符号例AAEQUR1;R1与AA等值则MOVA,AA指令与MOVA,R1指令结果相同。80C51汇编程序设计中常用的伪指令4、DB(DefineByte)定义字节(*8bit)指令:定义程序存储器中存放的若干个字节的数值或ASCII码字符,每个数或字符之间用(,)隔开,表示ASCII码时需用(‘’)或(“”)表示8位常数表,格式如下:操作码操作数DB字节常数或ASCII字符例ORG1000HDB76H,73,‘C’,‘B’,OACH则(1000H)=76H(1001H)=49H(1002H)=43H(1003H)=42H(1004H)=0ACH5、DW(DefineWord)定义字(*16bit)指令:定义程序存储器中存放的若干个字[(16位:先存高8位(PC低地址),后存低8位(PC高地址)]的数据或ASCII码字符,格式如下:操作码操作数DW字常数或ASCII字符例ORG2200HDW1246H,7BH,10则(2200H)=12H(2201H)=46H(2202H)=00H(2203H)=7BH(2204H)=00H(2205H)=0AH80C51汇编程序设计中常用的伪指令6、BIT定义位地址指令:功能是把位地址赋予所规定的字符名称。格式如下:标号操作码操作数字符名称BIT位地址例ABCBITP1.0Q4BITP2.2则汇编后,位地址P1.0,P1.2分别赋给变量ABC和Q4。7、DATA定义标号数值伪指令:将表达式指定的数据地址赋予规定的字符名称,该指令与EQU指令相似,只是,可先使用后定义,放于程序开头、结尾均可。其功能是给标号段中的标号赋予数值,格式如下:标号操作码操作数字符名称DATA表达式例MNDATA2000H汇编后,MN的值为2000H8、DS定义存储空间指令:其功能是从指定地址开始保留DS之后表达式的值所规定的存储单元以备使用,格式如下:操作码操作数DS表达式例ORG500HDS10HDB4BH,FDH汇编后,从500H开始保留16个单元不赋值,然后从511H开始给存储器赋值,(511H)=4BH,(512H)=FDH.汇编可分成两种:人工汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。汇编机器语言目标程序汇编语言源程序汇编程序汇编机器语言目标程序汇编语言源程序人工查指令机器码表汇编语言及汇编过程顺序程序设计顺序结构程序是基本程序。程序按编写的顺序依次往下执行每一条指令,直到最后一条。它能够解决某些实际问题,或成为复杂程序的子程序。例:将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码0~9为30H~39H。解:采用先把20H中低4位BCD码交换出来加以转换、存放,然后再把高4位BCD码交换至低4位加以转换、存放。语句3语句2顺序结构入口语句1出口BCDASCIIBCDASCIIBCDASCII030H434H838H131H535H939H232H636H333H737H顺序程序设计源程序如下:地址机器码周期数源程序.ORG0000H22H0000H0202003LJMPMAIN21HMAIN:20H200H78221MOVR0,#22H.202H76001MOV@R0,#00H.204HE5201MOVA,20HR022H206HD61XCHDA,@R0;A和@R0的低4位互换207H4322303ORL22H,#30H20AHC41SWAPA;A的高低4位互换20BH44301ORLA,#30H20DHF5211MOV21H,A20FH80FE2SJMP$;循环等待ENDRAM将20H单元的两个BCD码拆开并变成ASCII码,存入21H、22H单元。注意ASCII码0~9为30H~39H。循环程序设计处理实际事务时,有时会遇到多次重复处理的问题,用循环程序的方法来解决就比较合适。循环程序中的某些指令可以反复执行多次。采用循环程序,使程序缩短,节省存储单元。循环初态:(初始条件)是设置循环过程中工作单元的初值,例如,设循环次数计数器、地址指针置初值等。循环体:循环体是指重复执行的程序段,完成主要的计算和操作任务。同时包括对指针的修改。循环控制部分:循环控制部分用于控制循环的执行和结束。根据循环次数计数器的状态或循环条件,检查循环是继续循环或退出循环。若在循环体中还包含有循环程序,这种现象叫“循环嵌套”,这样的程序称为“多重循环程序”。在多重循环程序中,只允许外重循环嵌套内重循环,不允许循环体交叉;也不允许从循环程序外部跳入循环程序中。顺序程序设计已知:80C51单片机经常使用的晶振为12MHz,要求设计一个软件延时程序,延时时间为10ms。解:延时程序的延时时间主要与两个因素有关,一个是所用晶振,一个是延时程序中的循环次数。一旦晶振确定之后,则主要是如何设计与计算需给定的延时循环次数。在本题中已知晶振为12MHz,则可知一个机器周期为1s,可预计采用单重循环是有可能实现1ms的延时的。现根据题意编写源程序如下:P1P2S1P1P2S2P1P2S3P1P2S4P1P2S5P1P2S6机器周期1s状态周期1/6s时钟周期1/12s循环程序设计周期数源程序注释1MOVR0,#0AH;10毫秒数R01DL2:MOVR1,#MT;1ms延时的预定值MTR1(MT=FAH)1DL1:NOP1NOP2DJNZR1,DL1;lms延时循环2DJNZR0,DL2;毫秒数减1,不等于0,继续循环,等于0结束内层循环DL1机器周期个数为(1+1+2),每个机器周期为1s,内层循环一次需4s。若内层循环延时lms,需1000/4=250次,十六进制数为FAH.循环程序设计ORG200HCLRA;清A作为初始最大值MOVR2,20H;数据个数初值MOVR1,#22H;数据存放区首地址LP:CLRC;清进位SUBBA,@R1;初始最大值减队列中的数JNCNEXT;小于初始最大值继续MOVA,@R1;大于初始最大值,则用此值作为最大值SJMPNEXT1NEXT:ADDA,@R1;小于初始最大值,则恢复原最大值NEXT1:INCR1;修改地址指针DJNZR2,LP;依次重复比较,直至R2=0MOV21H,A;最大值存入21H单元从22H单元开始有一个无符号数据块,其长度在20H单元。求出数据块中最大值,并存入21H单元多重循环设计如果在一个循环程序中嵌套了其他的循环程序,称为多重循环程序。在用软件实现延时时显得特别有用。设计50ms秒延时子程序,使用12MHz晶振时,一个机器周期的时间为1s,执行一条DJNZ指令的时间为2s,我们可以采用双重循环的方法写出延时的LOOP子程序周期数源程序注释1LOOP:MOVR7,#C8H;2001DEL1:MOVR6,#7CH;1231NOP2DEL:DJNZR6,DEL2DJNZR7,DEL12RET延时时间:t=1+200[(1+1+2*123)+2]+2≈50000s=50ms分支程序设计分支程序的的特点是在程序中是含有转移指令,可根据程序要求,无条件或有条件地改变程序的执行顺序。编写分支结构程序的重在于正确使用转移指令,转移指令有3种,即无条件转移、条件转移、散转。1、无条件转移:程序转移方向是事先安排的,只须给出正确的转移目标地址或偏移量即可。2、条件转移:根据已执行程序对标志位、累加器、内部RAM的某位的影响结果来决定程序的走向。例:JCrel;(C)=1:(PC)+2+relPC(跳转)(C)=0:(PC)+2PC(顺序执行)在执行此命令之前,必须使用影响位累加器C的指令。3、散转:在80C51单片机中有一条专门的散转指令。无条件/条件转移程序例:设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。Y=3X,X10Y=2X+10,10=X=15Y=40,X15函数式有3条路径可选,需采用分支程序设计。首先计算2X并暂存R1中,在第2条件中,2X最大值不大于30,故可用一个寄存器,然后根据X值确定Y值。无条件/条件转移程序ORG200HMOVA,5AHADDA,5AH;2X→AMOVR1,AMOVA,5AH;重新把X装入ACJNEA,#10,L1L1:JCL2;X10转L2MOVR0,#40;先假设X15CJNEA,#10H,L3;与16比较L3:JNCL4;X15转L4MOVA,R1ADDA,#10;10≤X≤15,Y=2X+10MOVR0,ASJMPL4L2:MOVA,R1ADDA,5AH;X10,Y=3XMOVR0,AL4:MOV5BH,R0;存结果SJMP$ENDY=3X,X10Y=2X+10,10=X=15Y=40,X15(5AH)=X(5BH)=Y散转指令JMP@A+DPTR散转指令的操作是把16位数据指针DPTR的内容与累加器A中8位无符号数相加,形成新的目标地址,装入程序计数器PC,此即散转的目的地址。散转程序的设计采用两种不同的方法。固定数据指针DPTR,根据累加器A的内容,转入相应的分支程序。(散转点不超过256个)累加器A清0,根据数据指针DPTR的值决定程序转向地址,DPTR的值可通过查表或其他方法获得。(可达64KB地址空间转移)散转程序设计(采用转移指令表)根据R3的内容,转向各个操作程序。R3=0,转入OPR0R3=1,转