1、1,单片机原理及应用,机电工程学院 河海大学常州校区,第三章 MCS-51系列单片机指令系统,2,3-1 指令格式及其操作寻址方式,3-2 指令系统,一、基本概念 ,二、寻址方式 ,一、数据传送指令 ,二、算术运算指令 ,三、逻辑运算指令 ,四、位操作指令 ,五、控制转移指令 ,3.2.1 程序状态字PSW,3.2.2 指令系统,3,3-1 指令格式及其操作寻址方式一、基本概念1、指令及其格式什么是指令?计算机认识什么样的指令?指令能干什么? 机器指令:用2进制数0、1表示的命令代码。常以16进制表示。 机器语言:由机器指令描述的程序语言。 助记符指令:用字母和16进制数代替机器指令形成的符号
2、指令。 助记符语言:由助记符指令形成的程序语言,又称汇编语言。,4,MCS-51单片机汇编语言指令格式:标号: 操作码 操作数1, 操作数2,操作数3 ;注释其中:标 号:也称符号地址,代表该指令第1字节所在的地址,必须以字母开始,后跟18个字母或数字,并以冒号:结尾。 操作码:规定了指令将要干什么,必不可少,由25个英文字母组成 。操作数:表示参与运算的数或数的地址,与操作码由一个或几个空格分开,多个操作数之间以“,”分开 。(03个)注 释:可有可无,必须以“;”开始。,5,2、指令中的符号标识 Ri、Rn、#data、#data16、addr11、addr16、 Direct、rel、b
3、itA:寄存器寻址的累加器; ACC:直接寻址的累加器;: 间接寻址符号(X): X中的内容(X): 由X的内容作为地址的单元中的内容: 箭头左边的内容被右边的内容代替 $: 本条指令的起始地址 / : 位操作数前缀,表示取反。3、汇编语言的数据形式二进制( B):0,1十进制( D):0,1,9十六进制( H):0,1,9,A,B,C,D,E,F,6,二、寻址方式指令给出参与运算的数据的方式,即确定操作数地址的方法,通俗讲:以什么方式找到参与指令执行的数据。MCS-51指令寻址方式主要有5种:寄存器寻址、直接寻址、寄存器间接寻址、立即寻址基址寄存器变址寄存器间接寻址1、寄存器寻址由指令指出以
4、某寄存器的内容为操作数。寄存器寻址方式使用范围:(1)内部RAM中的32个工作寄存器R0R7; (2)A、B、C、DPTR;,7,例如: INC R3 ;(R3)(R3)+1操作码 操作数 指令中的R3即为寄存器寻址,其执行过程如下图:本例中:R3的“门牌号”高3位为0,决定了寻址内部RAM中 00H1FH空间。 对于Rn:具体寄存器由指令的低3位指定。 对于A、B、C、DPTR:则为隐含在指令代码中。,8,2、直接寻址在指令中含有操作数的直接地址,该地址指出了参与运算的数所在的字节单元地址或位地址(位寻址)。直接寻址的寻址范围: (1)内部数据存储器的低128字节,00H7FH; (2)特殊
5、功能寄存器,注意除A、B、DPTR外,其他SFR只能采用直接寻址方式。 (3)位寻址:所有可寻址位; 例如:MOV A, 70H ;(A)(70H) MOV C, 70H ;(CY)(70H) 注意:对累加器直接寻址和位寻址时,要用符号“ACC”或直接地址“E0H”,以区别于寄存器寻址。,9,3、寄存器间接寻址指令中指出某一个寄存器的内容为操作数的地址,以符号“”表示。其寻址范围: (1)以R0,R1为地址指针,寻址内部RAM 00FFH和外RAM的低256B; (2)以堆栈SP为地址指针,寻址栈区单元。虽然在指令中并没有SP,但栈操作指令所操作的数据是由栈指针SP指出来的。 ; (3)以DP
6、TR,或R0、R1(须用P2指定高8位地址) 为地址指针,寻址64KB的外部RAM和扩展I/O口。 例:MOV A,R0 ;(A)(R0)PUSH ACC ;(SP) (A)MOVX A,DPTR ;(A)(DPTR) ),10,4、立即寻址操作数以常数的形式出现,直接跟在操作码后面,以指令字节的形式存放在ROM中。 例如: MOV A, #40H MOV DPTR, #TABLE ;TABLE为标号地址MOV P1, #00000111BMOV R3, #18 5、基址寄存器变址寄存器间接寻址 (1)变址寻址以基址寄存器(PC、 DPTR)和变址寄存器(A)的内容 作为无符号数相加,形成16
7、位地址,访问程序存储器(表格)。 MOVC A,A+PC ;(A)(A)+(PC) MOVC A,A+DPTR ;(A)(A)+(DPTR) *(PC)为本条指令的下条指令的首地址,11,例如:设(A)=30H,(PC)=1000H,执行MOVC A,A+PC的情况如下图所示。取数地址为:1001+30=1031H。显然: 当(A)=00H时,新(PC)=1001H; 当(A)=FFH时,新(PC)=1100H;,12,(2)相对寻址指令中给定地址的相对偏移量rel,以PC当前值为基地址,加上rel所得结果为转移目标地址。rel:符号数,单字节补码,-128+127。例如:1000H:JC 8
8、0H ;判C转移指令,2字节分析:当CY=1时,转移,过程如下图所示:,13,3-2 指令系统 3.2.1 程序状态字PSW即标志寄存器,字节地址为:D0H,可字节寻址、位寻址。 作用:存放指令执行时有关信息、状态,供程序查询和判别。PSW字格式:D7 D6 D5 D4 D3 D2 D1 D0CY AC F0 RS1 RS0 OV P CY:进位标志。操作结果最高位有进位输出(加法)或借位输入(减法),置位CY,否则清“0”CY。 AC:辅助进位标志。操作结果低4位向高4位有进位输出(加法)或借位输入(减法),置位AC,否则清“0”AC。 OV:溢出标志。有进位到最高位但最高位没有产生进位或者
9、最高位产生进位而低位没有向最高位进位,则置位OV,否则清“0”OV。也就是D7位和D6位中只有一个有进位或借位时,置位OV,两个位都没有进位/借位或者都有进位/借位时,清“0”OV。 P:奇偶标志。累加器ACC的奇偶标志,如果累加器ACC的8位模2和为1,则P=1;否则P=0。即ACC里奇数个1,P=1,否则P=0。 RS1,RS0 :工作寄存器区选择位高位和低位。 F0 ,F1 :用户标志位,14,3.2.2 指令系统指令系统:对于某单片机所能执行的全部指令的集合,它是一套控制计算机操作的编码(也就是二进制编码),也称之为机器语言。计算机只能识别和执行机器语言。单从其二进制编码来说,人是不容
10、易理解的,所以通常采用符号指令(助记符)表示,也就是汇编指令。再通过汇编程序将之翻译成计算机能识别的机器语言。 指令类型(按功能): 数据传送指令(28条) 算术运算指令(24条) 逻辑运算指令(25条) 位操作指令(12条) 控制转移指令 (22条),15,一、数据传送指令最基本、最主要的指令,共有29条,包括数据传送、数据交换、栈操作三类。目的单元为A时影响P标志。 1、内部RAM间的数据传送(16条) (1)指令格式 指令格式: MOV 目的字节,源字节 功能:把源字节指定的变量传送到目的字节指定的存储单元中,源字节内容不变。 (2)操作数 操作数:A,Rn,direct,Ri,DPTR
11、,#data,16,a、以累加器A为目的操作数的指令 MOV A,Rn;n=07 MOV A,direct MOV A,Ri;i=0,1 MOV A,#data b、以Rn为目的操作数的指令 MOV Rn,A MOV Rn,direct MOV Rn,#data不能MOV Rn, Ri 或 MOV R1,R2,17,c、以直接地址单元为目的操作数的指令 MOV direct,A MOV direct,Rn MOV direct,direct MOV direct,Ri MOV direct,#data d、以寄存器间接寻址的单元为目的操作数的指令 MOV Ri,A MOV Ri,direct
12、MOV Ri,#data e、16位数据传送指令 MOV DPTR,#data16 ;高8位送DPH,低8位送DPL,18,例3-1:设(70H)= 60H,(60H)=20H,P1为输入口,状态为0B7H,执行如下程序:MOV R0, #70H ;(78H 70H)MOV A, R0 ;(E6H)MOV R1, A ;(F9H)MOV B, R1 ;(87H F0H)MOV R0, P1 ;(A6 90H) 结果: (70H)= 0B7H(B) = 20H (R1) = 60H(R0) = 70H 要求:掌握指令功能、查表求机器码、寻址方式、结果,19,例3-2:给出下列指令的执行结果,指出
13、源操作数的寻址方式。MOV 20H, #25HMOV 25H, #10HMOV P1, #0CAHMOV R0, #20HMOV A, R0MOV R1, AMOV B, R1MOV R1,P1MOV P3, R1 结果:(20H)=25H, (25H)=10H, (P1)=0CAH,(R0)=20H, (A)=25H, (R1)=25H, (B)=10H, (25H)=0CAH, (P3)=25H,20,2、ACC与外部数据存储器(或扩展I/O口)传递数据MOVXMOVX A, DPTRMOVX A, Ri ;均为单字节指令 MOVX DPTR, AMOVX Ri, A 功能:A与外部RAM
14、或扩展I/O口数据的相互传送。 说明: (1)用Ri进行间接时只能寻址256个单元(0000H00FF),当访问超过256个字节的外RAM空间时,需利用P2口确定高8位地址(也称页地址),而用DPTR进行间址可访问整个64KB空间。 (2)在执行上述读、写外RAM指令时,P3.7(RD)、P3.6(WR)会相应自动有效。 (3)可用作为扩展I/O口的输入/输出指令,21,例3-3:将外RAM 2010H中内容送外RAM 2020单元中。 分析:读2010H中内容A写数据2020H中 流程如右图: 程序如下: MOV P2,#20H ;输出高8位地址 MOV R0,#10H ;置读低8位间接地址
15、 MOVX A,R0 ;读2010H中数据 MOV R1,#20H ;置写低8位间接地址 MOVX R1,A ;将A中数据写入2020H中,22,3、查表指令MOVC 表格:程序存储器除存放程序外,还可存放一些常数,这种数据的结构称为表格。 访问:通过两条程序存储器取数指令,即查表指令来访问, 完成从ROM中读数,并只能送累加器A。 指令格式: MOVC A,A+DPTR ;(A)(A)+(DPTR) MOVC A,A+PC ;(PC)(PC)+1,(A)(A)+(PC) 特点:单字节指令,源操作数为变址寻址,执行时, PSEN会自动有效。 功能:以DPTR、PC为基地址,与A中的8位无符号数
16、相加,得到一个新16位地址,将其内容送A。,23,(1)用DPTR作为基寄存器 例3-4:设外部ROM的2000H单元开始的连续10个字节中已存放有09的平方数,要求根据A中的内容(09)来查找对应的平方值。START: MOV A, #3MOV DPTR, #TABLE MOVC A, A+DPTR ;查表ORG 2000H 2003单元内容 TABLE:DB 0,1,4,9,16,25,36,49,64,81 结果:A (2003H),(A)=09H 特点:可访问整个ROM的64KB空间,表格可放在ROM的任何位置,与MOVC指令无必然的关系。,24,(2)用PC作为基寄存器 例3-5:
17、ORG 1000H1000H MOV A,#30H;1002H MOVC A,A+PC;结果是:A (1033H) 优点:不改变PC的状态,根据A的内容取表格常数。 缺点: (1)表格只能存放在查表指令以下的256个单元内。 (2)当表格首地址与本指令间有其他指令时,须用调整偏移量,调整量为下一条指令的起始地址到表格首址之间的字节数。,25,例3-6:阅读下列程序,给出运行结果 ,设(A)=3。1000H ADD A,#02H ;加调整量1002H MOVC A,A+PC ;查表1003H NOP1004H NOP1005H TAB: DB 66,77,88H,99H,W,10 结果:(A)=
18、99H,显然,2条NOP指令没有时,不需调整。4、堆栈操作堆栈,由特殊功能寄存器SP(81H)管理,始终指向其栈顶 位置,栈底视需要设在内部RAM低128B内。 (1)进栈操作: PUSH direct 功能:先(SP) (SP)+ 1,再(SP)(direct);其中:direct为源操作数;目的操作数为SP,隐含。,26,例3-7:已知:(A)=30H,(B)=70H 执行: MOV SP, #60H ;设栈底PUSH ACC ;PUSH B 结果:(61H)=30H,(62H)=70H,(SP)=62H(2)出栈操作: POP direct功能:先(direct)(SP),再SP (SP
19、)1其中:direct为目的操作数,源操作数为SP,隐含。例3-8:已知:(SP)=62H,(62H)=70H,(61H)=30H执行: POP DPH POP DPL 结果:(DPTR)=7030H,(SP)=60H,27,5、与A的数据交换指令数据交换指令共5条,完成累加器和内部RAM单 元之间的字节或半字节交换。 (1)整字节交换:XCH A,Rn ;(A)(Rn)XCH A,direct ;(A)(direct)XCH A,Ri ;(A)(Ri) (2)半字节交换:XCHD A,Ri ;(A)03(Ri)03 (3)累加器自身高低4位交换SWAP A ;(A)74(A)30,28,例3
20、-9 设(A)=57H,(20H)=68H,(R0)=30H,(30H)=39H,求下列指令的执行结果 (1)XCH A,20H ;结果:(A)=68H,(20H)=57H (2)XCH A,R0 ;结果: (A)=39H,(30H)=57H (3)XCH A,R0 ;结果: (A)=30H,(R0)=57H (4)XCHD A,R0 ;结果: (A)=59H,(30H)=37H) (5)SWAP A ;结果: (A)=75H,29,例3-10:设内部RAM 40H、41H单元中连续存放有4个压缩的BCD码数据,试编程序将这4个BCD码倒序排列。 分析:流程如右图 程序如下:MOV A, 41
21、HSWAP AXCH A, 40HSWAP AMOV 41H,A,30,程序存贮器:立即寻址和基寄存器加变址寄存器间接寻址; 特殊功能寄存器:只能直接寻址方式; 8052等单片机的高128字节:只能采用寄存器间接寻址,不能用直接寻址; 外部RAM/IO:只能用MOVX指令访问,采用寄存器间接寻址。R0、R1、DPTR,31,二、算术运算指令包括、加1、减1、十进制调整指 令,共有24条,一般影响PSW中的CY、AC、OV、P 标志位。 1、加减法指令(12条) (1)指令助记符:ADD +ADDC 带C+ SUBB 带C- (2)操作数:如右图,以A为目的操作数,32,(3)指令描述举例: 不
22、带进位加法 ADD 4条 ADD A,Rn ADD A,direct ADD A,Ri ADD A,#data 带进位加法指令 ADDC 4条 ADDC A,Rn ADDC A,direct ADDC A,Ri ADDC A,#data 带进位减法指令 SUBB 4条 SUBB A,Rn SUBB A,direct SUBB A,Ri SUBB A,#data,33,例3-11:设(A)=D3H,(30H)=E8H 执行: ADD A,30H 结果:CY=1,AC=0,P=0,OV=0,(A)=BBH 例3-12:设(A)=88H,(30H)=99H,CY=1执行: ADDC A, 30H10
23、00 1000 (88H)1001 1001 (99H)+) 11 0010 0010 结果:CY=1,AC=1,P=0,OV=1,(A)=22H例3-13:设(A)=49H,CY=1,执行: SUBB A, #54H0100 1001 (49H)0101 0100 (54H)-) 11111 0100 (借位1) 结果:CY=1,AC=0,P=1,OV=0,(A)=F4H,34,例3-14:试编制4位十六进制数加法程序,假定和数超过双字节 (21H20H)+(31H30H) 42H41H40H 分析:先低字节作不带进位求和,再作带进位高字节求和。流程图(略),程序如下:MAIN: MOV A
24、, 20HADD A, 30HMOV 40H, AMOV A, 21HADDC A, 31H ;带低字节进位加法MOV 41H, AMOV A, #00H ;准备处理最高位MOV ACC.0,CMOV 42H, ASJMP ,35,2、加1减1指令 助记符:INC,DEC 操作数:A,direct,Ri,Rn,DPTR 指令描述:(不影响PSW,即使有进位或借位,CY也不变,除A影响P标志) (1)INC:加1 5条INC A ;(A) (A)+1INC Rn ;(Rn) (Rn)+1INC Ri ;(Ri) (Ri)+1INC direct ;(direct) (direct)+1INC D
25、PTR ;(DPTR) (DPTR)+1 (2)DEC:减1 4条DEC A ;(A) (A)1DEC Rn ;(Rn) (Rn)1DEC Ri ;(Ri) (Ri)1DEC direct ;(direct) (direct),36,例3-15:编制下列减法程序,要求: (31H30H)(41H40H) 31H30H 分析:流程图(略),程序如下: MAIN:CLR C ;CY清零MOV R0, #30HMOV R1, #40HMOV A, R0SUBB A, R1MOV R0,A ;存低字节INC R0 ;指向31HINC R1 ;指向41HMOV A, R0SUBB A, R1MOV R0
26、, A ;存高字节HERE: SJMP HERE,37,3、十进制调整指令 格式:DA A指令用于两个BCD码加法运算的加6修正,只影 响CY位。指令的使用条件: (1)只能紧跟在加法指令(ADD/ADDC)后进行 (2)两个加数必须已经是BCD码 (3)只能对累加器A中结果进行调整加6修正的依据:由CPU判CY、AC是否=1?A中 的高、低4位是否大于9?例如:(A)=56H,(R5)=67H,(BCD码)执行:ADD A,R5 DA A 结果:(A)=23H,(CY)=1,38,例3-16:试编制十进制数加法程序(单字节BCD加法),假定和数为单字节,要求:(20H)+(21H) 22H分
27、析:流程如右图程序如下:MOV R0, #20HMOV A, R0INC R0ADD A, R0DA AINC R0MOV R0,A,39,例3-17:十进制减法程序(单字节BCD数减法) 要求:(20H)(21H) 22H 分析:主要要考虑到,DA A只能对加法调整,故必须先化BCD减法为加法做,关键为求两位十进制减数的补码 (9AH-减数) 流程如右图,程序如下:CLR C MOV R0, #20HMOV R1, #21HMOV A, #9AH SUBB A, R1 ;求补ADD A, R0 ;求差DA A INC R1MOV R1, A ;存结果,40,4、乘除法指令唯一两条单字节4机器
28、周期的指令。 (1)8位无符号数乘法指令MUL AB ;(B 158 )( A70)(A)(B)PSW: 1)若乘积大于256,OV=1;否则OV=0;2)CY总是清“0”。 例如:(A)=50H,(B)=A0H,执行MUL AB后 结果:(B)=32H,(A)=00H,(OV)=1 (2)8位无符号除法指令DIV AB ; (A)(A/B)的(商); (B)(A/B)的(余数)PSW: 1)CY、OV,清“0” 2)若(B)=0,OV=1。 例如:(A)=2AH,(B)=05H,执行DIV AB后 结果:(A)=08H,(B)=02H,(OV)=0,41,例3-18:双字节乘法程序,要求:
29、(R0R1)(R2)R3R4R5 分析:设(R0)=J,(R1)=K,(R2)=L,则: MOV A, R1 J KMOV B, R2 ) LMUL AB KL高 KL低MOV R5, A +) JL高 JL低MOV R4, B R3 R4 R5MOV A, R0 MOV B, R2MUL AB ADD A, R4MOV R4, A MOV A, BADDC A, #00HMOV R3, A,42,例3-19:编制将A中的数转换成三位BCD码程序,百位放在 20H,十位、个位放在21H中。 分析:(A)/100商(百位) (20H); 余数/10 商(十位)(21H)74; 余数 (个位)(2
30、1H)30; 流程如右图,程序如下:MOV B, #100DIV AB MOV 20H, A MOV A, B MOV B, #10DIV ABSWAP AADD A, BMOV 21H, ASJMP ,43,三、逻辑运算指令逻辑运算类指令共24条,涉及A时,影响P标志。1、 基本与、或、异或运算指令(1)指令助记符:ANL、ORL、XRL(2)操作数:如下图,44,(3)指令描述举例:a、逻辑“与”指令 6条ANL A, RnANL A, directANL A, RiANL A, #dataANL direct, AANL direct, #data这条指令常用来给某些位清“0”。当这条指
31、令用于修改一个输出口(P0、P1、P2、P3)时,作为原始数据的值是从口数据锁存器读入,而不是引脚状态。,45,b、逻辑“或”指令 6条ORL A, RnORL A, directORL A, RiORL A, #dataORL direct, AORL direct, #data这条指令常用来给某些位置“1”。当这条指令用于修改一个输出口(P0、P1、P2、P3)时,作为原始数据的值是从口数据锁存器读入,而不是引脚状态。,46,c、逻辑“异或”指令 6条XRL A, RnXRL A, directXRL A, RiXRL A, #dataXRL direct, AXRL direct, #d
32、ata,这条指令常用来给某些位求反。当这条指令用于修改一个输出口(P0、P1、P2、P3)时,作为原始数据的值是从口数据锁存器读入,而不是引脚状态。,47,2、对A简单逻辑指令1)清零与取反CLR A ;(A)清0CPL A ; (A)取反2)循环移位指令RL A ;循环左移RLC A ;带进位循环左移 如果A128,同时CY=0,则RLC A也相当于A*2 RR A ;循环右移RRC A ;带进位循环右移,48,例3-20: 1)选通工作寄存器组中0区为工作区。 ANL PSW,#11100111B ;PSW的D4、D3位为00 2)利用移位指令实现累加器A的内容乘6。 CLR CRLC A
33、 ;左移一位,相当于乘2MOV R0, ACLR CRLC A ;再乘2,即乘4ADD A, R0 ;乘2 + 乘4 = 乘63) 将ACC的低4位送P1口的低4位,P1口的高4位不变。 ANL A, #0FH ;高4位屏蔽(清0)ANL P1, #F0H ;P1低4位清0ORL P1, A ;(P1.31.0)(A30),49,例3-21:设在外RAM 2000H中放有两个BCD数,编程,使这 两个BCD码分别存到2000H和2001H的低4位中。 分析:流程如图 程序如下:MOV DPTR,#2000HMOVX A, DPTRMOV R0, AANL A, #0FHMOVX DPTR,AM
34、OV A, R0ANL A, #0F0HSWAP AINC DPTRMOVX DPTR,A,50,四、位操作指令布尔处理器C,可寻址内部RAM中的可寻址位: bit = 00FFH,和SFR中的可寻址位。位地址的描述形式: (1)直接位地址,如MOV C, 70H (2)字节地址+位地址,如ACC.4,PSW.4等 (3)位寄存器名称,如F0,C,RS1,RS0等 (4)伪指令定义过的位名称 注意: CY-直接地址,是位寻址; C -位寄存器,为寄存器寻址。 例如: CLR CY ;机器码C2 D7H CLR C ;机器码C3H,51,1、位传送指令 MOV C, bit MOV bit, C
35、 位变量必须经过C进行 例如: MOV C, 06HMOV P1.0, C 2、位变量修改指令 CLR C ;(C) 0 CLR bit ;(bit) 0 CPL C ;(C) ( ) CPL bit ;(bit) ( ) SETB C ;(C) 1 SETB bit ;(bit) 1 例如: SETB P1.0,52,3、位变量逻缉“与”指令ANL C, bit ;(C)(C)(bit)ANL C, / bit ;(C)(C)( ) 例如:设P1为输入口,P3为输出口,执行程序MOV C, P1.0ANL C, P1.1ANL C, /P1.2MOV P3.0,C 结果:P3.0 = P1.
36、0 P1.1 /P1.2。4、位变量逻缉“或”指令ORL C, bit ;(C)(C)(bit)ORL C, / bit ;(C)(C)( )“/”表示用寻址位的逻辑非作源值参与运算,但不影响源值。,53,例如:设P1为输出口,执行下列程序,指出功能:(1) MOV C, 00HORL C, 01HMOV P1.7, C(2) MOV P1, #00HLOOP: SETB P1.0LCALL DELAYCLR P1.0LCALL DELAYAJMP LOOP(3)LOOP: SETB CRLC AMOV P1, ALCALL DELAYJNB ACC.7, LOOP,54,例3-22 将位地址
37、40H、41H中的内容进行异或,结果存入42H中。 分析:运算公式:Y= AB= 程序如下:MOV C, 41HANL C, /40HMOV 42H,CMOV C, 40HANL C, /41HORL C, 42HMOV 42H,C,55,五、控制转移指令(22条)1、无条件转移指令,56,a、短跳转指令 AJMP addrll该指令在运行时先将PC+2,然后把PC的高5位和指令第一字节高3位以及指令第2字节相连(PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0)而得到跳转目的地址送入PC。因此,目标地址必须与它下面的指令存放在同一个2KB区域内(因为对于
38、特定的该条指令, PC15PC14PC13PC12PC11已经固定,变化的只有a10a9a8a7a6a5a4a3a2a1a0,从0000000000011111111111共211=2K范围)。意即转跳的目的地址离该指令的下一条指令的地址最大距离只有2K。 如 KWR:AJMP addrll 如果addrll=00100000000B,标号KWR地址为1030H,则执行该条指令后,程序转移地址为1030+2=1032=0001000000110010,0001000100000000即1100。 实际上:第二操作数一般都以标号代替。,57,b、相对转移指令SJMP relPC+2(下条指令的地
39、址)后,把指令的有符号的位移值加到PC上,并计算出转向地址。跳转范围:-128+127字节 c、长跳转指令LJMP addr 16执行时将指令的第二字节和第三字节分别装入PC的高位和低位字节中,无条件地转向指定地址。转跳地址可以在64K程序存贮空间的任何地方。 d、基寄存器加变址寄存器间接转移指令JMP A+DPTR将累加器A中的8位无符号数与数据指针DPTR的16位数相加,结果作为下条指令的地址放入PC,不改变累加器和数据指针内容。主要功能是实现程序的散转功能,所以我们也习惯称之为散转指令。,58,例3-23:执行下面的散转程序,程序将根据A中的内容(命令编号09)转相应的命令处理程序。MO
40、V R1,ARL A;相当于A*2ADD A,R1;相当于A*3MOV DPTR,#PMTB;假设PMTB为8000HJMP A+DPTR PMTB: LJMP PM0;3字节指令,地址8000HLJMP PM1;地址8003HLJMP PM2;地址8006HLJMP PM3;地址8009HLJMP PM4;地址800CHLJMP PM5;地址800FHLJMP PM6;地址8012HLJMP PM7;地址8015H ,59,2、条件转移指令根据某种条件判断转移的指令,执行时:条件满足时,转移执行; 条件不满足时,顺序执行;目的地址:(PC)=下条指令首地址 + rel包括判A、判Bit、判C
41、三种,共有7条: 1)判A转移,2字节JZ rel ;条件:(A)= 0JNZ rel ;条件:(A)02)判Bit转移,3字节JB bit, rel ;条件:(bit)= 1JNB bit, rel ;条件:(bit)= 0JBC bit, rel ;条件:(bit)= 1转移,并清 bit位,60,3)判C转移,2字节JC rel ;条件:(C)= 1JNC rel ;条件:(C)= 0 例3-24 利用P1.0、P1.1作为外接发光二极管的启停按 钮,P1.2作为外接发光二极管端,试编制控制程序。,61,程序如下: START:MOV P1, #03H ;作P1口输入时先置1WT1: J
42、B P1.0,WT1SETB P1.2WT2: JB P1.1,WT2CLR P1.2SJMP WT1 3、比较不相等转移指令CJNE A, direct, rel;CJNE A, #data, rel;CJNE Rn, #data, rel;CJNE Ri, #data, rel;,62,执行时:1)两操作数相等,顺序执行,且CY=0。2)两操作数不相等,转移执行,且对于无符号 数若:第一操作数 第二操作数,CY=0。例如:右图所示的比较 判断,可利用CJNE和 JC指令来完成。,63,例3-24:内部RAM 30H开头的20个 连续单元中,存放有20个数,统计 等于8的单元个数,结果放在R
43、2中。 分析:取一个数与8比较,相等R2 加1,不相等跳过。并作20次重复 即可。 流程如右图,程序如下:ORG 1000H START: MOV R0, #30HMOV R7, #20MOV R2, #0 LOOP:CJNE R0,#08H,NEXTINC R2 NEXT: INC R0DJNZ R7,LOOPSJMP ,64,4、减“1”不为0转移指令 又称循环转移指令,主要用来构成循环结构,有2条:DJNZ Rn, rel ;2字节指令,2周期指令DJNZ direct,rel ;3字节指令,2周期指令 目的地址:(PC)=(PC)+ 指令字节数2或3 + rel例3-25:利用DJNZ
44、指令设计循环延时程序,已知fosc=12MHz1) 单循环延时DELAY: MOV R7, #10DJNZ R7, t=2us10+1=21us2) 双重循环延时DELAY: MOV R7, #10DL: MOV R6, #100DJNZ R6, DJNZ R7, DLt=(2us100+2+1)10+1=2031us,65,3) 三重循环延时 DELAY: MOV R7, #10DL2: MOV R6, #200DL1: MOV R5, #250DJNZ R5, DJNZ R6, DL1DJNZ R7, DL2t=(2us250+2+1)200)+2+1)10+1= 1006031us 1
45、秒,66,例3-26 P1口控制发光二极管,延时节日灯组合。LOOP: MOV P1, 0AAH ;灯光1ACALL DELAYMOV P1, 055H ;灯光2 ACALL DELAYSJMP LOOPDELAY: MOV R7, 0FFH DL1: MOV R6, 0FFH DL2: NOP ;空操作DJNZ R6, DL2 DJNZ R7, DL1 RET,67,5、调用指令与返回指令1) 主程序和子程序结构2) 调用和返回子程序是独立于主程序的具有特定功能的程序段, 单独编写,能被主程序调用,又能返回主程序。按 两者的关系有两种调用情况,多次调用和子程序嵌 套,如图所示。,68,3)
46、堆栈和PC值的保留调用子程序时,CPU自动将当前PC值保留在堆栈中(先PCL,后PCH),子程序返回时,自动弹出,送入PC。 4) 现场保护和恢复现场 现场保护 是指将需要保护的单元内容,在子程序的开始使用压栈指令存放在堆栈中的过程。 恢复现场 是指在子程序返回前,通过出栈指令,将被保护内容送回原来的寄存器。 5)调用与返回指令 (1)短调用指令ACALL addr11 执行时:1)(PC)+ 2 PC,并压入堆栈,先PCL,后PCH;2)PC1511 a100 PC,获得子程序入口地址;3)转移范围同AJMP。,69,(2)长调用指令LCALL addr16 执行时:1)(PC)+ 3 PC
47、,并压入堆栈,先PCL,后PCH;2)addr16 PC,获得子程序起始地址;3)可调用64K地址范围内的任意子程序。例如:已知(SP)=60H,执行下列指令后的结果:1000H:ACALL 100H1000H:LCALL 0800H结果: (SP)=62H,(61H)=02H,(62H)=10H,(PC)=1100H : (SP)=62H,(61H)=03H,(62H)=10H,(PC)=0800H,70,(3)子程序返回指令RET 、中断返回指令RETI RET:从堆栈中退出PC的高位和低位字节,栈指针减2,即:1)(PCH)(SP), (SP)(SP)- 1;2)(PCL) (SP), (SP)(SP)- 1; RETI:从堆栈中退出PC的高位和低位字节,栈指针减2,同时清除中断优先,开放低级中断。6、空操作指令NOP ;(PC)(PC)+1空操作指令是一条单字节单周期指令,控制CPU不做任何操 作,只作时间上的消耗,因此常用于程序的等待或时间的延迟。,