1、单片机原理及应用第3章 MCS-51单片机指令系统,3.1 指令格式 3.2 寻址方式 3.3 数据传送类指令 3.4 算术运算类指令 3.5 逻辑运算类指令 3.6 位操作类指令 3.7 控制转移类指令 3.8 MCS-51汇编语言程序设计,第3章 MCS-51单片机指令系统,3 MCS-51单片机指令系统,教学要求 1、掌握MCS-51单片机指令系统的寻址方式、指令类型。 2、熟练掌握MCS-51单片机的指令系统,包括数据传输、算术运算、逻辑运算、控制转移及位操作等类型指令。 3、掌握一定的分析和编制一般单片机程序的能力。,3 MCS-51单片机指令系统,指令:主机能直接识别和接受并指挥计
2、算机执行某种操作的命令。 指令系统:指令的集合。 指令可以用两种语言形式表示: 机器语言:用二进制代码表示,能被主机直接识 别,但不易记忆和阅读。汇编语言:可以反映指令的功能和主要特征,用助 记符,可以方便记忆。,3.1 指令格式,MCS-51汇编指令由操作码助记符字段和操作数字段所组成。指令格式如下: 标号:操作码助记符 (目的操作数),(源操作数);注释 例如:SS: MOV A,#4FH ;立即数4FH送A 标号:用符号标明该指令所在的符号地址,根据实际需要设置。在其他指令的操作数中可以引用该标号作为符号地址,便于控制程序的转向或寻址。标号以英文字母开头的字母、数字和某些规定的特殊符号的
3、序列,一般不超过6个符号,否则,超过部分在源程序汇编时将被删去。,3.1 指令格式,操作码:用来规定指令所完成的操作,用规定的汇编语言助记符表示。 操作数:表示操作的对象,可能是一个具体的数据,也可能是指出取得数据的地址或符号。分为目的操作数和源操作数两部分,中间用“,”分开。操作数可以有1、2、3个或者没有(如空操作指令) 。 注释:对该指令功能的解释,可有可无。,3.1 指令格式,数据操作MCS-51系列单片机的CPU能对位、半字节、字节和双字节 数据进行各种操作,它们包括数据传送、算术运算、逻辑运 算、布尔处理和控制转移等操作。指令类型MCS-51汇编语言有111种指令,42种操作码助记
4、符用来描 述33种操作功能。 按执行时间分:有单周期指令;双周期指令;四周期指令; 按功能分类:数据传送指令;算术运算指令;逻辑运算指令;位操作指令;控制转移指令。,3.1 指令格式,按字节数分:有单字节指令;双字节指令;三字节指令; 单字节指令: 如:,双字节指令 如:,3.1 指令格式,三字节指令 如:,3.2 寻址方式,寻址方式:是在指令中给出的寻找操作数地址的方法。 51单片机共有7种寻址方式: 1、寄存器寻址方式:在指令中将指定寄存器的内容作为操作数。在这种寻址中,用符号名称表示寄存器。 例如: MOV A,R3寻址范围:四个寄存器组的32个通用寄存器R0R7。A,B,DPTR,Cy
5、(位)。,3.2 寻址方式,2、直接寻址方式:在指令中直接给出操作数单元的地址。 例如: MOV 65H,A 寻址范围:内部RAM地址空间 SFR地址空间 (只能用直接 位地址空间(20H2FH) 寻址方式),3.2 寻址方式,3、寄存器间接寻址方式:在指令中给出的寄存器内容是操作数的地址,从该地址中取出的数才是操作数。表示形式:应在寄存器名称前面加。 例如:MOV A,R0 寻址范围: 工作寄存器R0、R1 堆栈指针SP 数据指针DPTR,3.2 寻址方式,4、立即寻址方式:在指令中直接给出操作数,出现在指令中的操作数叫立即数。为区别于直接地址,立即数前加上“#”。 例如: MOV A,#6
6、2H寻址范围:程序存储器立即数。,3.2 寻址方式,5、变址间接寻址方式:以DPTR或PC作基址寄存器,累加器A作变址寄存器,以两者内容相加。形成的16位程序存储器地址作为操作数地址。 例如:MOVC A,A+DPTR (A)=54H (DPTR)=1256H,3.2 寻址方式,寻址范围:只能对程序存储器进行寻址,或者说是专门针对程序存储器的寻址方式。 变址间接寻址指令只有三条:MOVC A,A+DPTR (适用于查表MOVC A,A+PC 操作)JMP A+DPTR,3.2 寻址方式,6、相对寻址方式:以PC的当前值为基准,加上指令中给出的相对偏移量(rel)形成新的有效转移地址。 其中,r
7、el是一个带符号的8位二进制数,能表示的范围是-128+127个字节单元之间。目的地址=转移指令所在地址+转移指令字节数+rel 例如:JC 75H(设Cy=1) 若rel为负数,计算时用补码运算,3.2 寻址方式,7、位寻址方式:可以对数据位进行操作。 例如:CPL P1.0MOV C,2BH ;(把位寻址区的2BH位状态送累加位C) 寻址范围:片内RAM中的位寻址区可位寻址的SFR的位,指令中使用符号说明,Rn:当前选定工作寄存器组的R0R7工作寄存器。其中n=07。 #data:8位不带符号的二进制立即数, “”为立即数标识符(称为前缀)。 data l6:16位二进制立即数。 data
8、:8位二进制码内部数据存储器单元地址。它可以是内部RAM(0127或0256)的某个单元地址或一个特殊功能寄存器的地址。 Ri:以当前工作寄存器R0或R1作间接寻址寄存器,以间接寻址(0256)数据存储器单元。其中“”为间接寻址标识符(称前缀),i0或1。 addr 16:16位二进制码地址。提供长调用(LCALL)或长转移(LJMP)指令16位二进制码地址,使之可转向或调用64KB程序存储器地址空间的任何单元。,指令中使用符号说明,addr 11:11位二进制码地址。提供绝对调用(ACALL)或绝对转移(AJMP)指令低11位(010)进制码地址,高5位维持原值不变,因而只能使程序转向或调用
9、包含该ACALL或 AJMP指令的下一条指令的第一个字节在内的2KB范围内的程序存储器地址空间。 direct:8位直接寻址方式符号。rel:带符号的8位二进制码偏移量(需用2的补码表示)的符号。常用于相对转移指令中,其转移范围相对于当前PC值的-128+127个字节单元的地址空间。 bit:布尔(位)处理指令的直接寻址位符号。表示可直接位寻址的内部RAM或特殊功能寄存器的位地址。 C:最高进位标志位或布尔(位)处理累加器。,指令中使用符号说明,:表示程序走向。 :表示数据传送方向。 :表示数据交换。 (X):表示X单元中的内容。 (X):表示以X单元中的内容为地址进行间接寻址。,指令介绍,5
10、1单片机的指令系统,共有111条指令,按其功能可分为五大类:(1)数据传送类指令(28条)(2)算术运算类指令(24条)(3)逻辑运算类指令(25条)(4)位操作(布尔)类指令(17条)(5)控制转移类指令(17条),3.3 数据传送类指令,数据传送类指令的功能:将指令中源操作数传送到目的操作数。指令执行后,源操作数不改变,而目的操作数修改为源操作数,或者源操作数与目的操作数互换,即源操作数变成目的操作数,目的操作数变成源操作数,保存目的操作数不被丢失。 数据传送类指令不影响标志位,即不影响C、AC、OV,但不包括检验累加器A奇偶性的标志位P。,3.3 数据传送类指令,一、一般传送类指令 汇编
11、语言格式:MOV (目的操作数),(源操作数) 功能:源操作数单元内容送到目的操作数单元中,源操作数单元内容不变。,3.3 数据传送类指令,说明:Ri中,i=0或1。,1、以累加器A为目的操作数的指令,2、以Rn为目的的操作数的指令,MOV A,Rn ;A(Rn) MOV A,direct ;A(direct) MOV A,Ri ;A(Ri) MOV A,#data ;A#data,MOV Rn,A ;Rn (A) MOV Rn,direct ;Rn (direct) MOV Rn,#data ;Rn#data,3.3 数据传送类指令,3、以直接寻址的单元为目的操作数指令,4、以寄存器间接寻址
12、的单元为目的操作数指令,MOV Ri,A ;(Ri)(A) MOV Ri,direct ;(Ri)(direct) MOV Ri,#data ;(Ri)#data,MOV direct,A ;direct(A) MOV direct,Rn ;direct (Rn) MOV direct, direct ;direct (direct) MOV direct, Ri ;direct(Ri) MOV direct, #data ;direct#data,3.3 数据传送类指令,上述MOV指令格式中,目的操作数在前、源操作数在后。 另外,累加器A是一个特别重要的8位寄存器,CPU对它具有其他寄存器所
13、没有的操作指令,下面将介绍的加、减、乘、除指令都是以A作为操作数的, Rn为CPU当前选择的寄存器组中的R0R7,在指令编码中rrr=000111,分别对应于R0R7。 直接地址指出的存储单元内部RAM的007FH和特殊功能寄存器。 在间接寻址中,用R0或R1作地址指针,访问内部RAM的000FFH这256个单元。,3.3 数据传送类指令,例:设(70H)=60H,(60H)=20H,P1口为输入口,当前的输入状态为B7H,执行下面的程序:,MOV R0, #70H MOV A, R0 MOV R1, A MOV B, R1 MOV R0, P1,(R0)=70H,(A)=60H (R0)=7
14、0H,(R1)=60H (A)=60H,(B)=20H (R1)=60H,(70H)=B7H (P1)=B7H,结果:,(R0)=70H (A)=60H (R1)=60H (B)=20H (P1)=B7H (70H)=B7H,3.3 数据传送类指令,例:设内部RAM的30H单元内容为40H,40H单元内容为10H,P1口作输入口,其输入的数据为0CAH(11001010B),经下列程序执行后的结果是什么?,(R0)=30H,(A)=40H ,(R0)=30H,(R1)=40H,(A)=40H,(B)=10H,(R1)=40H,(40H)=0CAH,(P1)=0CAH,(P2)=0CAH,(P1
15、)=0CAH,(R0)=30H,(A)=(R1)=40H,(B)=10H, (40H)=0CAH,(P2)=0CAH,MOV R0,#30H MOV A,R0 MOV R1,A MOV B,R1 MOV R1,P1 MOV P2,P1,结果:,3.3 数据传送类指令,二、16位数据传送指令(通常为访问外部RAM的目标地址),MOV DPTR,#data16;DPTR#data015DPH#data815DPL#data07,3.3 数据传送类指令,三、栈操作类指令 (1)入栈(不影响标志位),例:设(SP)=60H,(ACC)=30H,(B)=70H,执行下述指令:,PUSH direct ;
16、SP(SP)+1;(SP)(direct),PUSH ACC PUSH B,结果:,进栈指令用于保护CPU现场。,(61H)=30H,(62H)=70H,(SP)=62H,;(SP)+1,61H (SP),(ACC) 61H,;(SP)+1,62H (SP),(B) 62H,3.3 数据传送类指令,(2)出栈(不影响标志位),POP direct ;direct(SP)SP (SP) 1,例 :设(SP)=62H,(62H)=70H,(61H)=30H,执行下述指令:,POP DPH ;(SP)DPH,(SP)-1SP POP DPL ;(SP)DPL,(SP)-1SP,结果:(DPTR)=7
17、030H,(SP)=60H,退栈指令用于恢复CPU现场。,3.3 数据传送类指令,四、累加器传送类指令,(3)累加器A高4位和低4位内容互换指令,(2)半字节交换指令,(1) 字节交换指令,XCH A, Rn ;(A)(Rn) XCH A, direct ;(A) (direct) XCH A, Ri ;(A) (Ri),XCHD A, Ri ;(A03) (Ri)03);各自的高4位不变,SWAP A ;(A03) (A47),3.3 数据传送类指令,(4) 累加器A与外部RAM传送指令,(5)累加器A与程序存储器数据传送指令(查表指令),MOVX A, DPTR ; (DPTR)A MOV
18、X A, Ri ; (Ri)A MOVX DPTR, A ;(A)(DPTR) MOVX Ri, A ;(A)(Ri),MOVC A, A+PC ;PC(PC)+1;A (A)+(PC),MOVC A, A+DPTR ; (A)+(DPTR)A,3.3 数据传送类指令,例 ORG 8000H MOV A, #30H ;双字节指令 MOVC A, A+PC ;单字节指令 ORG 8030H DB ABCDEFGHIJ上面的查表指令执行后,将8003H+30H=8033H所对应的程序存储器中的ASCII码D(44H)送A。,例 设(DPTR)=8100H,(A)=40H,执行指令: MOVC A,
19、 A+DPTR 结果:将程序存储器中8140H单元中内容送入累加器A。,3.4 算术运算类指令,51单片机的算术/逻辑运算部件(ALU)仅执行无符号二进制整数的算术运算。除了加1和减1指令外,算术运算结果将使进位标志(Cy)、半进位标志(AC)、溢出标志(OV)置位或复位。,1、不带进位的加法指令(影响AC、C、OV、P),一、加法类指令,ADD A, Rn ;A(A)+(Rn) ADD A, direct ;A (A)+(direct) ADD A, Ri ;A (A)+(Ri) ADD A, #data ;A (A)+#data,如果位7有进位输出,则置“1”进位CY;否则清“0”CY。如
20、果位3有进位输出,置“1”辅助进位AC;否则清“0”AC。如果位6有进位输出而位7没有或者位7有进位输出而位6没有,则置位溢出标志OV;否则清“0”OV。,3.4 算术运算类指令,举例:设(A)=0C3H,(R0)=0AAH,执行指令:ADD A,R0 结果:和中1的个数为奇数时P=1,否则,P=0。,3.4 算术运算类指令,2、带进位加法指令(影响AC、C、OV、P)常用于多字节加法,3、增量(加1)指令(不影响标志位),ADDC A, Rn ;A (A)+(C)+(Rn) ADDC A, direct ;A(A)+(C)+(direct) ADDC A, Ri ;A(A)+(C)+(Ri)
21、 ADDC A, #data ; A(A)+(C)+#data,INC A ;A (A)+1 INC Rn ;Rn (Rn)+1 INC direct ;direct (direct)+1 INC Ri ;(Ri) (Ri)+1 INC DPTR ; DPTR (DPTR)+1,ADDC A, 20H 结果:1 0 0 0 0 1 0 11 1 1 1 1 1 1 1+) 1(1) 1 0 0 0 0 1 0 1,3.4 算术运算类指令,例 设(A)=0FFH,(R3)=0FH,(30H)=0F0H,(R0)=40H,(40H)=00H,执行指令:,4、二十进制调整指令(不影响OV标志) 执行
22、本指令的操作是:根据A的原始值和PSW的状态,决定是否对A进行加06H、60H和66H的操作。,结果: (A)=00H,(R3)=10H,(30H)=0F1H,(40H)=01H, PSW状态不改变。,INC A ;(A)=00H INC R3 ;(R3)=10H INC 30H ;(30H)=0F1H INC R0 ;(R0)=01H,DA A ;DA调整累加器内容为BCD码 若(A03)9或(AC)=1,则A03(A03)+06H同时, 若(A47)9或(C)=1,则A47 (A47)+60H,3.4 算术运算类指令,说明:BCD码采用四位二进制数编码,并且只采用了其中的十个编码,即000
23、01001,分别代表BCD码09,而10101111为无效码,当相加结果大于9,说明已经进入无效编码区;当相加结果有进位,说明已跳过无效编码区。凡结果进入或跳过无效编码区时,结果是错误的,相加结果均比正确结果小6(差6个无效编码)。,3.4 算术运算类指令,例:设(A)=56BCD,(R5)=67BCD,执行下列指令: ADD A,R5 DA A,结果:(A)=23H,CY=1,3.4 算术运算类指令,例:完成功能:(32H)(31H)(30H)+(42H)(41H)(40H)52H51H50H,假设32H,31H,30H,42H,41H,40H中的数均为2位BCD码,程序如下:MOV A,3
24、0H ;个位相加ADD A,40H ;和送50H单元DA AMOV 50H,AMOV A,31H ;十位带进位位相 ADDC A,41H ;加,和送51H单元 DA AMOV 51H,AMOV A,32H ;百位带进位位ADDC A,42H ;相加,和送DA A ;52H单元MOV 52H,A,3.4 算术运算类指令,二、减法类指令 1、带借位减法指令(影响标志位AC、C、OV),SUBB A, Rn ;A(A)-(C)-(Rn) SUBB A, direct ;A (A)-(C)-(direct) SUBB A, Ri ;A (A)-(C)-(Ri) SUBB A, #data ;A (A)
25、-(C)-#data,如果位7需借位,则置位CY;否则清“0”CY。如果位3需借位,则置位AC;否则清“0”AC。如果位6需借位而位7不需借位或者位7需借位而位6不需借位,则置位溢出标志OV;否则清“0”OV。第2操作数允许有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。,3.4 算术运算类指令,例题:设压缩型BCD码的被减数存于符号地址MINUEND单元中,减数存于符号地址SUBSTR单元中,结果存于符号地址DIFFER单元中。 说明:因为没有减法调整指令,所以可以用加补码的形式计算,补码的求法:用9AH减去减数即得到以100为模的补码。,例 设(A)=0C9H,(R2)=54H
26、,CY=1,执行指令:SUBB A, R2 1 1 0 0 1 0 0 1 0 1 0 1 0 1 0 0-) 10 1 1 1 0 1 0 0 结果:(A)=74H,CY=0,AC=0,OV=1,P=0,3.4 算术运算类指令,程序:,DECSUB: CLR C ;C清0MOV A,#9AH ;求减数的补码SUBB A,SUBSTRADD A,MINUEND ;进行补码相加DA A ;进行BCD码相加调整MOV DIFFER,A ;求得结果存于DIFFER中CLR C ;C清0,3.4 算术运算类指令,2、减1指令 (不影响标志位(除(A)减1影响P外) )(00H-1=0FFH),DEC
27、A ;A(A)-1 DEC Rn ;Rn (Rn)-1 DEC direct ; direct (direct)-1 DEC Ri ;(Ri) (Ri)-1,3.4 算术运算类指令,三、乘法类指令(影响标志位OV和C,其中C总为0,如果乘积大于255(0FFH)时,即B的内容不为0时,置位OV),四、除法类指令(影响标志位OV和C,其中C总为0,当除数B的内容为00H时,则执行结果不确定,置位OV),MUL AB;,DIV AB;,3.5 逻辑运算类指令,逻辑运算包括对字节操作数和对位操作数(布尔逻辑运算)进行逻辑运算。对字节操作又包括单字节操作数和双字节操作数两类。对字节操作数进行逻辑运算时
28、,只有RLC A和RRC A两条指令影响标志位C,其余均不影响任何标志位。,2、累加器A取反指令,一、单操作数逻辑运算类指令 1、累加器A清0指令,CLR A ;A00H,CPL A ;A ( ),3.5 逻辑运算类指令,3、累加器A循环左移指令,4、累加器A连同进位位C循环左移指令,RL A ;An+1(An)其中n=06;A0 (A7),RLC A ;An+1 (An)其中n=06;A0 (C),C (A7),3.5 逻辑运算类指令,5、累加器A循环右移指令,6、累加器A连同进位位C 循环右移指令,RR A ;An(An+1)其中n=06;A7 (A0),RRC A ;An (An+1)其
29、中n=06;A7 (C),C (A0),3.5 逻辑运算类指令,二、双操作数逻辑运算类指令 1、逻辑“与”指令,ANL指令常用来屏蔽某些不用的位。 例如:ANL P1,#01100110B 执行结果:将P1口锁存器的第0,3,4,7位的内容屏蔽掉。,ANL A, Rn ;A(A)(Rn) ANL A, direct ;A(A)(direct) ANL A, Ri ;A(A)(Ri) ANL A, #data ;A(A)#data,ANL direct, A ;direct (direct) (A) ANL direct, #data ;direct (direct) #data,3.5 逻辑运
30、算类指令,2、逻辑“或”指令,例题:将累加器A的内容送P1口的低5位,传送时不影响P1口的高3位。,ORL A, Rn ;A(A)(Rn) ORL A, direct ;A(A)(direct ) ORL A, Ri ;A(A)(Ri) ORL A, #data ;A(A) #data,ORL direct, A ; direct (direct) (A) ORL direct, #data ; direct (direct) #data,ANL A,#00011111B ANL P1,#11100000B ORL P1,A,3.5 逻辑运算类指令,3、逻辑“异或”指令,XRL A, Rn ;
31、A(A) (Rn) XRL A, direct ;A(A) (direct) XRL A, Ri ;A(A) (Ri) XRL A, #data ;A(A) #data,XRL direct, A ;direct (direct) (A) XRL direct, #data ;direct (direct) #data,3.6 位操作类指令,内部RAM的20H2FH位寻址区和特殊功能寄存器区中可位寻址的SFR可以采用布尔处理类指令进行操作。可位寻址的寄存器的位地址,可用下列方式表示: 直接用位地址(0255或00HFFH)表示。 (2)采用字节地址位数方式表示,两者之间用“.”隔开。例如:25
32、H.5等。 (3)对于位寻址寄存器,可以用字节寄存器名加位数来表示,两者之间用“.”隔开,例如:P0.5,PSW.7等。 (4)位寄存器的定义名称,如F0等,例如D5H、F0、D0.5、PSW.5表示的是同一位,(见下一页图),3.6 位操作类指令,3.6 位操作类指令,布尔(位)处理类指令除了对进位位C操作的指令对进位标志有影响外,其他不影响标志位。 一、位变量传送指令,MOV C, bit ;C(bit) MOV bit, C ;bit(C),例3-30 MOV C, 06H ;(20H).6CY MOV P1.0, C ;CYP1.0 结果: (20H).6P1.0,3.6 位操作类指令
33、,二、位变量修改指令,1、位清0指令,CLR C ;C0 CLR bit ;bit0,例:P1口原写入内容为01011101B,执行指令CLR P1.2 结果: (P1)=01011001B,3.6 位操作类指令,2、位置1指令,SETB C ;C1 SETB bit ;bit1,例:设(C)=0,(P1)=00110100B,执行指令SETB CSETB P1.0 执行结果:(C)=1,(P1)=00110101B,3.6 位操作类指令,3、位取反指令,CPL C ;C CPL bit ;bit,例:(P1)=01011101B,执行CPL P1.1CPL P1.2 执行结果:(P1)=01
34、011011B,3.6 位操作类指令,三、布尔(位)逻辑运算指令 1、位逻辑“与”指令,ANL C, bit ; C (C)(bit) ANL C, /bit ; C (C)( ),例 设P1为输入口,P3.0作输出口,执行下列命令: MOV C, P1.0 ;(P1.0)C ANL C, P1.1 ;(C)(P1.1)C ANL C, /P1.2 ;(C) C MOV P3.0, C ;(C)P3.0,结果:P3.0=(P1.0)(P1.1),3.6 位操作类指令,2、位逻辑“或”指令,ORL C, bit ;C(C)(bit) ORL C, /bit ;C(C),例 设P1口为输出口,执行
35、下述指令: MOV C, 00H ;(20H).0C ORL C, 01H ;(C)(20H).1C ORL C, 02H ;(C)(20H).2C ORL C, 03H ;(C)(20H).3C ORL C, 04H ;(C)(20H).4C ORL C, 05H ;(C)(20H).5C ORL C, 06H ;(C)(20H).6C ORL C, 07H ;(C)(20H).7C MOV P1.0, C ;(C)P1.0 结果:内部RAM的20H单元中只要有一位为1, P1.0输出就为高电平。,3.7 控制转移类指令,控制转移类指令有两种:无条件转移、条件转移。 一、无条件转移类指令,A
36、JMP addr11 ;PC(PC)+2 PC010addr010(PC 1115)不变,这是2K字节范围内的无条件转跳指令,程序转移到指定的地址。该指令在运行时先将PC+2,然后通过把PC的高5位和指令第一字节高3位以及指令第二字节相连(参见教材指令编码)(PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0)而得到转跳目的地址送入PC。因此,目标地址必须与它下面的指令存放地址在同一个2K字节区域内。,3.7 控制转移类指令,3.7 控制转移类指令,例 KWR: AJMP addrll 如果addrll=00100000000B,标号KWR地址为1030H,
37、则执行该条指令后,程序转移到1100H; 当KWR为3030H时,执行该条指令后,程序转移到3100H。,3.7 控制转移类指令,2 相对转移指令,SJMP rel ;PC(PC)+2 PC(PC)+rel说明:rel是一个带符号的8位二进制数,转移范围是-128+127个字节单元。,例如:当前执行指令地址为(PC)=0111H,rel=23H,执行指令 SJMP rel 执行结果:程序将转移到(PC)=(PC)+2+23H=0136H处执行程序。,例 KRD: SJMP PKRD如果KRD标号值为0100H,即SJMP这条指令的机器码存放于0100H和0101H这两个单元中;标号PKRD值为
38、0123H,即转跳的目标地址为0123H,则指令的第2个字节(相对偏移量)应为: rel = 0123H0102H=21H,3.7 控制转移类指令,3 长转移指令LJMP addr16 ;PCaddr015由于程序直接提供16位转移目标地址,因而使程序可在整个64KB程序存储器寻址空间内任意选择转移目标,为编程带来方便。,例 执行指令:LJMP 8100H 结果使程序转移到8100H,不管这条长跳转指令存放在什么地方。,3.7 控制转移类指令,4 间接转移指令JMP A+DPTR ;PC(A)+(DPTR),这条指令的功能是把累加器中8位无符号数与数据指针DPTR中的16位数相加(模216),
39、结果作为下条指令地址送入PC,不改变累加器和数据指针内容,也不影响标志。利用这条指令能实现程序的散转。,3.7 控制转移类指令,例 如果累加器A中存放待处理命令编号(07),程序存储器中存放着标号为PMTB的转移表,则执行下面的程序,将根据A内命令编号转向相应的命令处理程序: PM: MOV R1, A ;(A)*3ARL A ADD A, R1 MOV DPTR, #PMTB ;转移表首址DPTR JMP A+DPTR PMTB: LJMP PM0 ;转向命令0处理入口LJMP PM1 ;转向命令1处理入口LJMP PM2 ;转向命令2处理入口LJMP PM3 ;转向命令3处理入口LJMP
40、PM4 ;转向命令4处理入口LJMP PM5 ;转向命令5处理入口LJMP PM6 ;转向命令6处理入口LJMP PM7 ;转向命令7处理入口,3.7 控制转移类指令,二、条件转移指令,条件转移指令是依某种特定条件转移的指令。条件满足才转移相当于执行一条相对转移指令,条件不满足时则顺序执行下面的指令。目的地址在以下一条指令的起始地址为中心的256字节范围中(-128+127B)。当条件满足时,把PC加到指向下一条指令的第1个字节地址,再把有符号的相对偏移量加到PC上,计算出转向地址。,JZ rel ;PC(PC)+2当(A)=全“0”,则PC(PC)+rel当(A)全“0”,则程序顺序执行 J
41、NZ rel ; PC(PC)+2当(A)全“0”,则PC(PC)+rel当(A)=全“0”,则程序顺序执行 说明:以上两条指令均对累加器A的内容进行检测。,1、测试条件符合转移指令,3.7 控制转移类指令,JC rel ;(PC)(PC)+2当(C)=1,则PC(PC)+rel当(C)=0,则程序顺序执行,JNC rel ; (PC)(PC)+2当(C)=0,则PC(PC)+rel当(C)=1,则程序顺序执行,3.7 控制转移类指令,JB rel ;PC(PC)+3当(bit)=1,则PC(PC)+rel当(bit)=0,则程序顺序执行,JNB rel ; PC(PC)+3当(bit)=0,
42、则PC(PC)+rel当(bit)=1,则程序顺序执行,JBC rel ; PC(PC)+3当(bit)=1,则bit 0 ,PC(PC)+rel当(bit)=0,则程序顺序执行,3.7 控制转移类指令,2、比较不相等转移指令,CJNE A,direct,rel ;PC(PC)+3若(direct)(A),则PC(PC)+rel且C1若(direct)=(A),则顺序执行,CJNE A,#data,rel ; PC(PC)+3若#data (A),则PC(PC)+rel且C 1若#data =(A),则顺序执行,CJNE Rn,#data,rel CJNE Ri,#data,rel,3.7 控
43、制转移类指令,3、减1不为0转移指令(循环转移指令),DJNZ Rn,rel ;PC(PC)+2 Rn(Rn)-1当(Rn)0,则PC(PC)+rel ,程序继续循环当(Rn)=0,则结束循环,程序往下执行,DJNZ direct,rel,例 延时程序 START: SETB P1.1 ;1P1.l DL: MOV 30H, #03H ;03H30H,置初值 DL0: MOV 31H, #0F0H ;0F0H31H,置初值 DL1: DJNZ 31H, DL1 ;(31H)-131H,(31H)不为0重复执行DJNZ 30H, DL0 ;(30H)-130H,(30H)不为0转DL0CPL P
44、1.1 ;P1.1求反AJMP DL ;转DL,3.7 控制转移类指令,三、调用与返回指令,在程序设计中,常常出现几个地方都需要作功能完全相同的处理,为了减少程序编写和调试的工作量,使某一段程序能被公用,于是引入了主程序和子程序的概念,指令系统中一般都有调用子程序的指令,以及从子程序返回主程序的指令。,通常把具有一定功能的公用程序段作为子程序,在子程序的末尾安排一条返回主程序的指令。主程序转子程序以及从子程序返回的过程如图所示。,在一个程序中,往往在子程序中还会调用别的子程序,这称为子程序嵌套。二级子程序嵌套过程如图所示。,3.7 控制转移类指令,图 主程序二次调用子程序示意图 图 二级子程序
45、嵌套示意图,3.7 控制转移类指令,1、短调用指令短调用指令提供低11位目标地址,因此被调子程序被限制在以当前PC值为首地址的2K字节地址空间内 ,高5位地址不变。,ACALL addr11 ;PC(PC)+2 (本指令 SP(SP)+1 2个字节) (SP) (PC07)SP (SP)+1(SP) (PC815)PC010 addr010(PC1115) 不变,3.7 控制转移类指令,例:若(SP)=60H,标号MA值为0123H,子程序SUB位于0345H,则执行指令:MA: ACALL SUB 结果:(SP)=62H,内部RAM中堆栈区内(61H)=25H, (62H)=01H,(PC)
46、=0345H 执行过程:(PC)+2=0125H,压入堆栈(SP)+1=60H+1=61H中压入25H,(SP)+1=61H+1=62H中压入01H,(SP)=62H。(SUB)=0345H送PC,(PC)=0345H,程序转向子程序首地址0345H单元开始执行。 这里PC值的高5位内容不变,仅把123H变成345H, 0123H:0000,0001,0010,0011 0345H:0000,0011,0100,0101 寻址在包含0125H地址在内的同一个2K字节范围内。,3.7 控制转移类指令,2、长调用指令该指令提供16位目标地址,以调用64K字节范围内所指定的子程序。,LCALL ad
47、dr16 ;PC(PC)+3(本指令为 SP(SP)+13字节指令) (SP)(PC07)SP(SP)+1(SP)(PC815)PCaddr16,3.7 控制转移类指令,例:若(SP)=80H,标号STRT值为0100H,标号DIR值为8100H,则执行指令:STRT: LCALL DIR 结果:(SP)=82H,(81H)=03H,(82H) =01H,(PC)=8100H执行过程:(PC)+3=0103H,先后压入堆栈(SP)+1=80H+1=81H中压入03H,(SP)+1=81H+1=82H中压入01H,(SP)=82H。(DIR)=8100H送PC,(PC)=8100H,程序转向目标地址为8100H为首地址的子程序开始执行。 注意:这里PC的所有位均可改变,故可寻址64K范围内的存储单元。,