1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,10,章,80C51,单片机指令系统与程序设计,10.1,概述,10.2,指令格式,10.3,寻址方式,10.4,指令系统,10.5,汇编语言程序设计,10.6 C51,程序设计简介,10.1,概述,汇编语言:对于深入理解单片机原理,了解单片机指令运行过程具有重要意义。代码简短,但是编程费时间。,C,语言:移植性好,编程容易。但是代码长。,机器指令:机器能够直接执行的唯一指令格式。,单字节指令,双字节指令,三字节指令,汇编指令:用助记符表示的指令。,10.2,指令格式,一、单字节指令,1.8,位编码仅为
2、操作码:,如:,INC A,。该指令的编码为:,0000 0100B,,其十六进制表示为,04H,,累加器,A,隐含在操作码中。指令的功能是累加器,A,的内容加,1,。,注意:在指令中用“,A”,表示累加器,而用“,ACC”,表示累加器对应的地址(,E0H,)。,2,8,位编码含有操作码和寄存器编码,高,5,位为操作码,低,3,位为存放操作数的寄存器编码。如:,MOV A,,,R0,编码为,1110 1000B,,其十六进制表示为,E8H,(低,3,位,000,为寄存器,R0,的编码)。功能是将当前工作寄存器,R0,中的数据传送到累加器,A,中。,二、双字节指令,第一字节表示操作码,第二个字节
3、表示参与操作的数据或数据存放的地址。,如:,MOV A,,,#50H,编码为,0111 0100B,,,0101 0000B,。其十六进制表示为,74H,,,50H,。功能是将立即数“,50H”,传送到累加器,A,中。,三、三字节指令,指令的第一字节表示该指令的操作码,后两个字节表示参与操作的数据或数据存放的地址。如:,MOV 20H,,,#50H,编码为,0111 0101B,,,0010 0000B,,,0101 0000B,。其十六进制表示为,75H,,,20H,,,50H,。功能是将立即数“,50H”,传送到内部,RAM,的,20H,单元中。,四,.,汇编指令,一般格式为:,操作助记符
4、目的操作数,,源操作数,多数指令为两操作数指令;当指令操作数隐含在操作助记符中时,在形式上这种指令无操作数;另有一些指令为单操作数指令或三操作数指令。指令的一般格式中使用了可选择符号“,”,,包含的内容因指令的不同可以有或无。,在两个操作数的指令中,通常目的操作数写在左边,源操作数写在右边。,如:,ANL A,,,40H,功能是将立即数“,40H”,同累加器,A,中的数进行“与”操作,结果送回累加器。,ANL,为“与”操作的助记符,立即数“,40H”,为源操作数,累加器,A,为目的操作数。,汇编程序中常用的符号,Rn(n,=07),:当前选中的工作寄存器组中的寄存器,R0R7,之一;,Ri(
5、i,=01),:当前选中的工作寄存器组中的寄存器,R0,或,R1,;,:间址寄存器前缀;,#data,:,8,位立即数;,#data16,:,16,位立即数;,direct,:片内低,128,个,RAM,单元地址及,SFR,地址,(,可用符号名称表示,),;,addr11:11,位目的地址;,addr16:16,位目的地址;,rel,:,补码形式表示的,8,位地址偏移量,值在,128,127,范围内;,bit:,片内,RAM,位地址、,SFR,的位地址(可用符号名称表示);,/:,位操作数的取反操作前缀;,(,),:,表示,地址单元或寄存器中的内容;,:,将箭头右边的内容送入箭头左边的单元中。
6、KEIL,使用,10.3 80C51,的寻址方式,是寻找操作数或指令的地址的方式。,80C51,的寻址方式有七种,即:,寄存器寻址;,直接寻址;,寄存器间接寻址;,立即寻址;,基址寄存器;,变址寄存器变址寻址;,相对寻址和位寻址。,若不特别声明,我们后面提到的寻址方式均指源操作数的寻址方式。,分类,序号,寻址方式,存储空间,基本寻址,1,寄存器寻址,DPTR,,,Rn,,,A,,,AB,,,C,2,直接寻址,SFR,,,128,字节,3,间接寻址,片内:,Ri,,,SP,片外:,Ri,,,DPTR,4,立即寻址,ROM,扩展寻址,5,变址寻址,ROM,:,A+DPTR,,,A+PC,6,相对
7、寻址,ROM,:,PC,值改变,7,位寻址,20-2FH,字节,,SFR,特殊位,80C51,寻址方式,每条指令,要明确地知道数据在哪里!,寄存器寻址,操作数存放在寄存器中,指令中直接给出该寄存器名称的寻址方式。可以获得较高的传送和运算速度。寄存器可以是:,R0R7,;,A,;,B(,仅以,AB,形式出现,),;,C,,,DPTR,。如:,MOV A,,,R0;,A,(R0),直接寻址,指令操作码之后的字节存放的是操作数的地址,操作数本身存放在该地址指示的存储单元中的寻址方式称为直接寻址。直接寻址中的,SFR,经常采用符号形式表示。寻址空间为:片内,RAM,低,128,字节和,SFR,。如:,
8、MOV A,,,50H,;,A,(50H),直接地址时要用,寄存器间接寻址,寄存器中的内容为地址,从该地址去取操作数的寻址方式称为寄存器间接寻址,。寻址的存储空间为片内,RAM,或片外,RAM,。,片内,RAM,的数据传送采用“,MOV”,类指令,间接寻址寄存器采用寄存器,R0,或,R1,(堆栈操作时采用,SP,);,片外,RAM,的数据传送采用“,MOVX”,类指令,这时间接寻址寄存器有两种选择。,采用,R0,和,R1,作间址寄存器,这时,R0,或,R1,提供低,8,位地址(外部,RAM,多于,256,字节采用页面方式访问时,可由,P2,口未使用的,I/O,引脚提供高位地址);,采用,DPT
9、R,作为间址寄存器。,寄存器间接寻址对应的空间为:,片内,RAM,(采用,R0,,,R1,或,SP,);,片外,RAM,(采用,R0,,,R1,或,DPTR,);如:,MOV A,,,R0,;,A,(R0),4.,立即寻址,指令编码中直接给出操作数的寻址方式称为立即寻址。在这种寻址方式中,紧跟在操作码之后的操作数称为立即数。立即数可以为一个字节,也可以是两个字节,并要用符号“”来标识。由于立即数是一个常数,所以只能作为源操作数。立即寻址所对应的寻址空间为:,ROM,。如:,MOV A,,,50H,A,50H,变址寻址,以一个基地址加上一个偏移量地址形成操作数地址的寻址方式称为变址寻址。以数据指
10、针,DPTR,或程序计数器,PC,作为基址寄存器,累加器,A,作为偏移量寄存器,基址寄存器的内容与偏移量寄存器的内容之和作为操作数地址。变址寻址所对应的寻址空间为:,ROM,。如:,MOVC A,,,A+DPTR,A,(A)+(DPTR),6,相对寻址,相对寻址是以程序计数器,PC,的当前值(指读出该,2,字节或,3,字节的跳转指令后,,PC,指向的下条指令的地址)为基准,加上指令中给出的相对偏移量,rel,形成目标地址的寻址方式。,rel,是一个带符号的,8,位二进制数,取值范围是,128,127,,以补码形式置于操作码之后存放如:,JC,rel,7,位寻址,对位地址中的内容进行操作的寻址方
11、式称为位寻址。采用位寻址指令的操作数是,8,位二进制数中的某一位。指令中给出的是位地址。位寻址方式实质属于位的直接寻址。,寻址空间为:片内,RAM,的,20H2FH,单元中的,128,可寻址位;,SFR,的可寻址位。习惯上,特殊功能寄存器的寻址位常用符号位地址表示。如:,CLR ACC.0,MOV 30H,,,C,10.4,指令系统,数据传送类指令(,29,条),数据传送是进行数据处理的最基本的操作,这类指令一般不影响标志寄存器,PSW,的状态。传送类指令可以分成两大类。,采用,MOV,操作符,称为一般传送指令;,采用非,MOV,操作符,称为特殊传送指令,如:,MOVC,、,MOVX,、,PU
12、SH,、,POP,、,XCH,、,XCHD,及,SWAP,。,编号,指令分类,指令,字节数,机器周期数,1,16,位传送,MOV DPTR,,,#data16,3,2,2,A,为目的,MOV,A,Rn,1,1,3,MOV,A,direct,2,1,4,MOV,A,Ri,1,1,5,MOV,A,#data,2,1,6,Rn,为目的,MOV,Rn,A,1,1,7,MOV,Rn,direct,2,2,8,MOV,Rn,#data,2,1,9,direct,为目的,MOV,direct,A,2,1,10,MOV,direct,Rn,2,2,11,MOV direct1,direct2,3,2,12,M
13、OV,direct,Ri,2,2,13,MOV,direct,#data,3,2,14,Ri,为目的,MOV,Ri,A,1,1,15,MOV,Ri,direct,2,2,16,MOV,Ri,#data,2,1,MOV,指令,用于把立即数、片内,RAM,和,SFR,中的数据传送到片内,RAM,和,SFR,中。,当目的操作数是,DPTR,时,源操作数只能是,16,位立即数。,当目的操作数是,A,,,Rn,,,direct,和,Ri,时,则源操作数可以是,A,,,Rn,,,direct,、,Ri,和,#data,中除了同类操作数(,Rn,和,Ri,算同类)外的任意一种(,direct,除外)。,编号
14、指令分类,指令,字节数,机器周期数,17,ROM,读,MOVC A A+DPTR,1,2,18,MOVC A A+PC,1,2,19,外,RAM,读,MOVX A,DPTR,1,2,20,MOVX,A,Ri,1,2,21,外,RAM,写,MOVX DPTR,A,1,2,22,MOVX,Ri,A,1,2,23,堆栈,PUSH direct,2,2,24,POP direct,2,2,25,交换,XCH,A,Rn,1,1,26,XCH,A,direct,2,1,27,XCH,A,Ri,1,1,28,半字节交换,XCHD,A,Ri,1,1,29,自交换,SWAP A,1,1,特殊传送指令,除堆栈指
15、令外都有,A,的参与。,MOVC,:依靠,DPTR,,,PC,和,A,作变址寻址从,ROM,读数据。,MOVX,:依靠,DPTR,和,Ri,对片外,RAM,进行数据读写。,XCH,实现,A,与,Rn,,,direct,、,Ri,之间的数据交换。,XCHD,实现,A,与,Ri,之间的数据低,4,位的交换。,SWAP,实现,A,自身高,4,位和低,4,位数据的交换。,PUSH,、,POP,完成对,direct,的压栈和弹出操作,栈底在低位地址,,SP,始终指向栈顶。,编号,指令分类,指令,字节数,机器周期数,30,不带进位加,ADD,A,Rn,1,1,31,ADD,A,direct,2,1,32,
16、ADD,A,Ri,1,1,33,ADD,A,#data,2,1,34,带进位加,ADDC,A,Rn,1,1,35,ADDC,A,direct,2,1,36,ADDC,A,Ri,1,1,37,ADDC,A,#data,2,1,二,.,算术运算类指令(,24,条),算术运算指令可以完成加、减、乘、除及加,1,和减,1,等运算。这类指令多数以,A,为源操作数之一,同时又使,A,为目的操作数。,编号,指令分类,指令,字节数,机器周期数,38,加,1,INC A,1,1,39,INC,Rn,1,1,40,INC direct,2,1,41,INC ,Ri,1,1,42,INC DPTR,1,2,43,十
17、进制调整,DA A,1,1,44,带借位减,SUBB,A,Rn,1,1,45,SUBB,A,direct,2,1,46,SUBB,A,Ri,1,1,47,SUBB,A,#data,2,1,48,减,1,DEC A,1,1,49,DEC,Rn,1,1,50,DEC direct,1,1,51,DEC ,Ri,1,1,52,乘法,MUL AB,;高位,B,低位,A,1,4,53,除法,DIV AB,;余数,B,商,A,1,4,标志,指令,ADD,ADDC,SUUB,DA,MUL,DIV,CY,AC,OV,P,进位(借位)标志,CY,为无符号整数的多字节加法、减法、移位等操作提供了方便;溢出标志,O
18、V,可方便地控制补码运算;辅助进位标志,AC,用于,BCD,码运算。算术运算操作将影响,PSW,中的,OV,、,CY,、,AC,和,P,等。,84H+8DH,。试分析运算过程及其对状态标志的影响。,无符号数:溢出,CY=1,;出错,有符号数,:,(-7CH)+(-72H),溢出,OV=1,;出错,ADD,ADDC,SUBB,指令中,,A,既是源操作数又是目的操作数,另一个源操作数是,Rn,direct,和,Ri,对,PSW,有影响。,INC,DEC,对,A,,,Rn,,,direct,和,Ri,加,1,或减,1,,对,P,有影响。,INC,对,DPTR,加,1,。,DA,对,BCD,码加法进行
19、十进制调整,结果仍为,BCD,码。,PSW,CY,AC,F0,RS1,RS0,OV,-,P,三,.,逻辑运算与循环类指令(,24,条),逻辑运算指令可以完成与(,ANL),、或,(ORL),、异或,(XRL),、清,0(CLR),和取反,(CPL),操作。,循环指令是对累加器,A,的循环移位操作,包括带与不带进位位的左、右方向移位,移位操作时,带进位的循环移位对,CY,和,P,标志有影响;,编号,指令分类,指令,字节数,机器周期数,54,逻辑与,ANL,direct,A,2,1,55,ANL,direct,#data,3,2,56,ANL A,,,Rn,1,1,57,ANL A,,,direc
20、t,2,1,58,ANL A,,,Ri,1,1,59,ANL A,,,#data,2,1,60,逻辑或,ORL,direct,A,2,1,61,ORL,direct,#data,3,2,62,ORL A,,,Rn,1,1,63,ORL A,,,direct,2,1,64,ORL A,,,Ri,1,1,65,ORL A,,,#data,2,1,编号,指令分类,指令,字节数,机器周期数,66,逻辑异或,XRL,direct,A,2,1,67,XRL direct,#data,3,2,68,XRL A,,,Rn,1,1,69,XRL A,,,direct,2,1,70,XRL A,,,Ri,1,1,
21、71,XRL A,,,#data,2,1,72,清零,取反,移位,CLR A,1,1,73,CPL A,1,1,74,RR A,1,1,75,RRC A,1,1,76,RL A,1,1,77,RLC A,1,1,ANL,ORL,XRL,当目的操作数为,direct,时,源操作数为,A,和,#data,。,ANL,ORL,XRL,当目的操作数位,A,时,源操作数为,Rn,direct,Ri,和,#data,,按位操作。对,P,有影响。,RR,,,RL,,对,P,标志有影响;,RRC,,,RLC,对,CY,和,P,标志有影响;,CLR,,,CPL,对,P,标志有影响。,四,.,控制转移类指令(,1
22、7,条),通常情况下,程序的执行是顺序进行的,但也可以根据需要改变程序的执行顺序,这种情况称作程序转移。,80C51,的转移指令有无条件转移、条件转移及子程序调用与返回等。,编号,指令分类,指令,字节数,机器周期数,78,无条件跳转,短转,AJMP adrr11,2,2,79,长转,LJMP addr16,3,2,80,相对,SJMP,rel,2,2,81,散转,JMP A+DPTR,1,2,82,条件转移,判,0,JZ,rel,2,2,83,JNZ,rel,2,2,84,比较不等,CJNE A,,,direct,,,rel,3,2,85,CJNE A,,,#data,,,rel,3,2,86
23、CJNE,Rn,,,#data,,,rel,3,2,87,CJNE,Ri,,,#data,,,rel,3,2,88,减,1,不为,0,DJNZ,Rn,rel,2,2,89,DJNZ,direct,rel,3,2,90,子程序,调用,ACALL addr11,2,2,91,LCALL addr16,3,2,92,返回,RET,1,2,93,中断返回,IRET,1,2,94,空操作,NOP,1,1,1,0000H,9,4000H,17,8000H,25,C000H,2,0800H,10,4800H,18,8800H,26,C800H,3,1000H,11,5000H,19,9000H,27,D0
24、00H,4,1800H,12,5800H,20,9800H,28,D800H,5,2000H,13,6000H,21,A000H,29,E000H,6,2800H,14,6800H,22,A800H,30,E800H,7,3000H,15,7000H,23,B000H,31,F000H,8,3800H,16,7800H,24,B800H,32,F800H,当前,PC,的高,5,位(即下条指令的存储地址的高,5,位)可以确定,32,个,2KB,段之一。所以,,AJMP,指令的转移范围为包含,AJMP,下条指令在内的,2KB,区间。,五,.,位操作类指令(,17,条),位操作又称布尔操作,它是以位
25、为单位进行的各种操作。位操作指令中的位地址有,4,种表示形式:,直接地址方式,(,如,0D5H),;,点操作符方式,(,如,0D0H.5,PSW.5,等);,位名称方式(如,,F0,);,伪指令定义方式(如,,MYFLAG BIT F0,)。,在位操作指令中,位,CY,要用字符“,C”,表示。,编号,指令分类,指令,字节数,机器周期数,95,位传送,MOV C,,,bit,2,2,96,MOV bit,,,C,2,1,97,位设置,清零,CLR C,1,1,98,CLR bit,2,1,99,SETB C,1,1,100,SETB bit,2,1,101,位逻辑,位与,ANL,C,bit,2,
26、2,102,ANL C,/bit,;先取反后运算,2,2,103,位或,ORL,C,bit,2,2,104,ORL C,/bit,;先取反后运算,2,2,105,取反,CPL C,1,1,106,CPL bit,2,1,107,位条件转移,判,CY,JC,rel,2,2,108,JNC,rel,2,2,109,判,bit,JB,bit,rel,3,2,110,JBC,bit,rel,;为,1,跳转且清零,3,2,111,JNB,bit,rel,3,2,助记符,目的操作数,源操作数,MOV,A,Rn,direct,Ri,#data,ADD,/,ADDC,SUBB,ANL,/,ORL,/,XRL,
27、XCH,INC,/,DEC,A,CLR,/,CLP,RR,/,RRC,RL,/,RLC,DA,/,SWAP,指令总结,助记符,目的操作数,源操作数,MOV,direct1,A,#data,ANL,ORL,XRL,MOV,direct1,Rn,direct2,Ri,MUL,/,DIV,AB,JZ,/,JNZ,rel,JC,/,JNC,SJMP,思考题与习题,2,3,4,10,12,15,17,1,、,80C51,系列单片机的指令系统有何特点?,2,、,80C51,单片机有哪几种寻址方式?各寻址方式所对应的寄存器或存储器空间如何?,3,、访问特殊功能寄存器,SFR,可以采用哪些寻址方式?,4,、访
28、问内部,RAM,单元可以采用哪些寻址方式?,5,、访问外部,RAM,单元可以采用哪些寻址方式?,6,、访问外部程序存储器可以采用哪些寻址方式?,7,、为什么说布尔处理功能是,80C51,单片机的重要特点?,8,、对于,80C52,单片机内部,RAM,还存在高,128,字节,应采用何种方式访问?,9,、试根据指令编码表写出下列指令的机器码。,(,1,),MOV A,,,#88H,(,2,),MOV R3,,,50H,(,3,),MOV P1.1,,,#55H,(,4,),ADD A,,,R1,(,5,),SETB 12H,10,、完成某种操作可以采用几条指令构成的指令序列实现,试写出完成以下每种
29、操作的指令序列。,(,1,)将,R0,的内容传送到,R1,;,(,2,)内部,RAM,单元,60H,的内容传送到寄存器,R2,;,(,3,)外部,RAM,单元,1000H,的内容传送到内部,RAM,单元,60H,;,(,4,)外部,RAM,单元,1000H,的内容传送到寄存器,R2,;,(,5,)外部,RAM,单元,1000H,的内容传送到外部,RAM,单元,2000H,。,11,、若(,R1,),=30H,,(,A,),=40H,,(,30H,),=60H,,(,40H,),=08H,。试分析执行下列程序段后上述各单元内容的变化。,MOV A,,,R1,MOV R1,,,40H,MOV 40
30、H,,,A,MOV R1,,,#7FH,12,、若(,A,),=E8H,,(,R0,),=40H,,(,R1,),=20H,,(,R4,),=3AH,,(,40H,),=2CH,,(,20,),=0FH,,试写出下列各指令独立执行后有关寄存器和存储单元的内容?若该指令影响标志位,试指出,CY,、,AC,、和,OV,的值。,(,1,),MOV A,,,R0,(,2,),ANL 40H,,,#0FH,(,3,),ADD A,,,R4,(,4,),SWAP A,(,5,),DEC R1,(,6,),XCHD A,,,R1,13,、若(,50H,),=40H,,试写出执行以下程序段后累加器,A,、寄存
31、器,R0,及内部,RAM,的,40H,、,41H,、,42H,单元中的内容各为多少?,MOV A,,,50H,MOV R0,,,A,MOV A,,,#00H,MOV R0,,,A,MOV A,,,3BH,MOV 41H,,,A,MOV 42H,,,41H,14,、试用位操作指令实现下列逻辑操作。要求不得改变未涉及的位的内容。,(,1,)使,ACC.0,置位;,(,2,)清除累加器高,4,位;,(,3,)清除,ACC.3,,,ACC.4,,,ACC.5,,,ACC.6,。,15,、试编写程序,将内部,RAM,的,20H,、,21H,、,22H,三个连续单元的内容依次存入,2FH,、,2EH,和,
32、2DH,单元。,16,、试编写程序,完成两个,16,位数的减法:,7F4DH,2B4EH,,结果存入内部,RAM,的,30H,和,31H,单元,,31H,单元存差的高,8,位,,30H,单元存差的低,8,位。,17,、试编写程序,将,R1,中的低,4,位数与,R2,中的高,4,位数合并成一个,8,位数,并将其存放在,R1,中。,18,、试编写程序,将内部,RAM,的,20H,、,21H,单元的两个无符号数相乘,结果存放在,R2,、,R3,中,,R2,中存放高,8,位,,R3,中存放低,8,位。,19,、若(,CY,),=1,,(,P1,),=10100011B,,(,P3,),=0110110
33、0B,。试指出执行下列程序段后,,CY,、,P1,口及,P3,口内容的变化情况。,MOV P1.3,,,C,MOV P1.4,,,C,MOV C,,,P1.6,MOV P3.6,,,C,MOV C,,,P1.0,MOV P3.4,,,C,20,、若单片机的主频为,12MHz,,试用循环转移指令编写延时,20ms,的延时子程序。并说明这种软件延时方式的优缺点。,10.5,汇编程序设计,任务分析,算法优化,流程图绘制,编程,调试,一,.,程序编制的步骤,1.,预完成任务的分析首先,要对单片机应用系统预完成的任务进行深入的分析,明确系统的设计任务、功能要求和技术指标。其次,要对系统的硬件资源和工作环
34、境进行分析。这是单片机应用系统程序设计的基础和条件。,2.,进行算法的优化,算法是解决具体问题的方法。应用系统可以利用严密的数学方法或数学模型来描述,从而把实际问题转化成由计算机进行处理的问题。同一个问题的算法可以有多种,结果也可能不尽相同,所以,应对各种算法进行分析比较,并进行合理的优化。比如,用迭代法解微分方程,需要考虑收敛速度的快慢(即在一定的时间里能否达到精度要求)。而有的问题则受内存容量的限制而对时间要求并不苛刻。对于后一种情况,速度不快但节省内存的算法则应是首选。,3.,程序总体设计及流程图绘制,经过任务分析、算法优化后,就可以进行程序的总体构思,确定程序的结构和数据形式,并考虑资
35、源的分配和参数的计算等。然后根据程序运行的过程,勾画出程序执行的逻辑顺序,用图形符号将总体设计思路及程序流向绘制在平面图上,从而使程序的结构关系直观明了,便于检查和修改。,清晰正确的流程图是编制正确无误的应用程序的基础和条件。所以,绘制一个好的流程图,是程序设计的一项重要内容。,总流程图,侧重反映程序的逻辑结构和各程序模块之间的相互关系。,局部流程图,反映程序模块的具体实施细节。对于简单的应用程序,可以不画流程图。但是当程序较为复杂时,绘制流程图是一个良好的编程习惯。,自然语言描述和汇编语言描述。,常用的流程图符号有:开始和结束符号、工作任务符号、判断分支符号、程序连接符号、程序流向符号等,4
36、编制程序的方法和技巧,采用模块化程序设计方法,应用系统的程序由包含多个模块的主程序和各种子程序组成。各程序模块都要完成一个明确的任务,实现某个具体的功能,如:发送、接收、延时、打印和显示等。,模块化的程序设计方法具有明显的优点。有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。,尽量采用循环结构和子程序,采用循环结构和子程序可以使程序的长度减少、占用内存空间减少。,通用的子程序,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内容应压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡;,中断处理子程序除了要保护程序
37、中用到的寄存器外,还应保护标志寄存器。,5.,汇编语言的语句格式,语句行由四个字段组成:,标号:,操作码,操作数,;注释,括号内的部分可以根据实际情况取舍。每个字段之间要用分隔符分隔,可以用作分隔符的符号有空格、冒号、逗号、分号等。,如:,LOOP,:,MOV A,,,#7FH,;,A7FH,标号,标号是语句地址的标志符号,用于引导对该语句的非顺序访问。,由,1,8,个,ASCII,字符组成。第一个字符必须是字母;,不能使用已经定义了的符号作为标号。,后边必须跟冒号。,操作码,操作码用于规定语句执行的操作。它是汇编语句中唯一不能空缺的部分。它由指令助记符表示。,操作数,操作数用于给指令的操作提
38、供数据或地址。操作数可能空缺、一项、两项或三项。各操作数间以逗号分隔。,工作寄存器名;,特殊功能寄存器名;,标号名;,常数;,符号“,$”,,表示程序计数器,PC,的当前值;,表达式。,注释,注释只是对语句的说明。注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。,对计算机而言,,“注释”是“看不见”的,。,注释字段必须以分号“;”开头,长度不限,当一行书写不下时,可以换行接着书写,但换行时应注意要在开头使用分号“;”。,数据的表示形式,二进制数,末尾以字母,B,标识。如:,1000 1111B,;,十进制数,末尾以字母,D,标识或将字母,D,省略。如:,88D,,,66,;,十六进制
39、数,末尾以字母,H,标识。如:,78H,,,0A8H,(但应注意的是,十六进制数以字母,A,F,开头时应在其前面加上数字“,0”,。);,ASCII,码,以单引号括起来标识。如:,AB,,,1245,二,.,源程序的编辑和汇编,1,.,源程序的编辑,源程序的编写要依据,80C51,汇编语言的基本规则,特别要用好常用的汇编命令(即伪指令):,ORG 0040H,MOV A,,,#7FH,MOV R1,,,#44H,END,这里的,ORG,和,END,是两条伪指令,其作用是告诉汇编程序此汇编源程序的起止位置。,编辑好的源程序应以“,.ASM,”,扩展名存盘,以备汇编程序调用。,2,源程序的汇编,将
40、汇编语言源程序转换为单片机能执行的机器码形式的目标程序的过程叫汇编。,手工汇编,;,机器汇编,:,在常用的个人计算机,PC,上,使用交叉汇编程序将汇编语言源程序转换为机器码形式的目标程序。生成的目标程序由,PC,机传送到开发机上,经调试无误后,再固化到单片机的程序存储器,ROM,中。,源程序经过机器汇编后,形成的若干文件中含有两个主要文件,一是列表文件,另一个是目标码文件。,列表文件:,地 址 目标码 汇编程序,ORG 0040H,0040H 747F MOV A,,,#7FH,0042H 79AA MOV R1,,,#0AAH,END,目标码文件:,首地址 末地址 目标码,0040H 004
41、4H 747F79AA,3.,伪指令,伪指令是汇编程序能够识别并对汇编过程进行某种控制的汇编命令。它不是单片机执行的指令,所以没有对应的可执行目标码,汇编后产生的目标程序中不会再出现伪指令。,起始地址设定伪指令,ORG,格式为:,ORG,表达式,该指令的功能是向汇编程序说明下面紧接的程序段或数据段存放的起始地址。,ORG 8000H,START,:,MOV A,,,#30H,此时规定该段程序的机器码从地址,8000H,单元开始存放。,在每一个汇编语言源程序的开始,都要设置一条,ORG,伪指令来指定该程序在存储器中存放的起始位置。若省略,ORG,伪指令,则该程序段从,0000H,单元开始存放。在
42、一个源程序中,可以多次使用,ORG,伪指令规定不同程序段或数据段存放的起始地址,但要求地址值由小到大依序排列,,不允许空间重叠,。,汇编结束伪指令,END,格式为:,END,该指令的功能是结束汇编。,汇编程序遇到,END,伪指令后即结束汇编。处于,END,之后的程序,汇编程序将不处理。,字节数据定义伪指令,DB,标号:,DB,字节数据表,功能是从标号指定的地址开始,在,ROM,中定义字节数据。该伪指令将字节数据表中的数据根据从左到右的顺序依次存放在指定的存储单元中。一个数据占一个存储单元。例如:,DB “How are you,?”,Fine,,,thanks,DB,2,,,4,,,6,,,8
43、10,,,18,字数据定义伪指令,DW,标号:,DW,字数据表,功能是从标号指定的地址单元开始,在程序存储器中定义字数据。,16,位的二进制数,高,8,位存放在低地址单元,低,8,位存放在高地址单元。例如:,ORG 1400H,DATA,:,DW 324AH,,,3CH,汇编后,,(1400H)=32H,(1401H)=4AH,,,(1402H)=00H,(1403H)=3CH,。,空间定义伪指令,DS,标号:,DS,表达式,功能是从标号指定的地址单元开始,在程序存储器中保留由表达式所指定的个数的存储单元作为备用的空间,并都填以零值。,例如:,ORG 3000H,BUF,:,DS 50,
44、汇编后,从地址,3000H,开始保留,50,个存储单元作为备用单元。,赋值伪指令,EQU,符号名,EQU,表达式,功能是将表达式的值或特定的某个汇编符号定义为一个指定的符号名。,LEN EQU 10,SUM EQU 21H,BLOCK EQU 22H,CLR A,MOV R7,,,LEN,MOV R0,,,BLOCK,LOOP,:,ADD A,,,R0,INC R0,DJNZ R7,,,LOOP,MOV SUM,,,A,END,位地址符号定义伪指令,BIT,格式为:,符号名,BIT,位地址表达式,功能是将位地址赋给指定的符号名。其中,位地址表达式可以是绝对地址,也可以是符号地址。,ST BIT
45、 P1.0,将,P1.0,的位地址赋给符号名,ST,,在其后的编程中就可以用,ST,来代替,P1.0,。,SETBST,定义数据存储器地址伪指令,DATA,格式:,标示符,DATA,数据存储器地址,BUF1 DATA 30H,MOVBUF1,#55H,MOVBUF1+1,#0AAH,三,.,基本程序结构,1.,顺序程序,顺序程序是指无分支、无循环结构的程序。其执行流程是依指令在存储器中的存放顺序进行的。,程序段,A,程序段,B,程序段,C,例,:,内部,RAM,的,2AH,2EH,单元中存储的数据如图所示。试编写程序实现图示的数据传送结果。,ACC,X5,2EH,X5,2EH,X4,2DH,X
46、4,2DH,X3,2CH,X3,2CH,X2,2BH,X2,2BH,X1,2AH,X1,2AH,00,方法一:,MOV A,,,2EH,;,2bytes,,,1Tm,MOV 2EH,,,2DH,;,3 bytes,,,2Tms,MOV 2DH,,,2CH,;,3 bytes,,,2Tms,MOV 2CH,,,2BH,;,3 bytes,,,2Tms,MOV 2BH,,,2AH,;,3 bytes,,,2Tms,MOV 2AH,,,#00H,;,3 bytes,,,2Tms,注意存储单元的先后顺序,有用的数据要保存着。,方法二,(,自己理解,),CLR A,;,1byte,1Tm,XCH A,,
47、2AH,;,2bytes,1Tm,XCH A,,,2BH,;,2bytes,1Tm,XCH A,,,2CH,;,2bytes,1Tm,XCH A,,,2DH,;,2bytes,1Tm,XCH A,,,2EH,;,2bytes,1Tm,把要搬移的数据暂存在,A,中。,50H,低,8,位,R0,51H,高,8,位,60H,低,8,位,R1,61H,高,8,位,例,:双字节无符号数加法。,设被加数存放在内部,RAM,的,51H,、,50H,单元,加数存放在内部,RAM,的,61H,、,60H,单元,相加的结果存放在内部,RAM,的,51H,、,50H,单元,进位存放在位寻址区的,00H,位中。,R
48、0=,一个加数低位地址,,R1=,另一加数低位地址,把,R0,指向的单元数据与,R1,指向的单元数据相加。结果放在,R0,指向的单元。,开始,结束,R0,,,R1,再指向高位地址,把,R0,指向的单元数据与,R1,指向的单元数据相加,(,考虑进位)。结果放在,R0,指向的单元,进位放在位地址,00,单元。,MOV R0,,,50H,;被加数的低字节地址,MOV R1,,,60H,;加数的低字节地址,MOV A,,,R0,;取被加数低字节,ADD A,,,R1,;加上加数低字节,MOV R0,,,A,;保存低字节相加结果,INC R0,;指向被加数高字节,INC R1,;指向加数高字节,MOV
49、A,,,R0,;取被加数高字节,ADDC A,,,R1,;加上加数高字节(带进位加),MOV R0,,,A,;存高字节相加结果,MOV 00H,,,C,;保存进位。,ORG 1000H,START:MOVDPTR,,,#2000H,MOV A,,,20H,MOVCA,,,A+DPTR,MOV 21H,,,A,SJMP$,ORG 2000H,TABLE:DB 00,,,01,,,04,,,09,,,16,,,25,END,例,有一变量存放在片内,RAM,的,20H,单元,其取值范围为:,00H,05H,。要求编制一段程序,根据变量值求其平方值,并存入片内,RAM,的,21H,单元。,开始,#20
50、00H,DPTR,(20H),A,(A+,DPTR),A,A,21H,结束,条件满足?,程序段,B,程序段,A,2.,分支程序,Y,N,分支结构可以分成单分支、双分支和多分支几种情况:,例,求双字节补码。,设在内部,RAM,的,addr1,和,addr1+1,单元存有一个双字节数(高位字节存于高地址单元)。编写程序将其读出取补后再存入,addr2,和,addr2+1,单元。,addr2+1,addr2,addr1+1,addr1,二进制数,无符号数,有符号数,(,补码,),原码,0000,0000,0,0,0,0111 1111,127,127,127,1000 0000,128,-128(,






