1、3.1 概述概述7 7种寻址方式,种寻址方式,111111条指令条指令字节数字节数运算速度运算速度单字节指令:单字节指令:4949条条双字节指令:双字节指令:4545条条三字节指令:三字节指令:1717条条单周期指令:单周期指令:6464条条双周期指令:双周期指令:4545条条四周期指令:四周期指令:2 2 条条第三章 MCS-51指令系统功能功能数据传送类:数据传送类:2929条条算术运算类:算术运算类:2424条条逻辑运算类:逻辑运算类:2424条条控制转移类:控制转移类:1717条条位操作类:位操作类:1717条条常用符号Rn:工作寄存器中的寄存器R0、R1R7之一,Ri:工作寄存器中的
2、寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址rel:补码形式的8位地址偏移量。偏移范围为-128127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容:箭头左边的内容送入箭头右边的单元内 3.23.2 寻址方式寻址方式3.2.13.2.1 立即寻址立即寻址Immediate AddressingImmediate Addressing 操作数就包含在指令代码中,在操
3、作码之后,称为操作数就包含在指令代码中,在操作码之后,称为立即数,用立即数,用“”表示。表示。MCS-51MCS-51 如:如:MOV P1,MOV P1,#80H#80H MOV R7,MOV R7,#0F5H#0F5H MOV DPTR MOV DPTR,#1245H#1245H操作数存在程序存储器中 3.2.2 3.2.2 直接寻址直接寻址 Direct AddressingDirect Addressing直接使用数所在单元的直接使用数所在单元的地址地址找到了操作数,所以称找到了操作数,所以称这种方法为这种方法为直接寻址直接寻址。操作数在操作数在SFRSFR、内部内部RAMRAM、位地
4、址位地址空间。空间。如:如:MOV AMOV A,00H00H MOV CMOV C,60H60H MOV AMOV A,0F0H0F0H3.2.3 寄存器寻址寄存器寻址 Register Addressing对选定的工作寄存器对选定的工作寄存器R0R0R7R7、累加器、累加器A A、通用寄存器、通用寄存器B B、地址寄存器地址寄存器DPTRDPTR中的数进行操作。中的数进行操作。例:例:MOV AMOV A,R0R0;将将R0R0工作寄存器中的数据送到累加器工作寄存器中的数据送到累加器A A中去。中去。提一个问题:提一个问题:我们知道,工作寄存器就是内存单元我们知道,工作寄存器就是内存单元的
5、一部分,如果我们选择工作寄存器组的一部分,如果我们选择工作寄存器组0 0,则,则R0R0就就是是RAMRAM的的00H00H单元,那么这样一来,单元,那么这样一来,MOV AMOV A,00H00H 和和 MOV AMOV A,R0R0不就没什么区别了吗?不就没什么区别了吗?的确,这两条指令执行的结果是完全相同的,的确,这两条指令执行的结果是完全相同的,都是将都是将00H00H单元中的内容送到单元中的内容送到A A中去,但是执行的过中去,但是执行的过程不同,执行第一条指令需要程不同,执行第一条指令需要2 2个机器周期,而第二个机器周期,而第二条则只需要条则只需要1 1个机器周期,第一条指令变成
6、最终的目个机器周期,第一条指令变成最终的目标码要两个字节(标码要两个字节(E5H 00HE5H 00H),而第二条则只要一),而第二条则只要一个字节(个字节(E8E8H H)就可以了。)就可以了。3.2.4 寄存器间接寻址寄存器间接寻址 Register Indirect Addressing把地址放在另外一个寄存器中,根据这个寄存器中的数值把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。决定该到哪个单元中取数据。R0R0,R1-R1-8-8位地址,位地址,片内片内低低128128字节或字节或片外片外DPTRDPTR-16-16位,片外位,片外64KB64KBv M
7、CS-51MCS-51如:如:MOV AMOV A,R0R0MOVX AMOVX A,R0R0MOVX AMOVX A,DPTRDPTR操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中以以DPTRDPTR或或PCPC为基址寄存器,累加器为基址寄存器,累加器A A为变址寄存器。把两为变址寄存器。把两者内容相加,结果作为操作数的地址。者内容相加,结果作为操作数的地址。常用于查表操作。常用于查表操作。v MCS-51MCS-51 MOVCMOVC A A,A+DPTRA+DPTR ;(A+DPTR)A(A+DPTR)A MOVCMOVC A A,A+PCA+PC;PC+1 PCPC+1
8、PC,(A+PC)A(A+PC)A3.2.5 变址寻址变址寻址(基址基址+变址变址)Base-Register-plus-Index-Register-Indirect Addressing操作数在程序存储器中E0A程序存储区2040H 9320E0H 472041H DPH 20DPL 00ALU如:MOVC A,A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码3.2.6 相对寻址相对寻址 将将PCPC中的当前内容与指令中的当前内容与指令第二字节给出的数第二字节给出的数相加,结相加,结 果作为跳转指令的转移地址(转移目的地址)。果作为跳转指令的转移地址(转移目的地址)。P
9、CPC中的中的当前当前内容称为内容称为基地址基地址(本指令后的字节地址)(本指令后的字节地址)指令第二字节给出的数据称为指令第二字节给出的数据称为偏移量偏移量,1 1字节带符号数字节带符号数.常用于跳转指令。常用于跳转指令。如如:JC 23H:JC 23H 若若C=0C=0,不跳转;,不跳转;C=1C=1,跳转,跳转.Relative Addressing改变PC程序存储区ALU如:JC 231025H1000H 401025H 451001H 23 1024H 471002H 3023H1002H指令代码当前PC 对片内对片内RAMRAM的的位寻址区位寻址区和某些可和某些可位寻址位寻址的特殊
10、的特殊功能寄存器进行位操作时的寻址方式。功能寄存器进行位操作时的寻址方式。如如:SETB 3DH;:SETB 3DH;将将27H.527H.5位置位置1 1 CLR C CLR C ;CyCy位清位清0 03.2.7 3.2.7 位寻址位寻址 Bit Addressing操作数在片内RAM位地址区或SFR某些位中寻址方式涉及的存储器空间寻址方式涉及的存储器空间3.3 3.3 数据传送类指令数据传送类指令(2929条)条)Data Transfer InstructionData Transfer Instruction MCS-51 MCS-51 助记符:助记符:助记符:助记符:MOVMOV、
11、MOVXMOVX、MOVC MOVC XCH XCH、XCHDXCHD、SWAP SWAP PUSH PUSH、POP POP v 源操作数寻址方式(源操作数寻址方式(5 5种)种):立即寻址、直接寻址、寄存器寻址、立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。寄存器间接寻址、变址寻址。v 目的操作数寻址方式(目的操作数寻址方式(3 3种)种):直接寻址、寄存器寻址、寄存器间接寻址直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为除了目的操作数为ACCACC的指令影响奇偶标志的指令影响奇偶标志P P外,一般不影响外,一般不影响标志位。标志位。3.3.1 3.3.1 十六位数的传
12、递指令十六位数的传递指令(1条)MOV DPTRMOV DPTR,#data16data1680518051是一种是一种8 8位机,这是唯一的一条位机,这是唯一的一条1616位位立即数传递指立即数传递指令。功能:将一个令。功能:将一个1616位的立即数送入位的立即数送入DPTRDPTR中去。其中中去。其中高高8 8位送入位送入DPHDPH,低,低8 8位送入位送入DPLDPL。例:例:MOV DPTRMOV DPTR,#1234H#1234H执行完了之后执行完了之后DPHDPH中的值为中的值为12H12H,DPLDPL中的值为中的值为34H34H。如果我们分别向如果我们分别向DPHDPH,DP
13、LDPL送数,则结果也一样。送数,则结果也一样。如下面两条指令:如下面两条指令:MOV DPHMOV DPH,#35H#35H MOV DPL MOV DPL,#12H#12H。则就相当于执行了则就相当于执行了 MOV DPTRMOV DPTR,#3512H#3512H。3.3.2 3.3.2 累加器累加器A A与片外与片外RAMRAM之间的数据传递类指令之间的数据传递类指令(4(4条条)MOVX A,Ri MOVX Ri,A MOVX A,DPTR MOVX DPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入
14、的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。2.2.要读或写外部的要读或写外部的RAMRAM,当然也必须要知道,当然也必须要知道RAMRAM的地址,的地址,在后两条指令中,地址是被直接放在在后两条指令中,地址是被直接放在DPTRDPTR中的。而前两条中的。而前两条指令,由于指令,由于RiRi(即(即R0R0或或R1R1)只是)只是8 8位的寄存器,所
15、以只提位的寄存器,所以只提供低供低8 8位地址。高位地址。高8 8位地址由位地址由P2P2口口来提供。来提供。3.3.使用时应先将要读或写的地址送入使用时应先将要读或写的地址送入DPTRDPTR或或RiRi中,然后中,然后再用读写命令。再用读写命令。例例:将外部:将外部RAMRAM中中100H100H单元中的内容送入外部单元中的内容送入外部RAMRAM中中200H200H单元中。单元中。MOV DPTRMOV DPTR,#0100H#0100HMOVX AMOVX A,DPTRDPTRMOV DPTRMOV DPTR,#0200H#0200HMOVX DPTRMOVX DPTR,A A3.3.
16、3 读读程序存储器指令程序存储器指令(2条)条)MOVC A,A+DPTR MOVC A,A+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此 数的取值范围是0-5)MOV DPTR,#100H MOV A,R0 MOVC A,A+DPTR.ORG 0100HDB 0,1,4,9,16,25如果如果R0中的值为中的值为2,则最终地址为则最终地址为100H+2为为102H,到到102H单元中找到单元中找到的是
17、的是4。3.3.4 堆栈操作堆栈操作(2 2条)条)PUSH directPUSH direct ;SPSP+1,(SP)(direct)POP directPOP direct ;(direct)(SP),SPSP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例例:MOV SPMOV SP,#5FH#5FH MOV A MOV A,#100#100 MOV B MOV B,#20#20 PUSH ACCPUSH ACC PUSH B PUSH B 则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,
18、然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。1 1.给出每条指令执行后的结果给出每条指令执行后的结果 MOV 23H,#30HMOV 12H,#34HMOV R0,#23HMOV R7,12HMOV R1,#12HMOV A,R0MOV 34H,R1MOV 45H,34HMOV DPTR,#6712HMOV 12H,DPHMOV R0,DPLMOV A,R0;(23H)=30H;(12H)=34H;R0=23HXXXXXX
19、XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXDPHDPHDPLDPL45H45H34H34H23H23H12H12HR7R7R1R1R0R0XXXXXXXXXXXXXXXX30303434XXXXXXXX2323XXXXXXXXXXXXXXXX30303434343412122323676712123434343430303434343412122323676712123434343430306767343412121212;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=6767H;R0=1212H;A=676
20、7H内部RAM3.4 3.4 算术运算类指令算术运算类指令(2424条条)Arithmetic OperationsArithmetic Operations 主要对主要对8 8位无符号数;也可用于带符号数运算。位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加包括:加、减、乘、除、加1 1、减、减1 1运算指令运算指令 影响影响PSWPSW有关位。有关位。3.4.1 加法指令ADD AADD A,#datadata ;AdataAADD AADD A,direct direct;A(direct)AADD AADD A,RnRn ;ARnAADD AADD A,RiRi ;A(Ri)
21、A用途:用途:将将A A中的值与源操作数所指内容相加,最终结果中的值与源操作数所指内容相加,最终结果 存在存在A A中。中。1.不带进位位的加法指令(4 4条)条)2.带进位位的加法指令(4 4条)条)ADDC AADDC A,RnRn;A ARnRnCYACYAADDC AADDC A,directdirect;A A(direct)(direct)CYACYAADDC AADDC A,RiRi;A A(Ri(Ri)CYACYAADDC AADDC A,#datadata;A AdatadataCYACYA用途:用途:将将A A中的值和其后面的值以及进位位中的值和其后面的值以及进位位C C中
22、的值相加,中的值相加,最终结果存在最终结果存在A A,常用于多字节数运算中。,常用于多字节数运算中。说明:说明:由于由于5151单片机是一种单片机是一种8 8位机,所以只能做位机,所以只能做8 8位的数学位的数学运算,但运算,但8 8位运算的范围只有位运算的范围只有0 0255255,这在实际工作中是不,这在实际工作中是不够的,因此就要进行扩展,一般是将够的,因此就要进行扩展,一般是将2 2个个8 8位位(两字节两字节)的数的数学运算合起来,成为一个学运算合起来,成为一个1616位的运算,这样,可以表达的位的运算,这样,可以表达的数的范围就可以达到数的范围就可以达到0 06553565535。
23、例:先做先做67H+A0H=107H67H+A0H=107H,而,而1 107H07H显然超过了显然超过了0FF0FFH H,因此最终保存在因此最终保存在A A中的是中的是07H07H,而,而1 1则到了则到了PSWPSW中的中的CYCY位了。换言之,位了。换言之,CYCY就相当于是就相当于是100H100H。然后再做然后再做10H+30H+10H+30H+CYCY,结果是,结果是41H41H,所以,所以最终的结果是最终的结果是4107H4107H。1067H+30A0H1067H+30A0H0001 0000 0110 0111 0011 0000 1010 0000 0100 0001 0
24、000 0111 1067H1067H30A0H30A0H4107H4107H设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOV A,R0ADD A,R2 ;R0+R2A和CYMOV R4,AMOV A,R1ADDC A,R3 ;R1+R3+CYA和CYMOV R5,A又例:先做先做67H+20H=87H67H+20H=87H,没有超过,没有超过0FF0FFH H,因此最终,因此最终保存在保存在A A中的是中的是87H87H,而,而PSWPSW中的中的CY=0CY=0。然后再做然后再做10H+30H+10H+30H+CYCY,结果是,结果
25、是40H40H,所以,所以最终的结果是最终的结果是4087H4087H。1067H+3020H1067H+3020H0001 0000 0110 0111 0011 0000 0010 0000 0100 0000 1000 0111 1067H1067H3020H3020H4087H4087HDA ADA A在进行在进行BCDBCD码加法运算时,跟在码加法运算时,跟在ADDADD和和ADDCADDC指令指令之后,用于对累加器之后,用于对累加器A A中刚进行的两个中刚进行的两个BCDBCD码的加法码的加法的结果进行十进制调整。的结果进行十进制调整。例:例:A=0001 0101BCDA=000
26、1 0101BCD(代表十进制数(代表十进制数1515)ADD AADD A,#8#83.十进制调整指令(1 1条)条);A=1DHA=1DH,按二进制规律加,按二进制规律加;A=23HA=23H,按十进制规律加,按十进制规律加DA ADA A3.4.2 减法指令(8 8条)条)SUBB ASUBB A,RnRn ;A ARnRnCYACYASUBB ASUBB A,direct direct ;A A(direct)(direct)CYACYASUBB ASUBB A,RiRi ;A A(Ri(Ri)CYACYASUBB ASUBB A,#datadata;A AdatadataCYACYA
27、将将A A中的值减去源操作数所指内容以及进位位中的值减去源操作数所指内容以及进位位C C中的中的值,最终结果存在值,最终结果存在A A中。中。如:如:SUBB ASUBB A,R2R2设:设:A=C9HA=C9H,R2=55HR2=55H,CY=1CY=1,执行指令之后,执行指令之后,A A中的值为中的值为73H73H。1.带借位的减法指令(4 4条)条)说明说明:没有不带借位的减法指令没有不带借位的减法指令,如果需要做,如果需要做不不带位的减法指令(在做第一次相减时),只要将带位的减法指令(在做第一次相减时),只要将CYCY清零清零即可。即可。对带符号数,要注意对带符号数,要注意OVOV标志
28、。标志。OV=1OV=1,出错出错。3.5 逻辑运算类指令(2424条)条)主要用于对主要用于对2 2个操作数按个操作数按位进行逻辑位进行逻辑操作,结果送到操作,结果送到A A或直接寻址单元。或直接寻址单元。v 主要操作主要操作 与、或、异或、移位、取反、清零等。与、或、异或、移位、取反、清零等。v 对标志位的影响对标志位的影响 除了目的操作数为除了目的操作数为ACCACC的指令影响奇偶标志的指令影响奇偶标志P P外,外,一般不影响标志位。一般不影响标志位。Logic Operations3.5.1 3.5.1 逻辑或指令逻辑或指令(6 6条)条)ORL A,Rn;ARnAORL A,dire
29、ct;A(direct)AORL A,Ri;A(Ri)AORL A,#data;AdataAORL direct,A;(direct)A(direct)ORL direct,#data;(direct)data(direct)影响影响P P标志标志例:例:71H和和56H相或:相或:01110001(71H)01010110(56H)01110111 即即77H后两条指令,若直接地址为后两条指令,若直接地址为I/OI/O端口,则为端口,则为“读改读改写写”操作。操作。OR Logic Instruction3.5.2 逻辑与指令(6 6条)条)ANL A,Rn ;ARnAANL A,direc
30、t ;A(direct)AANL A,Ri ;A(Ri)AANL A,#data ;AdataAANL direct,A ;(direct)A(direct)ANL direct,#data ;(direct)data(direct)影响影响P P标志标志例:例:71H71H和和56H56H相与:相与:01110001 01110001(71H71H)01010110 01010110(56H56H)01010000 01010000 即即50H50H后两条指令,后两条指令,若直接地址为若直接地址为I/OI/O端口,则为端口,则为“读读改改写写”操作。操作。ANd Logic Instruct
31、ion例:例:71H71H和和56H56H相异或:相异或:01110001 01110001(71H71H))01010110)01010110(56H56H)3.5.2 逻辑异或指令(6 6条)条)XRL A,Rn ;A RnAXRL A,direct ;A (direct)AXRL A,Ri ;A (Ri)AXRL A,#data ;A dataAXRL direct,A ;(direct)A(direct)XRL direct,#data ;(direct)data(direct)影响影响P标志标志00100111 00100111 即即27H27H后两条指令,若直接地址为后两条指令,若
32、直接地址为I/OI/O端口,则为端口,则为“读改读改写写”操作。操作。eXclusive-oR Logic Instruction3.5.3 清清0 0与与取反指令(2 2条)条)取反:取反:CPL A CPL A;/AA/AA例:例:若若A=5CHA=5CH,执行,执行CPL ACPL A 结果:结果:A=A3HA=A3H清清0 0:CLR ACLR A ;0A0AC ComomP Plementlement L Logic Operationogic Operation3.5.4 循环移位指令(4 4条)条)RL ARR ARLC ARRC AA.7 A.0A.7 A.0A.7 A.0CY
33、CYA.7 A.0后两条指令,影响后两条指令,影响P P标志和标志和CYCY。Rotate Logic instruction例:若若A=5CHA=5CH,CY=1CY=1,执行,执行RLC ARLC A后,后,v 对对RLCRLC、RRCRRC指令,在指令,在CY=0CY=0时时 RLCRLC相当于相当于乘乘以以2 2 RRCRRC相当于相当于除除以以2 2结果:结果:A=B9HA=B9H,CY=0CY=0,P=1P=10101 11000101 11001 11011 10011011 10010 03.63.617条共有控制程序转移类指令共有控制程序转移类指令(不包括位操作类的转移不包括
34、位操作类的转移指令指令)。此类指令一般不影响。此类指令一般不影响PSWPSW。包括以下类型:包括以下类型:无条件转移和条件转移无条件转移和条件转移相对转移和绝对转移相对转移和绝对转移长转移和短转移长转移和短转移调用与返回指令调用与返回指令 短转移类指令:短转移类指令:AJMP AJMP addr11addr11 长转移类指令:长转移类指令:LJMP LJMP addr16addr16 相对转移指令:相对转移指令:SJMP SJMP relrel 间接转移指令:间接转移指令:JMP JMP A+DPTRA+DPTR(1 1)上面的前三条指令,统统理解成:上面的前三条指令,统统理解成:PCPC值改
35、变,即值改变,即跳转到一个标号处。跳转到一个标号处。那么他们的区别何在呢?那么他们的区别何在呢?v跳转的范围不同。跳转的范围不同。短转移类指令:短转移类指令:AJMP AJMP addr11addr11 长转移类指令:长转移类指令:LJMP LJMP addr16addr16 相对转移指令:相对转移指令:SJMP SJMP relrel转移范围转移范围:2KB2KB64KB64KB-128-128+127+127v指令构成不同。指令构成不同。AJMPAJMP、LJMPLJMP后跟的是后跟的是绝对地址绝对地址,而而SJMPSJMP后跟的是后跟的是相对地址相对地址。v指令长度不同指令长度不同v 原
36、则上,所有用原则上,所有用SJMPSJMP或或AJMPAJMP的地方都可以用的地方都可以用 LJMPLJMP来替代。来替代。间接转移指令:间接转移指令:JMP JMP A+DPTRA+DPTR 这条指令的用途也是跳转,转到什么地方去呢?这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。这可不能由标号简单地决定了。转移地址由转移地址由A+DPTRA+DPTR形成,并直接送入形成,并直接送入PCPC。指令对指令对A A、DPTRDPTR和标志位均无影响和标志位均无影响。本指令可代替众多的判别跳转指令,又称为本指令可代替众多的判别跳转指令,又称为散散转指令转指令,多用于多分支程序
37、结构中。,多用于多分支程序结构中。(2 2)第四条指令与前三条指令相比有所不同第四条指令与前三条指令相比有所不同例例:MOV DPTRMOV DPTR,#TAB#TAB;将;将TABTAB代表的地址送入代表的地址送入DPTRDPTR JMP A+DPTR JMP A+DPTR ;跳转;跳转TAB:AJMP ROUT0 TAB:AJMP ROUT0 ;跳转;跳转ROUT0ROUT0开始的程序段开始的程序段TAB+2:AJMP ROUT1 AJMP ROUT1 ;跳转;跳转ROUT1ROUT1开始的程序段开始的程序段TAB+4:AJMP ROUT2 AJMP ROUT2 ;跳转;跳转ROUT2RO
38、UT2开始的程序段开始的程序段TAB+6:AJMP ROUT3 AJMP ROUT3 ;跳转;跳转ROUT3ROUT3开始的程序段开始的程序段 .ROUT0ROUT0:.ROUT1ROUT1:.ROUT2ROUT2:.ROUT3ROUT3:执行该段程序后,程序将根执行该段程序后,程序将根据据A A中的内容转移到不同的中的内容转移到不同的程序段去执行程序段去执行-散转。散转。A=0,A=0,转转ROUT0ROUT0A=2,A=2,转转ROUT1ROUT1A=4,A=4,转转ROUT2ROUT2A=6,A=6,转转ROUT3ROUT3条件转移指令是指在满足一定条件转移指令是指在满足一定条件条件时进
39、行时进行相对转相对转移移,否则程序继续执行,否则程序继续执行本指令的本指令的下一条指令。下一条指令。一、判一、判A内容是否为内容是否为0转移指令转移指令(2条)条)JZ JZ relrel ;如果;如果A=0A=0,则转移,否则顺序执行。,则转移,否则顺序执行。JNZJNZ relrel ;如果;如果A0A0,就转移。,就转移。转移到相对于当前转移到相对于当前PCPC值的值的8 8位移量的地址去。即:。即:新的新的PCPC值值=当前当前PC+PC+偏移量偏移量relrel我们在编写汇编语言源程序时,可以直接写成:我们在编写汇编语言源程序时,可以直接写成:JZJZ 标号标号 ;即转移到标号处。;
40、即转移到标号处。MOV A MOV A,R0R0 JZ L1JZ L1 MOV R1 MOV R1,#00H#00H AJMP L2 AJMP L2 L1 L1:MOV R1:MOV R1,#0FFH#0FFH L2L2:SJMP L2:SJMP L2 END END 在执行上面这段程序前:如果在执行上面这段程序前:如果R0=0R0=0,结果,结果R1=0FFHR1=0FFH。而如果而如果R0R0 0 0,则结果是,则结果是R1=00HR1=00H。把上面的那个例子中的把上面的那个例子中的JZJZ改成改成JNZJNZ,看看程序执行的,看看程序执行的结果是什么结果是什么?如果如果R0=0R0=0
41、,结果,结果R1=00HR1=00H。如果。如果R0 R0 0 0,结果是,结果是R1R1中的中的值为值为0FFH0FFH。CJNE ACJNE A,#datadata,relrel CJNE ACJNE A,directdirect,relrelCJNE RnCJNE Rn,#datadata,relrelCJNE CJNE RiRi,#datadata,relrel此类指令的功能是将两个操作数比较,如果两者此类指令的功能是将两个操作数比较,如果两者相等相等,就,就顺序执行顺序执行,如果,如果不相等不相等,就,就转移转移。同样地,使用时,我们可以将同样地,使用时,我们可以将relrel理解成
42、标号,即:理解成标号,即:CJNE ACJNE A,#data#data,标号,标号CJNE ACJNE A,directdirect,标号,标号CJNE RnCJNE Rn,#data#data,标号,标号CJNE RiCJNE Ri,#data#data,标号,标号利用这些指令,可以判断两数是否利用这些指令,可以判断两数是否相等相等。但有时还想得知两数比较之后但有时还想得知两数比较之后哪个大哪个大,哪个小哪个小,本条指令也具有这样的功能:本条指令也具有这样的功能:如果两数不相等,则如果两数不相等,则CPUCPU还会用还会用CYCY(进位位)(进位位)来反映哪个数大,哪个数小。来反映哪个数大
43、,哪个数小。如果前面的数大,则如果前面的数大,则CY=0CY=0,否则,否则CY=1CY=1。因此在程序转移后再次利用因此在程序转移后再次利用CYCY就可判断出哪个就可判断出哪个数大,哪个数小了。数大,哪个数小了。MOV A,R0 CJNE A,#10H,L1 MOV R1,#0 ;如R0=10H,则不转移R1=00H;AJMP L3L1:JC L2 ;如CY=1即 R010H,则转移 AJMP L3L2:MOV R1,#0FFHL3:SJMP L3因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R010H,则R1=0AAH;如果R010H,则R1=0FFH。DJNZ Rn
44、DJNZ Rn,relrelDJNZ directDJNZ direct,relrelDJNZDJNZ指令的执行过程是这样的指令的执行过程是这样的:它将第一个参数中的值它将第一个参数中的值减减1 1,然后看这个值是否等于,然后看这个值是否等于0 0,如果,如果等于等于0 0,就往下执行,如果,就往下执行,如果不等于不等于0 0,就转移,就转移到第二个参数所指定的地方去。到第二个参数所指定的地方去。例:例:DJNZ 10HDJNZ 10H,LOOPLOOP .LOOP:.LOOP:.例例:MOV 23H,#0AHMOV 23H,#0AH CLR A CLR ALOOP:ADD A,23HLOOP
45、:ADD A,23H DJNZ 23H,LOOP DJNZ 23H,LOOP SJMP$SJMP$上述程序段的执行过程是:上述程序段的执行过程是:将将23H23H单元中的数连续相加,存至单元中的数连续相加,存至A A中,每加一次,中,每加一次,23H23H单元中的数单元中的数值值减减1 1,直至减到,直至减到0 0,共加(,共加(23H23H)次。)次。一、调用指令一、调用指令(2条)LCALL LCALL addr16addr16 ;长调用指令;长调用指令(3 3字节字节)ACALL ACALL addr11addr11 ;短调用指令;短调用指令(2 2字节字节)上面两条指令都是在主程序中调
46、用子程序,两者的区别上面两条指令都是在主程序中调用子程序,两者的区别:对短调用指令,被调用子程序入口地址必须与调用指令的对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的下一条指令的第一字节在相同的2KB2KB存储区之内。存储区之内。使用时可以用:使用时可以用:LCALLLCALL 标号标号 ;标号表示子程序首地址;标号表示子程序首地址 ACALLACALL 标号标号 来调用子程序。来调用子程序。指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。子程序执行完后必须回到主程序,如何子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。返
47、回呢?只要执行一条返回指令就可以了。RETRET;子程序返回指令;子程序返回指令RETIRETI;中断子程序返回指令;中断子程序返回指令两者不能互换使用。两者不能互换使用。3.6.4 3.6.4 空操作指令空操作指令(1条)NOP空操作,就是什么事也不干,停一个周期,一般空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。用作短时间的延时。RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。3.7 3.7 位操作指令位操作指令(1717条条)Boolean Op
48、erationsMCS-51MCS-51单片机的硬件结构中,有一个位处理器单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,(又称布尔处理器),它有一套位变量处理的指令集,包括包括位位变量变量传送传送、逻辑逻辑运算、控制程序运算、控制程序转移转移等。等。在在MCS-51 MCS-51 中,有一部份中,有一部份RAMRAM和一部份和一部份SFRSFR是具有位是具有位寻址功能的。寻址功能的。v 位操作区位操作区:内部:内部RAMRAM的的20H-2FH20H-2FH这这1616个字节单个字节单元,即元,即128128个位单元个位单元(位地址空间位位地址空间位0000
49、7FH)7FH);v 可以位寻址的特殊功能寄存器可以位寻址的特殊功能寄存器:80318031中有一中有一些些SFRSFR是是可以进行位寻址可以进行位寻址的,这些的,这些SFRSFR的特点是的特点是其其字节地址均可被字节地址均可被8 8整除整除,如如A A累加器,累加器,B B寄存寄存器、器、PSWPSW、IPIP(中断优先级控制寄存器)、(中断优先级控制寄存器)、IEIE(中断允许控制寄存器)、(中断允许控制寄存器)、SCONSCON(串行口控制(串行口控制寄存器)、寄存器)、TCONTCON(定时器(定时器/计数器控制寄存计数器控制寄存器)、器)、P0-P3P0-P3(I/OI/O端口锁存器
50、)。端口锁存器)。在进行位处理时,在进行位处理时,CYCY用作用作“位位累加器累加器”。以以PSW中位中位4(RS1)为例为例。直接直接(位位)地址方式:地址方式:如如 D4H;点操作符号方式点操作符号方式:如:如 PSW.4,D0H.4;位名称方式位名称方式:如:如 RS1;用户定义名方式用户定义名方式:如用伪指令:如用伪指令 bitSUB.REG bit RS1定义后,可用定义后,可用SUB.REG代替代替RS1。位地址表达方式位地址表达方式3.7.1 3.7.1 位传送指令位传送指令(2条)MOV CMOV C,bitbit;bitbit C CMOV MOV bitbit,C C;C