第3章 单片机的汇编语言与程序设计.ppt
,第3章 单片机的汇编语言与程序设计,3.2 指令系统简介,3.3 汇编语言的编程方法,3.1 汇编语言概述,3.1 汇编语言概述,汇编语言(Assembly Language)用助记(字)符代替操作码,用地址符号代替地址码的一种面向机器的程序设计语言; 汇编语言优点代码精炼、执行速度快,但不便于编写较复杂的程序; 汇编程序处理过程输入源程序检查语法正确性(如有语法错误,输出错误信息)翻译成二进制目标程序。,本章学习目标:,了解汇编语言的一般规则,借助指令手册能读懂汇编程序。,51系列单片机采用ASM-51指令格式,格式如下:,标号: 操作码 目的操作数,源操作数 ;注释,其中包含: 方括符 表示可选项 标号代表指令所在地址,1-8个字母/数字,“:”结尾 操作码就是指令功能助记符,指令实体 目的操作数 源操作数 注释,以“;”开头,一、 指令格式,二、常用符号,当前选中寄存器区的8个工作寄存器(R0R7),Rn,Ri,direct,- 8位内部RAM单元地址 00H7FH, 专用特殊功能寄存器SFR的地址80HFFH, 立即数(8位),#data,#data16, 立即数(16位),n=07,i=0、1,addr16, 16位目的地址,用于LCALL、LJMP指令 地址范围64KB ROM空间,addr11, 11位目的地址,用于ACALL、AJMP指令 地址范围2KB ROM空间,rel,DPTR, 数据地址指针,可做16位间址寄存器,bit, 内RAM或SFR中的直接位寻址,A, 累加器,B, 专用寄存器,用于MUL和DIV指令,C, 位累加器 ( PSW.7 ),进位/借位标志, 间址或基址寄存器前缀如 Ri , A+DPTR,/, 位操作的前缀,表示对该位操作数取反,(X), X中的内容,((X)), 由X寻址的单元中的内容,箭头左边的内容被箭头右边的内容所代替,DPTR , A+PC,用何种方式寻找指令的操作数 或指令的执行地址,1、立即寻址,寻址空间:,程序存储器,操作数紧跟操作码OP后面,存放在程序存储器中,立即寻址:,在 哪 里 ?,用何种方式寻找,指令的寻址方式:,指令的寻址方式:,三、 寻址方式,MOV A,# 30H,例1:,30H,MOV DPTR,# 8000H,例2:,80H,00H,2、直接寻址,寻址空间:,直接寻址,直接寻址是访问 SFR 的唯一方法,00H7FH 80HFFH,CPU内部,直接 间接,“与”,MOV A, 30H,例1:, ,ANL 30H,#30H,例2:, ,“结果”,3、寄存器寻址,寻址空间:,当前选定的寄存器内容就是实际操作数,MOV A,R3,例1:,ADD A,R3,例2:,寄存器寻址:,4、寄存器间接寻址,寻址空间:,寄存器间接寻址:,MOV R0,A,例1:,;累加器传送指令, ,MOVX A,DPTR,例2:, ,“读”,“读”,5、基址寄存器加变址寄存器间接寻址,基址寄存器加变址寄存器间接寻址:,以DPTR或PC作基址寄存器,A作变址寄存器 两者相加形成操作数地址。,寻址空间:,程序存储器(A+DPTR、A+PC),MOVC A,A+DPTR,例:,设(A)= 0FH (DPTR)= 2400H, ,“读”,“读”,MOVC A,A+DPTR,6、相对寻址,程序存储器,寻址空间:,相对寻址,以当前PC值为基准地址,加上指令的偏移量“rel”,结果为目标地址。rel为有符号补码数,范围:-128+127,JNZ rel,例:,; 累加器A不等零则转移 设:rel=23H,(PC)=2002H,rel=23H,修正后转移 目标地址D (PC) = 2025H,(PC) = 2 0 0 2 H,Rel = 2 3 H,),0,0,5,2,0,2,H,D =,(PC)=2112H,rel=F2H,修正后转移 目标地址 D (PC) = 2104H,例:DJNZ R7,rel ;(R7) 1不为“0”则转,(PC) = 2 1 1 2 H,Rel = F 2 H,),F,F,4,0,1,2,H,D =,7、位寻址,寻址空间:,片内RAM的20H2FH字节地址 位地址:00H7FH 共128位,SFR中11个能被8整除的字节地址 位地址请参看P26表 共83位,对内部RAM、SFR的位地址空间进行访问,称为位寻址。位地址用于布尔指令。,例: SETB D5H ;将F0位置1 CLR C ; Cy位清0,寻址方式与相应的寻址空间,小结:,课堂练习,已知R0=23H, (23H)=78H,写出下列指令分别执行后寄存器或存储器的结果。 MOV A, #60H MOV A, 23H MOV 23H, #0F0H MOV A, R0 MOV A, R0 MOV R0, #45H,3.2 指令系统简介,MCS-51系统指令系统共111条,按操作功能分类:, 数据传送类(29条), 算术运算类(24条), 逻辑运算类(24条), 控制转移类(17条), 布尔处理类(17条),指令学习要点,了解指令的操作 了解指令的寻址方式 了解指令对PSW的影响 合理使用指令,一、数据传送类(29条),用到的指令助记符有5种:,片内传送 MOV,片外传送 MOVX,查表传送 MOVC,累加器交换 XCH、XCHD、SWAP,堆栈操作 PUSH、POP,源操作数寻址方式(5种): 立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。 目的操作数寻址方式(3种): 直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,1、MOV类传送指令,格式: MOV 目的字节,源字节,功能:把源字节内容送目的字节,源字节内容不变,MOV A,#data,;立即数#data送累加器A,MOV Rn ,direct (n=07),;以direct为地址的单元的内容送寄存器Rn,MOV direct,Rn (n=07),;寄存器Rn内容送以direct为地址的单元,MOV Ri ,A (i=0、1),;累加器内容送以Ri内容为地址的单元,MOV类传送指令,MOV 片内传送指令,MOV类传送指令小结,MOV 片内传送指令,使用MOV指令的两点说明: 源字节与目的字节不同(direct除外) 寄存器寻址与寄存器间接寻址间不相互传送,2、MOVX类传送指令,累加器A与外部RAM传送数据用 MOVX, 外部RAM送累加器A,MOVX A,Ri (i=0、1),;以Ri内容为外部RAM地址的单元中的数送A, 累加器内容送外RAM,MOVX Ri ,A (i=0、1),;累加器内容送以Ri内容为地址的外部RAM单元, 外部RAM送累加器A,MOVX A,DPTR,;以DPTR内容为地址的外部RAM单元中的数送A, 累加器内容送外RAM,MOVX DPTR ,A,;累加器内容送以DPTR内容为地址的外部RAM单元,MOVX类传送指令小结,说明: 1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 在此我们可以看出内外部RAM的区别:内部RAM间可以直接进行数据的传递,而外部则不行。,2.要读或写外部的RAM,必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。,例:将片外RAM 120H单元的内容传送到片外RAM 地址为78H的单元。,MOV DPTR,#0120H,MOVX A,DPTR,MOV R0,#78H,MOVX R0,A,例:将片内RAM 12H单元的内容传送到片内RAM 地址为78H的单元。,MOV 78H,12H,;外部RAM送累加器A,;累加器内容送外RAM,MOV P2,#00H,3、MOVC类传送指令,MOVC类传送指令,均为基址加变址寄存器寻址:,MOVC A,A+DPTR, 以DPTR作基址加变址寻址,长查表指令,16位,MOVC A,A+PC, 以PC作基址加变址寻址,短查表指令,MOVC类传送指令小结,例:在外部ROM中存放09的平方值。根据累加器 A中的数( 09 ),查找对应的平方值。,用DPTR作基址寄存器 指向表格的首地址 用A作变址寄存器 实际上A中的值是表格中的 第几项,09H,;设(A)= 03H,查“3”的平方,用PC作基址寄存器,它并不指向表格首址,;是PC当前值与所查表格首址之间的距离 ;即(PC)+ #data TABBEL表格首址,设(A)= 03H,是表格中的第3项,;单字节指令,设指令在ROM中的地址为1FF0H,ADD A,#data,MOVC A,A+PC,000FH,;#data是变址调整值,TABBEL,4、 XCH、XCHD、SWAP类传送指令,5、 堆栈操作指令, 进栈指令,PUSH direct,;direct地址单元的内容压入SP指向的单元, 出栈指令,POP direct,;SP指向的单元内容弹出到以direct为地址的单元,练习,判断下列指令的对错。,MOV R1,R2,MOV A, R3,MOVX R1,B,MOVC A+DPTR,A,XCH 30H,40H,设在ROM 中地址为50H开始的区域建有0-5的共阴段码表 ORG 0050H SEG: DB 3FH,06H,5BH,4FH,66H,6DH 利用查表指令找到4的段码并输出到P2口。,练习,二、算术运算类(24条),用到的指令助记符有8种:,加法指令 ADD、ADDC、INC、DA,减法指令 SUBB,DEC,乘除指令 MUL,DIV,算术运算类指令执行结果影响标志位:CY、AC、OV,1、不带进位加ADD,ADD A,#data,2、带进位加ADDC,ADDC A,#data,试分析执行下面的指令后,程序状态字PSW中 CY,OV的内容是什么?,1,0,0,1,0,0,1,1,(C9H),双字节的加法运算,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。 然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H。,1067H+30A0H,0001 0000 0110 0111,0011 0000 1010 0000,0100 0001 0000 0111,1067H,30A0H,4107H,设:1067H存在R1R0中, 30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。,MOV A,R0 ADD A,R2 ;R0+R2A和CY MOV R4,A MOV A,R1 ADDC A,R3 ;R1+R3+CYA和CY MOV R5,A,思考?,3、增量INC,INC A,INC 指令中除 INC A 指令影响 P 标志位, 其余指令不影响任何标志位,4、十进制调整指令,DA A,;对累加器A,作BCD码加法后进行“过9补6”调整,注意:DA 指令不能对BCD码减法的结果进行调整,例 设(A)=37H;(R3)=36H,执行下面的程序:,0 0 1 1 0 1 1 1 (37H),0 0 1 1 0 1 1 0 (36H),(6DH),0 1 1 0 1 1 0 1,过“9”,0 0 0 0 0 1 1 0,0 1 1 1 0 0 1 1,补“6”,(73H),;(A) = 6DH,;(A) = 73H,1 1 0 1,ADD A,R3,DA A,DA A 只能跟在加法指令之后,5、减法指令SUBB,SUBB A,#data,说明:没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一次相减时),只要将CY清零(CLR C)即可。 对带符号数,要注意OV标志。OV=1,出错。,6、减量 DEC,7、MUL,MUL A B,例: A=4EH,B=5DH, 执行指令MUL AB后,乘积是1C56H, 所以在B中放的是1CH,而A中放的则是56H。,DIV A B,8、DIV,CY= 0,如:A=11H,B=04H,执行指令DIV AB后, 结果:A=04H,B=1。,试编写1234H-0FA3H的程序段,将结果高8位存入51H, 低8位存入50H单元。 MOV A,#34H SUBB A,#0A3H MOV 50H,A MOV A,#12H SUBB A,#0FH MOV 51H,A,CLR C,练 习,三、逻辑运算类(24条),用到的指令助记符有9种:,包括与、或、异或、清除、求反、移位等操作,ANL、ORL、XRL、 CLR、CPL、 RL、RLC、RR、RRC,1、逻辑与ANL(6条),2、逻辑或 ORL(6条),3、逻辑异或XRL(6条),例:根据累加器中40的状态修改P1端口位40的状态,ANL A,#00011111B,ANL P1,#11100000B,ORL P1,A,;A屏蔽前3位,保留后5位,;A的后5位是“1”, 使P1口 相应位置“1”,P1前3位不变,;P1屏蔽后5位,保留前3位,仅修改了 P1 口的后 5 位,练 习,请写出完成下列功能的指令: 1、P1口高四位输出高电平,低四位保持不变; 2、P1口低3位清零,其余位保持不变; 3、P1口高四位取反,低四位保持。,4、累加器清除与求反指令(2条), 累加器A清零,CLR A, 累加器A按位取反,CPL A,例: 给出下面程序分析执行结果,CLR A,CPL A,;(A)= 00H,;(A)= FFH,5、移位指令(4条), 累加器内容循环左移一位,RL A, 累加器内容连同进位标志循环左移一位,RLC A,CY, 累加器内容循环右移一位,RR A, 累加器内容连同进位标志循环右移一位,RRC A,CY,移位指令小结,累加器清除与求反指令小结,例:设(A)=5AH、CY=1,RL A,RLC A,RR A,RRC A,;(A)= B4H,;(A)= 2DH,;(A)= B5H,;(A)= ADH,01011010,01011010,0,1,0,1,0,0,四、控制转移指令(17条),控制转移指令共有17条:,无条件转移指令,条件转移指令,子程序的调用返回等,1、无条件转移指令(4条), 长转移,LJMP addr16, 短转移,AJMP addr11,转移范围 2KB,转移范围 64KB, 相对转移,SJMP rel,指令中的rel是8位带符号补码,范围-128+127。,例:分析指令 SJMP $,符号“$”指本指令执行前的PC值,指令SJMP $执行后,程序仍然转移回此指令继续执行,计算机于是不断的执行这一指令,进入等待状态。,原地踏步,原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。,则顺序执行,2、条件转移指令(8条), 累加器为零则转移,JZ rel,JNZ rel, 累加器不为零则转移,则转移,则顺序执行,则转移,例:分析下面程序 MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END,在执行上面这段程序前: 如果R0=0,结果R1=0FFH。 而如果R00,则结果是R1=00H。,请思考?, 累加器与立即数不等则转移,CJNE A,#data,rel, 寄存器与立即数不等则转移,CJNE Rn,#data,rel,顺序,转移,转移,顺序, 累加器与内RAM或SFR不等则转移,CJNE A,direct,rel, 内RAM与立即数不等则转移,CJNE Ri,#data,rel,顺序,转移,转移,顺序,例:分析下面程序,MOV A,30H CJNE A,40H,NOEQU SETB 7FH ;相等置位7FH SJMP FINISH NOEQU:JC SMALL MOV 50H,A MOV 51H,40H SJMP FINISH SMALL:MOV 50H,40H MOV 51H,A FINISH:SJMP $, 寄存器减“1”不等零则转移,DJNZ Rn,rel (n=07),DJNZ direct, rel, 内RAM或SFR减“1”不为零则转移,顺序,转移,转移,顺序,分析下面程序执行的结果,MOV 23H, #0AH CLR A LOOP: ADD A, 23H DJNZ 23H, LOOP SJMP $ 上述程序段的执行过程是: 将23H单元中的数连续相加,存至A中,每加一次, 23H单元中的数值减1,直至减到0,共加(23H)次。,练习,请思考?,条件转移类指令小结,3、子程序调用及返回指令(4条), 长调用,LCALL addr16,;在调用子程序之前,保护断点地址,转向子程序, 短调用,ACALL addr11,; 在调用子程序之前,保护断点地址,转向子程序,对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。, 子程序返回,RET, 中断返回,RETI,“0”触发器,优先级状态,4、空操作,NOP,停一个周期,一般用作短时间的延时。,子程序调用及返回指令小结,延时子程序,例:50ms延时程序。,若晶振频率为12MHz,则一个机器周期为1us。执行一条DJNZ指令需要2个机器周期,即2us。采用循环计数法实现延时。,DELAY:MOVR7, #200; 1us DEL1: MOV R6, #123; 1us NOP; 1us DEL2: DJNZ R6, DEL2; 2us, 计(2123)us DJNZ R7, DEL1 ; 2us,计(2123+1+1+2) 200+1us=50.001ms RET,练习,如何实现1S的延时程序?,五、位操作指令(17条),;(R0)=200,;P1.7变反(1 s ),;P1.7为低电平,;(1 s ),;(1 s ),;(R0)0 则转 (2s),1s,1s,1s,2s,10s,例:分析下面程序,P1.7,100个脉冲 ,例,P3.2和P3.3上各接有一只按键,要求它们分别按下时 (P3.2=0或P3.3=0),分别使P1口为0或FFH。,START:MOV P3,#0FFH L1: JNB P3.2,L2 JNB P3.3,L3 ; P3.2=1, P3.3=1,等待 LJMP L1 L2: MOV P1,#00H ; P3.2=0,使P1口全为“0” LJMP L1 L3: MOV P1,#0FFH ;P3.3=0,使P1口全为“1” LJMP L1,P56 第8题,练习,1、 ORG ORG XXXXH 指明下面源程序或数据块的起始地址。 2、 END END ;指明源程序结束。 3、EQU 标识符 EQU 参数 将参数的值赋给标识符,参数可以是数据、标号、标识符等。语句前的标识符不能省。,六、伪指令,4、DB 标号: DB XXH 字节定义,表示标号单元中的内容为XXH。 例: DB “How are you?” DB -2,-4,8,18 DB 0C0H, 90H,83H,0FAH,5、DW 标号: DW XXXXH 字定义,表示标号单元中的内容为XXXXH。 例:,ORG 1400H DATA1:DW 324AH,3CH,32H,4AH,00H,3CH,1400H,1401H,1402H,1403H,6、BIT 标识符 BIT 位地址表达式 位地址符号定义,表示将位地址赋给指定的符号名。 例:,STBITP1.0,7、DATA 符号名 DATA 表达式 将数据地址或代码赋与规定的字符名称。 例:TEMPDATA 50H,汇编程序示例,COUNT EQU 30H BUTTONBITP3.7 ORG0000H START:MOVCOUNT,#00H NEXT:MOVA, COUNT MOVB,#10 DIVAB MOVDPTR,#TABLE MOVC A,A+DPTR JBBUTTON, $ JNBBUTTON, $ INCCOUNT MOVA,COUNT CJNEA,#100,NEXT LJMPSTART TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END,3.3 汇编语言的编程方法,汇编语言程序的开发过程,用汇编语言进行程序设计的过程和用高级语言进行程序设计的过程类似,一般需要经过以下几个步骤:,确定编程思路,画程序流程 图,编写汇编程序,程序编译调试,本章小结,51 单片机汇编语言指令最多包含四个区段,其一般格式为: 标号: 操作码 操作数 ;注释; 51单片机汇编语言具有直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址和相对寻址等七种寻址方式。 51单片机的指令系统分为数据传送与交换指令、算术运算指令、逻辑运算指令、控制转移指令、位操作指令五大类型,共111条; 伪指令属于说明性语句,用于对汇编过程提供必要辅助信息,汇编后不会产生机器码。,本章结束!,Thank you very much!,