1、1,3.1 指令系统简介,本章分为五节,主要介绍:,3.2 寻址方式,3.3 指令系统,3.4 汇编语言程序设计,3.5 设计实例,2,3.1 指令系统简介,3.1.1 机器语言和汇编语言,机器语言:0或1等组合而成的二进制编码。 缺点:人不容易记住! 汇编语言:用英文单词及其缩写表示机器语言的、有利于记忆的符号,实际上是符号化的机器语言。例如:INC A,该指令的二进制编码(机器语言)为:0000 0100B 汇编:把用汇编语言写的源程序翻译成机器语言的过程,称为汇编。,3,指令系统:所有的指令的集合。MCS-51系列单片机指令系统共有111条指令。(1)指令的分类标准之一:按照所占存储空间
2、大小分类: 单字节指令、双字节指令、三字节指令。 (2)指令的分类标准之二:按照执行时耗费时间长短分类:单周期、双周期、四周期等。 (3)其他分类方法:功能,操作数数量等 了解上述分类方法,3.1 指令系统简介,4,3.1.2 指令的格式,一般格式为:操作助记符 目的操作数,源操作数;注释,关于“ ”符号:指令的一般格式中使用了可选择符号“ ”,包含的内容因指令的不同可以有或无。,5,3.1.3 符号说明(暂时了解),Rn(n=07)-当前选中的工作寄存器组中的寄存器R0R7之一; Ri(i=0,1)-当前选中的工作寄存器组中的寄存器R0或R1; -间址寄存器前缀; #data -8位立即数;
3、 #data16-16位立即数; direct-片内低128个RAM单元地址及SFR地址(可用符号名称表示);,6,addr11-11位目的地址; addr16-16位目的地址; rel-补码形式表示的8位地址偏移量,值在128127范围内; bit-片内RAM位地址、SFR的位地址(可用符号名称表示); /-位操作数的取反操作前缀; ()- 表示 地址单元或寄存器中的内容 ; -将箭头右边的内容送入箭头左边的单元中。,3.1.3 符号说明(暂时了解,结合后边指令逐步掌握),7,3.2 寻址方式,寻址:是寻找操作数或指令的地址的方式。,寻址方式:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址、
4、基址寄存器加变址寄存器变址寻址、相对寻址和位寻址。,若不特别声明,我们后面提到的寻址方式均指源操作数的寻址方式。,指令格式:操作助记符 目的操作数,源操作数,8,操作数存放在寄存器中,指令中直接给出该寄存器名称的寻址方式。,如:MOV A,R0 ;A-(R0) 注意括号的含义,寻址空间(寄存器可以)是:R0R7;A;B(以AB寄存器对形式出现);DPTR。,3.2 寻址方式-寄存器寻址,特点:较高的传送和运算速度。,9,指令操作码之后的字节存放的是操作数的地址,操作数本身存放在该地址指示的存储单元中的寻址方式称为直接寻址。,如: MOV A,50H ;A-(50H),直接寻址中的SFR经常采用
5、符号形式表示。寻址空间为:片内RAM低128字节;SFR。,3.2 寻址方式-直接寻址,10,2019/6/21,10,3.2.3 寄存器间接寻址,寄存器中的内容是操作数的地址 寻址空间: 片内RAM(Ri) 片外RAM(Ri、DPTR),【例】若(R0)=30H,(30H)=5AH,执行MOV A,R0后,(A)=5AH,片内:MOV(暂时了解) 片外:MOVX,3.2 寻址方式-寄存器间接寻址,11,2019/6/21,11,操作数在指令编码中 寻址空间:ROM,对于MOV DPTR,#2100H指令,立即数高8位“21H”装入DPH 00装入DPL,【例】执行MOV A,#50H,结果:
6、(A)=50H,3.2 寻址方式-立即寻址,12,2019/6/21,12,操作数地址:基地址+偏移量 寻址空间: ROM,变址寻址还用于跳转指令,如JMP A+DPTR,【例】(A)0FH,(DPTR)=2400H,执行MOVC A,A+DPTR”后,结果:(A)=88H,3.2 寻址方式-变址寻址,13,将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数(128127 ).,3.2 寻址方式-相对寻址,常用于跳转指令。如: JC 23H若C=0,不跳转;
7、 C=1,跳转. 执行过程如下,14,JC 23H 执行过程,1025H,23H,1002H,指令代码,当前PC,3.2 寻址方式-相对寻址,上述的用法实际很少,了解一下就可以。更多的时候使用标号,比如:JZ lOOP(暂时先了解),15,寻址位数据(实质属于位的直接寻址)。寻址空间为:片内RAM的20H2FH单元中的128可寻址位;SFR的可寻址位。,习惯:特殊功能寄存器的寻址位常用符号位地址表示。如: CLR ACC.0 MOV 30H,C,3.2 寻址方式-位寻址,16,本节总结,寻址:查找源操作数的方法,注意:重点明白指令的含义,而不是单纯的去区分寻址方式!,17,3.3 指令系统,助
8、记符:MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 除了目的操作数为ACC的指令影响偶校验标志P外,一般不影响 标志位。 当A中为偶数个1时,p=0;当A中为奇数个1时,p=1;凑成偶数个1 关于偶校验了解即可,3.3.1 数据传送类指令(29条),18,MOV DPTR,#data1651是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两
9、条指令: MOV DPH,#35HMOV DPL,#12H则就相当于执行了 MOV DPTR,#3512H,3.3.1数据传送类指令-十六位数的传递指令,19,MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A 说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有 需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部 RAM中的数据也必需通过A读入。2、外部RAM的数据不能够直接传输。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单
10、元中去。但内部RAM间可以直接进行数据的传递。,3.3.1数据传送类指令-累加器A与片外RAM之间的 数据传递类指令,20,2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供(暂时了解)。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,DPTRMOV DPTR,#0200HMOVX DPTR,A,3.3.1数
11、据传送类指令-累加器A与片外RAM之间的 数据传递类指令,21,MOVC A,A+DPTRMOVC A,A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格(暂时了解,后续学习) 说明:查找到的结果被放在A中,,上述两条指令的区别以及应用在后续课程中学习,此处先掌握指令的功能,3.3.1数据传送类指令-读程序存储器指令,注意(暂时了解)(1)A中存放8位无符号数,即表格的变化范围为256;(2)PC的内容为当前值,即MOVC A,A+PC指令下边一个单元的地址,22,PUSH direct ;SPSP+1,(SP)(direct)POP
12、direct ; (direct) (SP), SPSP-1 第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为 弹出指令,就是将堆栈中的内容送回到direct中。例: MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B执行PUSH ACC过程:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,结果,(60H)=100,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,(61H)=20。 注意:堆栈指针sp一直指向栈顶,3.3.1数据传送类指令-堆栈操作指令,23,2019/6
13、/21,23,字节交换指令XCH,数据交换属于同时进行的双向传送,【例】若(R0)=80H,(A)=20H。执行指令 XCH A,R0 后, (A)=80H,(R0)=20H。,3.3.1数据传送类指令-数据交换指令,24,2019/6/21,24,半字节交换指令XCHD,【例】若(R0)30H,(30H)67H, (A)20H。执行指令XCHD A,R0 指令后,(A)27H,(30H)60H。,XCHD是间址操作数的低半字节与A的低半字节互换。 SWAP是累加器的高低4位互换,【例】若(A)30H,执行指令SWAP A后,(A)03H 。,3.3.1数据传送类指令-数据交换指令,25,主要
14、对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令,影响PSW有关位。,3.3.2算数运算类指令-24条,26,ADD A,#data ;(A)(A)+#dataADD A,direct ;(A)(A)+(direct)ADD A,Ri ;(A)(A)+(Ri)ADD A,Rn ;(A)(A)+(Rn)上述指令,把源字节变量(立即数,直接、间接地址单元,工作寄存器内容)与累加器相加,结果保存在累加器中,影响标志AC、CY、OV、P。 例 执行指令: MOV A,#0C3HADD A,#0AAH运算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH
15、注意: 1:OV溢出标志取决于带符号数运算时。OV=1表示两正数相加,和变成负数,或两负数相加,和变成正数的错误结果。 2:进行无符号数运算时,要看Cy位(最高位有进位或借位),3.3.2算数运算类指令-不带进位位加法指令,27,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H-引出带进位位的加法指令。,1067H+30A0H,0001 0000 0110 0111,0011 0000 1010 0000,0
16、100 0001 0000 0111,1067H,30A0H,4107H,带进位位的加法实例,28,ADDC A,Rn ; ARnCYAADDC A,direct ; A(direct )CYAADDC A,Ri ; A(Ri)CYAADDC A,#data ; AdataCYA 用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。 说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可
17、以达到065535。,3.3.2算数运算类指令-带进位位加法指令,29,设: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,带进位位的加法指令实例,30,在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。,; A=23H,按十进制规律加,DA A,3.3.2算数运算类指令-十进制调整指令,例:A=0001 0101B
18、CD(代表十进制数15)执行 ADD A,#08后,A=1DH,按二进制规律执行BCD数加后,得到非法的BCD数,31,SUBB A,#data ;(A)(A)- #data -(C) SUBB A,direct ;(A)(A)-(direct)-(C) SUBB A,Ri ;(A)(A)-(Ri)-(C) SUBB A,Rn ;(A)(A)-(Rn)-(C)由于减法只有带借位减一条指令,所以在单字节相减时,须先清借位位,以免相减后结果出错。,例1 设累加器内容为D9H,R0内容为87H,求两者相减结果。CLR CSUBB A,R0执行后(A)=52H,CY=0,OV=0若运算两数为无符号数,
19、则其溢出与否和“OV”状态无关而靠CY是否有借位予以判别,OV仅表明带符号数运算时是否溢出。,3.3.2算数运算类指令-带借位减指令,32,乘法指令MUL A B该指令把累加器A 和寄存器B中的8位无符号整数相乘,16位乘积的低字节在累加器A中,高字节在寄存器B中,如果乘积大于255(0FFH),则溢出标志位置1,否则清0,运算结果总使进位标志CY清0。例1 设(A)=80H(128),(B)=32H(50),执行指令:MUL A B执行结果:乘积为1900H(6400),(A)=00H,(B)=19H,OV=1,CY=0,3.3.2算数运算类指令-乘除法指令,33,除法指令DIV AB该指令
20、把累加器A中的8位无符号整数除以寄存器B中8位无符号整数,所得商放在累加器A中,余数存在寄存器B中,标志位CY和OV均清0。若除数(B中内容)为00H,则执行后结果为不定值,并置位溢出标志OV,在任何情况下进位标志CY总清0。例 设累加器内容为135(87H),B寄存器内容为12(0CH),则执行命令:DIV AB ;将使(A)=0BH,(B)=03H,OV=0,CY=0,3.3.2算数运算类指令-乘除法指令,34,增1指令INC A ;(A) (A)+1INC direct ;(direct) (direct)+1INC Ri ;(Ri) (Ri)+1INC Rn ;(Rn) (Rn)+1I
21、NC DPTR ;(DPTR) ( DPTR)+1INC指令把所指出的变量加1,结果仍送回原地址单元,原来若为0FFH,加1后将变成00H,运算结果不影响任何标志位。,3.3.2算数运算类指令-增1、减1指令,35,例1 设(R0)=7EH,内部数据RAM中(7EH)=0FFH,(7FH)=40H,则执行下列指令:INC R0 ;(7EH) 00HINC R0 ;(R0) 7FHINC R0 ;(7FH) 41H 执行结果:(R0)=7FH,(7EH)=00H,(7FH)=41H例2 执行指令序列:MOV DPTR,#1FFEH ;(DPTR) 1FFEHINC DPTR ;(DPTR) 1F
22、FFHINC DPTR ;(DPTR) 2000HINC DPTR ;(DPTR) 2001H将使(DPTR)=2001H,3.3.2算数运算类指令-增1、减1指令,增1指令实例,36,减1指令 DEC A ;(A) (A)1DEC direct ;(direct) (direct)1DEC Ri ;(Ri) (Ri)1DEC Rn ;(Rn) (Rn)1上述指令将指定变量减1,结果仍存在原指定单元,原指定单元内容若为00H,减1操作后变成0FFH,不影响任何标志位。 例 执行下述程序:MOV R1,#7FH ;(R1) #7FHMOV 7EH,#00H ;(7EH) #00HMOV 7FH,
23、#40H ;(7FH) #40HDEC R1 ;(7FH) 3FHDEC R1 ;(R1) 7EHDEC R1 ;(7EH) 0FFH 结果: (R1)7EH,(7EH)0FFH,(7FH)3FH,3.3.2算数运算类指令-增1、减1指令,37,3.3.3逻辑运算类指令(24条),功能:对2个操作数按位进行逻辑操作,结果送到 A或直接寻址单元。主要操作与、或、异或、移位、取反、清零等。对标志位的影响除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,38,ORL A,Rn ;ARnA ORL A,direct ;A(direct)A ORL A,Ri ;A(Ri)A ORL A,
24、#data ;AdataA ORL direct,A ;(direct)A(direct) ORL direct,#data ;(direct)data(direct),例:71H和56H相或:01110001 (71H) ) 01010110 (56H),01110111 即77H,3.3.3逻辑运算类指令-逻辑或指令,39,ANL A,Rn ;ARnA ANL A,direct ;A(direct)A ANL A,Ri ;A(Ri)A ANL A,#data ;AdataA ANL direct,A ;(direct)A(direct) ANL direct,#data ;(direct)
25、data(direct),例:71H和56H相与:01110001 (71H) )01010110 (56H),01010000 即50H,3.3.3逻辑运算类指令-逻辑与指令,40,例:71H和56H相异或:01110001 (71H) ) 01010110 (56H),XRL A,Rn ;A RnA XRL A,direct ;A (direct)A XRL A,Ri ;A (Ri)A XRL A,#data ;A dataA XRL direct,A ;(direct) A(direct) XRL direct,#data ;(direct) data(direct),00100111
26、即27H,3.3.3逻辑运算类指令-逻辑异或指令,41,1. 累加器A清0 指令: CLR A ;(A)0 功能:把00H送入累加器A中 2. 累加器A求反 指令: CPL A;(A)() 功能:把累加器内容求反后送入累加器A中。 例 设累加器原来内容为07H,则执行 CLR A 后将变成00H,再执行 CPL A后将变为0FFH。,3.3.3逻辑运算类指令-清零和取反,42,RL A RR A RLC A RRC A,RLC A 和RRC A 指令,影响P标志和CY。,3.3.3逻辑运算类指令-循环移位指令,43,当最高位为0时,左移一位相当于乘2。 例 MOV A ,#01H ;01H送累
27、加器ARL A ;02H送ARL A ;04H送ARL A ;08H送A 当最低位为0时,右移一位相当于除2,上述累加器(A)=08H,执行指令:RR A ;(A)04HRR A ;(A)02HRR A ;(A)01H将使累加器内容又变为1。,3.3.3逻辑运算类指令-循环移位指令,44,3.3.4 程序转移指令-无条件转移指令,1无条件转移指令 作用:控制程序计数器从现行值转移到目标地址,该目标地址可通过直接,间接或相对寻址得到。(1) 长转移指令LJMP addr16 ;(PC)addr16指令提供16位目标地址,将指令中第二,第三字节地址码分别装入PC的高8位和低8位中,程序无条件转向指
28、定的目标地址去执行。不影响标志位。由于直接提供16位目标地址,所以执行这条指令可以使程序从当前地址转移到64K程序存储器地址空间的任何单元。 经常使用的格式:LJMP 标识符.标识符:例 在程序存储器0000H单元存放一条指令LJMP 2030H 则上电复位后程序将跳到2030H单元去执行,45,(2)短转移指令- 转移的目标地址不能够超出2K。如果超过了2K范围,汇编程序会提示出错信息。本指令不影响标志位(了解这个过程和2K的含义)。 经常使用的格式:AJMP 标识符、. 标识符:,AJMP addr11 ;PC (PC)+ 2,PC100 addr11,3.3.4 程序转移指令-无条件转移
29、指令,46,(3) 相对短转移指令 SJMP rel ;(PC)(PC)2;(PC)(PC)rel其中,rel为相对偏移量,是一个8位带符号的数。 经常使用的格式:sjmp 标识符.标识符: 如果程序中使用:HARE: SJMP HARE 将会造成单指令的无限循环。sjmp $,3.3.4 程序转移指令-无条件转移指令,47,“标号”(插入的内容)标号: 操作码 操作数 ;注释,如:LJMP LOOP.LOOP:MOV A,# 7FH ;A7FH,标号是语句地址的标志符号,有关标号的规定为:,由18个ASCII字符组成。第一个字符必须是字母,其余字符可以是字母、数字或其他特定字符;不能使用已经
30、定义了的符号作为标号。如指令助记符、寄存器符号名称等; 后边必须跟冒号。,48,(4) 间接转移指令(散转) JMP A+DPTR ; (PC)(A)+(DPTR)过程:把A里的8位无符号数与作为基址寄存器DPTR中的16位数据相加,所得的值装入PC做为转移的目标地址。不影响任何标志。特点:其转移地址不是汇编或编程时确定的,而是在程序运行时动态决定的,这是和前三条指令的主要区别,3.3.4 程序转移指令-无条件转移指令,49,该类指令执行满足某种特定条件的转移,其目标地址在以下一条指令的起始地址为中心的256字节范围中(-128到127)(了解)。(1)累加器判零转移指令JZ rel ; 累加
31、器为0转移JNZ rel ; 累加器不为0转移经常使用的格式:JZ 标识符.标识符:该指令不改变累加器内容,不影响标志位 。(例子见下页),3.3.4 程序转移指令-条件转移指令,50,例执行程序:MOV A,#01H ; 01送累加器AJZ BRAN1 ; A非零不转,继续执行DEC A ; A减1内容为0JZ BRAN2 ; A为0转BRAN2执行BRAN1:BRAN2:或执行:CLR A ; A清0JNZ BRAN1 ; A为0继续执行INC A ; A内容加1JNZ BRAN2 ; A内容非零转BRAN2执行BRAN1:BRAN2:程序都转移到BRAN2去执行。,3.3.4 程序转移指
32、令-条件转移指令,51,CJNE(目的字节),(源字节),rel;比较不等跳 功能:比较两个操作数的大小,如不相等则转移,相等则继续执行。如果目的字节的无符号整数值小于源字节的无符号整数值,则置位进位标志,否则清0进位位,指令不影响任何一个操作数。(了解rel的使用)经常使用的格式:CJNE (目的字节),标识符.标识符:,具体的比较转移指令有4条(p65):CJNE A,#data,relCJNE A,direct,relCJNE Ri,#data,rel CJNE Rn,#data,rel,3.3.4 程序转移指令-条件转移指令,52,DJNZ (字节),rel 减一非零跳功能:把第一操作
33、数字节变量减1,结果送回到第一操作数中,并判字节变量是否为0,不为0转移,否则顺序执行。如果字节变量值原为00H,则下溢得0FFH,不影响任何标志(了解rel形式)。常用共有两条指令构成循环。DJNZ direct,标识符DJNZ Rn,标识符 . 标识符:.,3.3.4 程序转移指令-条件转移指令,53,例 软件延时。DJNZ指令执行时间为2个机器周期,这样循环一次可产生2个机器周期延时。下例在程序段中插入2条指令,当主频12MHz,循环次数为24时,可产生49us的软件延时循环,在P1.7引脚上输出一个约50us的脉冲。CLR P1.7 ; P1.7输出变低电平MOV R2,#18H ;
34、赋循环初值 HARE : DJNZ R2,HARE ;(R2)(R2)1,不为零继续循环SETB P1.7 ; P1.7输出高电平,3.3.4 程序转移指令-条件转移指令,54,3.3.5 子程序调用和返回指令,子程序调用的必要性:减少重复代码; 子程序调用要注意的问题: 1、保护断点:断点:下一条将要执行的指令的地址,通常压入堆栈 2、建立子程序入口; 3、保护现场:保护部分寄存器单元的内容,通常压入堆栈,55,1长调用指令LCALL addr16 ;PC-(PC)+3,SP-(SP)+1,(SP)-(PC7-0) SP-(SP)+1,(SP)-(PC15-8)PC-addr16; 功能:调
35、用64K范围内所指定的子程序,执行过程(了解):(1)首先得到下一条指令的地址(断点地址);由于为三字节指令,所以执行时首先(PC)+3(PC)(2)把PC内容压入堆栈作为返回地址,(3)目标地址addr16装入PC,转去执行子程序。 经常使用的形式:LCALL 标识符ORG XXXXH标识符:.,3.3.5 子程序调用和返回指令,56,2绝对调用指令ACALL addr11: PC-(PC)+2,SP-(SP)+1,(SP)-(PC7-0) SP-(SP)+1,(SP)-(PC15-8)PC100-addr11; 该指令提供11位目标地址,限在2K地址内调用。 执行过程(了解): (1)获得
36、断点地址:由于是双字节指令,(PC)2 (PC)以获得下一条指令的地址;(2)把断点地址压入堆栈作为返回地址,(3)目标地址addr11装入PC,转去执行子程序,3.3.5 子程序调用和返回指令,经常使用的形式:ACALL 标识符ORG XXXXH标识符:.,57,3返回指令,执行该指令时,分别从栈中弹出调用子程序时压入的返回地址,使程序从调用指令(LCALL或ACALL)的下面相邻指令开始继续执行程序。例设(SP)=55H,RAM中(54H)=03H,(55H)=20H,则执行RET后,使(SP)=53H,(PC)=2003H,程序由2003H开始继续执行。,4中断返回指令RETI ;该指令
37、用于中断服务子程序的返回,其执行过程类似于RET,详见中断一章介绍。,3.3.5 子程序调用和返回指令,58,LCALL和ACALL指令与LJMP和AJMP区别: LCALL和ACALL在转移前,要把执行完该指令后PC的内容自动压入堆栈,才做addr16(或addr11)PC的工作,这样设计是为了便于当子程序执行完后,CPU可以找到(返回)原出发点处。RET指令是子程序返回指令,执行时,从堆栈中把原出发地址弹回PC,让CPU返回执行原主程序。,3.3.5 子程序调用和返回指令,59,操作: (PC)(PC)1执行本指令除了PC加1外,机器不作任何操作,而转向下一条指令去执行。不影响任何寄存器和
38、标志。由于为单周期指令,所以时间上只有一个机器周期,常用于精确延时或等待。例 利用NOP指令产生方波。LOOP: CLR P2.7 ;P2.7清0输出NOP ;NOP ;空操作NOP ;NOP ;SETB P2.7 ;置位P2.7高电平NOP ;NOP ;空操作NOP ;NOP ;LJMP LOOP,3.3.6 空操作指令-NOP,60,3.3.7 位操作指令( 17条),MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。 在MCS-51 中可以进行位操作的RAM区: 内部RAM的20H-2FH这16个字节单
39、元,即128个位单元(位地址空间位007FH); 可以位寻址的特殊功能寄存器,61,以PSW中位4( RS1 )为例。 直接(位)地址方式:如 D4H; 点操作符号方式:如 PSW.4,D0H.4; 位名称方式:如 RS1; 用户定义名方式:如用伪指令 bitSUB.REG bit RS1 定义后,可用SUB.REG代替RS1。,位地址表达方式,3.3.7 位操作指令,62,3.3.7 位操作指令-位传送指令(2条),MOV C,bit ;bit C MOV bit,C ;C bit 这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。 例:MOV C,P1.0 ;将P1.0的状态
40、送给C。 MOV P1.0,C ;将C中的状态送到P1.0 ;引脚上去。,63,位清0指令 CLR C ;使CY=0CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使P1.0变为0位置1指令 SETB C ;使CY=1SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P.0变为1,3.3.7 位操作指令-位清0和置位,64,位与指令 ANL C,bit ;Cy与指定位的值相与,结果送Cy ANL C,/bit ;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回Cy。但注意:指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0,3.3.7
41、 位操作指令-位逻辑运算指令,65,位取反指令 CPL C ;使Cy值取反。 CPL bit ;使指定的位的值取反。 例:CPL P1.0,位或指令 ORL C,bit ORL C,/bit,3.3.7 位操作指令-位逻辑运算指令,66,位复位指令 CLR C ;使Cy值取反。 CLR bit ;使指定的位的值取反。 例:CLR P1.0,位置位指令 SETB C SETB bit,3.3.7 位操作指令-位置位和复位指令,67,判Cy转移指令 JC relJNC rel第一条指令的功能是如果Cy=1就转移,否则就顺序执行。第二条指令则和第一条指令相反,即如果Cy=0就转移,否则就顺序执行。经常使用的形式:JC 标号(或JNC 标号)ORG XXXXH标号:,3.3.7 位操作指令-位条件转移指令,68,判位变量转移指令 JB bit,rel JNB bit,rel JBC bit,rel 第一条指令:如果指定的(bit)=1,则转移,否则顺序执行,第二条指令功能相反。 第三条指令是如果指定的(bit)=1,则转移,并把该位清0,否则顺序执行。,3.3.7 位操作指令-位条件转移指令,经常使用的形式:JB 标号(或JNB 标号)ORG XXXXH标号:,