《《单片机原理与实用技术》第3章.ppt》由会员分享,可在线阅读,更多相关《《单片机原理与实用技术》第3章.ppt(95页珍藏版)》请在三一办公上搜索。
1、单片机原理与实用技术付晓光 莫海霞制作,第3章MCS-51指令系统,3.1单片机指令系统概述,指令是指挥计算机工作的命令,一种计算机所能执行的指令集合称之为该种计算机的指令系统。,指令,3.1.2 指令格式,指令的表示形式称指令格式。编写程序时必须严格按指令格式书写。MCS-51指令由操作码和操作数组成。汇编语言指令格式如下:操作码助记符 操作数1,操作数2,操作数3,1.操作码助记符2.操作数,3.2寻址方式,指令中,操作数可能是具体的数据,也可能是具体的存放数据的地址或符号,无论何种情况,都可由操作数取得参与指令运行的二进制数据。这个过程叫作寻址。,3.2.1 立即寻址方式,所谓立即寻址就
2、是操作数在指令中直接给出。立即寻址方式的操作数称立即数,立即数只能是源操作数,不能作为目的操作数。立即数有8位立即数和16位立即数。使用时在立即数前加“#”标志。,例:MOV A,#20H MOV DPTR,#20D8H,3.2.2直接寻址方式,直接寻址就是操作数直接以单元地址的形式给出。直接地址以存贮单元形式出现。例如指令:MOV A,20H,3.2.3寄存器寻址方式,寄存器寻址就是操作数在寄存器中。例如指令:MOV A,R2,3.2.4寄存器间接寻址方式,寄存器间接寻址使用的寄存器为Ri和DPTR,使用时寄存器前面加“标志。即以下形式:MOV A,Ri MOVX A,DPTR例如:(R1)
3、80H、(80H)=33H,则执行指令MOV A,Ri后,累加器A的内容为33H而不是80H。,寄存器间接寻址是以寄存器中的内容为地址取得操作数的方法。和寄存器寻址相比,寄存器寻址时,寄存器中存放的是操作数,而寄存器间接寻址中时,寄存器中存放的是操作数的地址。,3.2.5基址加变址寻址方式,基址加变址寻址就是以DPTR或PC为基址寄存器,以A为变址寄存器,以两者内容相加形成16位地址作为操作数地址。例如指令:MOVC A,A+DPTR,3.2.6位寻址方式,位寻址方式就是以位为操作数。MCS-51单片机有相当强的位处理功能,可以对位进行直接操作。例如指令:MOV C,4AH,位寻址范围1)内部
4、RAM的位寻址区 2)可供位寻址的11个专用寄存器,3.2.7相对寻址方式,相对寻址是在相对转移指令中,根据地址相对当前PC的偏移量得到操作数的方式。如:JZ rel,偏移量rel是一带符号8位二进数的补码数,范围为-128+127。实际书写程序时往往先用地址标号代替,在汇编为机器指令时再计算出来。,例3-1 指出下列每一条指令的寻址方式。MOV 2FH,#40HMOV A,R0MOV DPTR,#2020HMOV 45H,P0MOV A,R1MOVC A,A+PCJC LOOP,中的源操作数为立即寻址,目的操作数为直接寻址。中的源操作数为寄存器间接寻址,目的操作数为寄存器寻址。中的源操作数为
5、16位立即寻址,目的操作数为寄存器寻址。中的源操作数和目的操作数都是直接寻址。中的源操作数和目的操作数都为寄存器寻址。中的源操作数为基址加变址寻址,目的操作数为寄存器寻址。中的操作数为相对寻址。,例3-2 判断下列指令是否正确,若不正确请指出错误:MOV A,DPTR MOV DPTR,#03H MOV#80H,R7 MOV B,C,解不正确。A是8位寄存器,DPTR为16位寄存器,不匹配。正确。不正确。#80H为立即数,不能作为目的地址。不正确。B为8位字节寄存器,C为1位位累加器,不匹配。,3.3 数据传送指令,1.通用传送指令MOV,指令格式:MOV,功能:把源操作数所表示的数据传送到目
6、的地址指定的存贮单元之中,而不改变源操作数。即该指令是“复制”,不是“搬家”。,3.3.1内部RAM数据传送指令,通用指令,2)以Rn为目的地址的指令MOV Rn,A;Rn(A)MOV Rn,direct;Rn(direct)MOV Rn,#data;Rn data,1)以累加器A为目的地址的指令MOV A,Rn;A(Rn)MOV A,direct;A(direct)MOV A,Ri;A(Ri)MOV A,#data;A data,4)以寄存器间接地址为目的的地址的指令MOV Ri,A;(Ri)(A)MOV Ri,direct;(Ri)(direct)MOV Ri,#data;(Ri)data
7、,3)以直接地址为目的地址的指令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,5)16位数据传送指令MOV DPTR,#data16;DPTR data16;DPL data70;DPH data158,例3-3 设RAM 40H单元的内容为80H,80H单元内容为47H,P1口的输入状态为0FFH,试判断下列程序执行结果。MOV R0,#40H MOV A,R0MOV R1,AM
8、OV B,R1MOV R1,P1MOV P2,P1,解执行结果为:(A)80H,(B)47H,(R0)40H,(R1)80H,(P1)0FFH,(P2)0FFH,(80H)0FFH。,;R0 40H;A(40H)80H;R1 80H;B(80H)47H;(80H)0FFH;P2 0FFH,1)字节交换指令XCH XCH A,Rn;(A)(Rn)XCH A,direct;(A)(direct)XCH A,Ri;(A)(Ri),2.数据交换指令,例:设(A)=08H,(R7)=0DCH,执行指令 XCH A,R7结果为:(A)=0DCH,(R7)=08H,功能:将累加器A中内容与源操作数互换。,例
9、:(A)=80H,(R0)=30H,(30H)=0FH,执行指令 XCHD A,R结果为:(A)=8FH,(30H)=00H,2)半字节交换XCHD,XCHD A,Ri;(A)低4位(Ri)低4位 功能:累加器A中内容与源操作数低4位交换,高4位不变。,3)累加器高低数字节交换指令SWAP A SWAP A;(A)低4位(A)高4位 功能:A中高4位与低4位互换。,例:(A)=80H,执行SWAP A结果为:(A)08H.,解 XCH A,20H SWAP A MOV R1,21H XCHD A,R1 SWAP A XCH A,20H,例3-4 试用交换指令使片内20H单元的高4位与21H单元
10、的低4位交换。,数据写入堆栈称入栈,数据从堆栈中读出称出栈。,3.栈操作指令,PUSH direct;SP(SP)+1,(SP)(direct)功能:将堆栈指针加1后,片内RAM单元内容送进栈顶单元,原RAM单元内容不变。说明:PUSH指令常用于保护CPU现场。栈操作是字节指令,每次只能压入或弹出1个字节的内容。如PUSH DPTR是错误的,但可以用以下两条指令完成DPTR的入栈。PUSH DPH PUSH DPL,1)入栈指令PUSH,例:设(A)=30H,(B)=80H,(SP)=50H.则执行指令:PUSH A PUSH B,结果为:(51H)=30H,(52H)=80H,(SP)=52
11、H,POPdirect;direct(SP),SP(SP)-1功能:将(SP)内容传送给片内RAM单元,SP内容减1。说明:栈操作要注意先入后出的原则。POP指令常用于恢复CPU现场,2)出栈指令POP,例3-5 试用栈操作指令完成P0和P1内容的互换。解 PUSH P0 PUSH P1 POP P0 POP P1,3.3.2 片外数据存贮器与累加器A 之间的传送指令,MOVX A,DPTR;A(DPTR)MOVX A,Ri;A(Ri)MOVX DPTR,A;(DPTR)(A)MOVX Ri,A;(Ri)(A),说明:片外数据存贮单元与片内RAM之间的数据传送以及片外数据存贮单元之间的数据传送
12、不能直接进行,必须通过累加器A中转。MOVX 20H,2000H及MOVX 3000H,2000H等都是错误的。寻址方式只能是寄存器间接寻址。参与间接寻址的寄存器只有Ri和DPTR两种(3个)。DPTR为16位寄数器,寻址范围为000H0FFFFH共64KB空间。而Ri是8位寄数器,只能寻址000FFH低256单元。,解 MOV DPTR,#2000H MOVX A,DPTR MOV 20H,A MOV DPTR,#2000H MOVX A,DPTR MOV R0,#0FAH MOVX R0,A,例3-6 将片外数据存贮器2000H单元的内容传送到片内的20H单元中;将片外数据存贮器2000H
13、单元的内容传送到片外0FAH单元。,3.3.3程序存贮器向累加器A传送指令,MOVC A,A+PC;A(A)+(PC)MOVC A,A+DPTR;A(A)+(DPTR),说明:程序存贮器只能读出,不能写入,所以其数据传送都是单向的,即从程序存贮器读出数据,并且只能向累加器A传送。ROM片内、片外是统一编址,该指令既可访问片内,又可访问片外程序存贮器。该类指令主要用于查表,又称查表指令。应用时,一般以PC或DPTR确定表格的首址,查表时,根据A中不同的内容查找到表格中的相应项,故此时称PC或DPTR为基址寄存器,A为变址寄存器,寻址方式为基址加变址寻址。使用DPTR作基址寄存器比较灵活,且不易出
14、错。建议尽可能使用MOVCA,DPTR指令。,解法一 以DPTR为基址寄存器,平方表首址可灵活安排在适当的位置如2000H,即平方表的内容从2000H单元放起。程序如下:ORG 1800H MOV DPTR,#2000H MOV A,20H MOVC A,A+DPTR MOV 21H,A ORG 2000H DB 00H,01H,04H,10H,19H,24H DB 31H,40H,51H,64H,,例3-7 以查表方式求出片内RAM中20H单元数的平方值,存入片内21H单元中。,ORG 1000H1000MOV A,20H 1001 ADD A,#03H 1003 MOVC A,A+PC10
15、04 MOV 21H,A1006 RET1007 DB 00H,01H,04H,解法二 以PC为基址寄存器,此时表格须紧跟程序之后,且要计算好表格首址位置。,XCH A,20H XCH A,30H XCH A,20H,例3-8 改正下列指令中的错误,完成其功能:MOV A,2000H;片外RAM 2000H单元内容送入A。MOVX 20H,2000H;片外RAM 2000H单元内容送入片内20H单元。MOVC A,2000H;将ROM 2000H单元内容送入A。MOVX A,A+DPTR;以查表方式将片外RAM单元的内容送入A。XCH 40H,30H;交换片内RAM 30H和40H单元的内容。
16、PUSH AB;将寄存器对AB的内容压入堆栈。,解 MOV DPTR,#2000H MOVX A,DPTR,MOV DPTR,#2000H MOVX A,DPTR MOV 20H,A,MOV DPTR,#2000H MOV A,#0 MOVC A,A+DPTR,无法以查表方式将片外RAM 存贮单元的内容送入A。,PUSH A PUSH B,3.4算术运算类指令,1.不带进位加法指令ADD,ADD A,Rn;A(A)+(Rn)ADD A,direct;A(A)+(direct)ADD A,#data;A(A)+dataADD A,Ri;A(A)+(Ri),3.4.1 加法指令,功能:ADD指令把
17、源操作数与累加器A内容相加,结果存在累加器中。该操作不改变源操作数,影响PSW中的C、AC、OV和P位。说明:ADD指令的目的操作数只能是累加器A,且只有以上4种形式。如ADDB,40H或ADD A,203AH等都是不存在的,非法的。指令中,参加运算的两个8位二进制数,即可看作是8位无符号数(0255),也可以看作是7位带符号数的补码数(-128+127)。,例3-9 试编程计算40H和41H两单元字节数的和,并存放在42H单元。若(40H)=0B3H,(41H)=79H,给出计算结果并判断PSW受影响的位。,解程序如下:MOV A,40H ADD A,41H MOV 42H,A,若(40H)
18、=0B3H,(41H)=79H,则运算结果:若是无符号数,和为12CH;若是有符号数,和为+2CH。(42H)=2CH,(C)=1,(AC)=0,(OV)=0,(P)=1。,2.带进位加法指令ADCC,ADDC A,Rn;A(A)+(Rn)+(C)ADDC A,direct;A(A)+(direct)+(C)ADDC A,#data;A(A)+data+(C)ADDC A,Ri;A(A)+(Ri)+(C),功能:该操作与ADD类似,只是PSW中的进位位C参与运算。带进位加法指令通常用于多字节或多个数加法运算。,解当(C)0时,两指令运行结果一样,为(A)0A4H。当(C)1时,两指令运行的结果
19、不同,相差1。即ADD A,30H的结果为(A)0A4H,而ADDC A,30H的结果是(A)0A5H。显然,ADD指令与C值无关,而ADDC的运行结果与C值有关。,例3-10已知(A)=26H,(30H)=7EH,比较在(C)0、(C)1两种情况下执行 ADD A,30H 和 ADDC A,30H指令的结果。,解 MOV A,30H ADD A,40H;低字节相加 MOV 50H,A MOV A,31H ADDC A,41H;高字节相加 MOV 51H,A ADDC A,#00H;取高相加产生的进位 MOV 52H,A说明:多字节数求和,从低字节开始,最低字节相加用ADD指令,高字节相加用A
20、DDC指令。N字节数相加,结果可能为N+1字节数。为单独取得进位的值,可参考例311。,例3-11 两字节无符号数相加,被加数放在内部RAM30H,31H单元(低位放在前),加数放在内部RAM40H、41H单元。计算两数的和,放在50H52H单元中。,3.增量指令INC,INC A;A(A)+1INC Rn;Rn(Rn)+1INC direct;direct(direct)+1INC Ri;(R)i(Ri)+1INC DPTR;DPTR(DPTR)+1,功能:对A,Rn,内部RAM单元及数据指针DPTR进行加1操作,除INC A影响P外,不影响任何标志位。说明:若原为0FFH,执行该指令后,将
21、变为00H,但不影响进位位C。,其结果为:(A)=00H,(R2)=10H,(R0)=40H,(40H)=01H,(DPTR)=1B00H,PSW中,(P)=0,C及其它位不变。,例3-12(A)=0FFH,(R2)=0FH,(R0)=40H,(40H)=00H,(DPTR)=1AFFH执行下列指令:INC A INC R2 INC R0 INC DPTR,4.十进制调整指令DA A,DA A,例3-13 在20H、21H中分别存放压缩BCD码55和72,试将两数相加,并计算出结果。,解MOV A,20H ADD A,21H DA A,结果(A)=27,C=1如果不使用DAA指令,则结果为0C
22、7H,是错误的。,例3-14 设两个4位BCD码分别存放在30H(十位、个位)和31H(百位、千位)、40H(十位、个位)和41H(百位、千位)。试编程求这两个数的和,结果存放在30H、31H、32H中。,解程序如下:MOV R0,#30H MOV R1,#40HMOV A,R0;取十位、个位ADD A,R1;两数十位、个位相加DA A;调整为BCD码MOV R0,A;存十位、个位INC R0 INC R1MOV A,R0;取千位、百位ADDC A,R1;两数千位、百位和进位位相加DA A;调整为BCD码MOV R0,A;存千位、百位MOV A,#0ADDC A,#0INC R0MOV R0,
23、A;存万位,3.4.2 减法指令,1.带进位减法指令SUBB,SUBB A,Rn;A(A)(Rn)(C)SUBB A,direct;A(A)(direct)(C)SUBB A,Ri;A(A)(Ri)(C)SUBB A,#data;A(A)data(C),功能:指令功能是以A中数为被减数,减去操作数,再减去进位,差存在A中。影响PSW中的C,AC,OV,和P位。说明:MCS-51指令系统中,无不带进位(实为借位)的减法指令。若进行不带借的减法运算,要在运算前使用ADD A,#00H或CLR C等指令将进位标志清0。减法指令中,无BCD码调整。,例3-15 两个双字节数相减,被减数放在30H,31
24、H,减数放在40H,41H中,差放入50H、51H。,解 ADD A,#00H;将进位位清0 MOV A,30H SUBB A,40H;低字节相减 MOV 50H,A MOV A,31H SUBB A,41H;高字节相减 MOV 51H,A说明:多字节相减,从低字节开始,最低字节相减时,应先将进位位清0。,2.减1指令DEC,DEC A;A(A)-1DEC Rn;Rn(Rn)-1DEC direct;direct(direct)-1DEC Ri;(Ri)(Ri)-1,功能:减1运算说明:与INC命令类似,但无DPTR减1指令。若原为00H,执行该指令后,将变为0FFH。例如(A)=10H,(R
25、5)=00H,(30H)=2FH,(R0)=40H,(40H)=0FFH。则执行以下指令:DEC A,DEC R5,DEC 30H,DEC R0结果为:(A)0FH,(R5)=0FFH,(30H)=2EH,(40H)=0FEH,(P)=0,3.4.3 乘法指令MUL,MUL AB,功能:累加器A和寄存器B中的两个无符号8位数相乘,所得16位乘积的低8位放在A中,高8位入在B中。说明:乘法指令影响PSW的状态。执行MUL指令后,C被清0,OV与结果有关,若OV=0,表示乘积小于255(0FFH),只在A中,(B)0;若OV=1,则乘积大于255,(B)0。例如:(A)=20H,(B)=0A0H,
26、执行指令 MUL AB结果:(A)00H,(B)=14H,即积为1400H,(C)=0,(OV)=1,3.4.4 除法指令DIV,DIV AB,功能:两8位无符号数相除,被除数置于累加器A中,除数置于寄存器B中。指令执行后,商存于A中,余数存于B中。说明:该指令执行后,C清0,若除数为0(即寄存器B内数据为0),(OV)=1,表明除0没有意义;若除数不为0,则(OV)=0。例:(A)=0FBH,(B)=12H,则DIV AB结果:(A)=0DH,(B)=11H,(C)=0,(OV)=0,例3-16 编程实现下列运算:FD1D2+D3/D4,其中D1、D2、D3、D4都为非0的8位二进制无符号数
27、。,解 MOV A,#D1 MOV B,#D2 MUL AB;计算D1D2 MOV R2,A;暂存D1D2的结果 MOV R3,B MOV A,#D3 MOV B,#D4 DIV AB;计算D3/D4 ADD A,R2;乘积的低位与商相加 MOV R2,A;存F低位 MOV A,R3 ADDC A,#0;乘积的高位与低位和的进位相加 MOV R3,A;存F高位在R3中,3.5逻辑运算及移位指令,1.逻辑与指令ANL,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
28、,A;direct(A)(direct)ANL direct,#data;direct(direct)data,3.5.1 逻辑运算指令,说明:逻辑运算是按位进行的,对进位标志位C不产生影响。该指令用于屏蔽某些位。,例3-17 将R1中的低4位清0,高4位不变。解 MOV A,#11110000B ANL A,R1 MOV R1,A,结果为:(A)=62H,例:设(A)=7AH,(20H)=0E6H,执行指令 ANL A,20H,2.逻辑或指令ORL,ORL A,Rn;A(A)(Rn)ORL A,direct;A(A)(direct)ORL A,Ri;A(A)(Ri)ORL A,#data;A
29、(A)dataORL direct,A;direct(A)(direct)ORL direct,#data;direct(direct)data,例3-18 将片外RAM 2000H单元的0、1位置1,2、3位清0,其它位不变。解 MOV DPTR,#2000H MOVX A,DPTR ORL A,#00000011B ANL A,#11110011B MOV DPTR,A,3.逻辑异或指令XRL,XRL A,Rn;A(A)(Rn)XRL A,direct;A(A)(direct)XRL A,Ri;A(A)(Ri)XRL A,#data;A(A)dataXRL direct,A,;direct
30、(direct)(A)XRL direct,#data;direct(direct)data,说明:若与0进行异或运算,结果保持不变;若与1进行异或运算,结果取反;自身异或等效于清0。例 XRL A,A结果为:(A)0,例3-19 将20H单元内容1、3、5、7位保持不变,0、2、4、6位取反。,解XRL 20H,#01010101B 若(20H)=11110110 则执行指令:,结果为(20H)=10100011B,4.累加器清0指令 CLR,CLR A,CPL A,5.累加器取反指令 CPL,例如(A)0E6H执行CPL A,结果为:(A)=19H说明:1)取反即为逻辑非运算。2)MCS-
31、51单片机没有求补指令,若对累加器A中数求补,则程序如下:CPL A INC A,3.5.2 移位指令,循环左移 RL A;An+1An,A0 A7循环右移 RR A;An An+1,A7 A0进位循环左移 RLC A;An+1 An,A0 C,C A7带进位循环右移 RRC A;An An+1,A7 C,C A0,例3-21 分析下列程序段实现的功能:MOV A,direct RL A MOV R1,A RL A RL A ADD A,R1 MOV direct,A,解各指令实现的功能依次如程序右边注译,可知该程序实现的功能是将存贮单元的数乘以10。,;取数设为D0;D02;(R1)2D0;
32、2D02;4D02;8D0+2D0;存数10D0,例3-20 将20H单元存放的无符号数除2。解 ADD A,#0;C清零 MOV A,20H RRC A MOV 20H,A,3.6位操作指令,MOV C,bit;C(bit)MOV bit,C;bit(C),例3-22 将20H位的内容送至50H位,并要求不改变C的状态。解 MOV 10H,C;保护C内容 MOV C,20H MOV 50H,C MOV C,10H;恢复C内容,3.6.1 位传送指令MOV,说明:多数位操作指令由C参与,C称位累加器。位操作指令寻址方式为位寻址。,3.6.2 位置位/复位指令(修改位内容命令),1.位置位(置1
33、)命令SETB SETB C;C 1 SETB bit;bit 12.位复位(清0)命令 CLR C;C 0 CLR bit;bit 0,说明:位置位/复位命令可以方便改变位空间的单个位的内容,十分灵活。例如许多运算要先将C清零,我们用以用ADD A,#0来清零,也可以直接用CLR C指令。,3.6.3 位运算指令,1.逻辑与指令ANL ANL C,bit;C(C)(bit)ANL C,/bit;C(C)(/bit)2.逻辑或指令ORL ORL C,bit;C(C)(bit)ORL C,/bit;C(C)(/bit)3.逻辑非(求反)指令CPL CPL bit;bit(/bit),解 MOV
34、C,bit1 ANL C,/bit2;C(bit1).(/bit2)MOV bit0,C MOV C,bit2 ANL C,/bit1;C(/bit1).(bit2)ORL C,bit0 MOV bit0,C,例3-23 设bit0,bit1,bit2为三个位地址,试编程实现异或运算 bit0=bit1bit2=(bit1)(/bit2)+(/bit1)(bit2),程序如下:MOV C,P0.1 ANL C,/P0.0 ORL C,/P0.2 MOV P1.7,C,例3-24 编程实现图3-9的逻辑功能。,3.7控制转移类指令,程序的顺序执行是由PC自动加1实现的,要改变程序的执行顺序,实现
35、分支转向,必须通过强迫改变PC值的方法来实现,这就是控制转移类指令的基本功能。控制转移类指令可以控制程序根据不同情况执行不同的程序段,令单片机应用系统做出相应的动作。控制转移类指令使单片机具有“智能化”功能。控制类指令的掌握使用较复杂,包括无条件转移指令、条件转移指令及子程序调用返回指令。,3.7.1 无条件转移指 今,1.长转移指令LJMP LJMP addr16;PC addr16功能:指令执行后将16位地址(addr16)传送给PC,从而实现程序转移到新的地址开始运行。说明:该指令可实现64KB范围的任意转移。,SJMP rel;PC(PC)+2+rel功能:执行指令后,程序从当前位置向
36、前或向后跳转rel个单元运行。说明:该指令中寻址方式称相对寻址。rel为8位带符号补码数,因此所能实现的程序转移是双向的,若rel为正数,则向前转移,若rel为负数向后转移。转移相对范围图是-128127H共256个单元;注译中的“PC(PC)+2+rel”是这样得来的:注译中“(PC)”是该指令执行前的值,前面的“PC”是指指令执行后的值。因“SJMP rel”指令存放在ROM中占用2个字节单元(为双字节指令),故程序从指令执行后“当前位置”向前或向后跳转rel个单元,也就是从指令执行前的位置向前或向后跳转2rel个单元。,2.短转移指令SJMP,AJMP addr11;PC(PC)+2,P
37、C100 addr11 功能:addr11的11位数取代该指令执行后程序指针PC的低11位PC100,程序根据PC值转移运行。说明:addr11为11位无符号数,程序转移最大范围为2KB。LJMP,STMP,AJMP功能相同,只是转移范围不同。,3.绝对转移指令AJMP,JMP A+DPTR;PC(A)+(DPTR)功能:由A及DPTR的内容决定程序转移的目的地址。说明:DPTR为基址寄存器,A为变址寄存器,为基址加变址寻址方式。把DPTR值固定,赋与A不同的值,则可实现程序的多分支转移。,4.变址转移指令JMP,3.7.2 条件转移指令,1.测试转移指令 1)累加器A判0转移指令JZ rel
38、;若(A)=0,转移,PC(PC)+2rel;若(A)0,顺序执行。JNZ rel;若(A)0,转移,PC(PC)+2rel 2)进位位测试转移指令JC rel;若(C)=1,转移,PC(PC)+2relJNC rel;若(C)=0,转移,PC(PC)+2rel,所谓条件转移就是程序的转移是有条件的,当指令中规定的条则满足时,程序转移,否则程序不转移,仍顺序执行。,3)位单元测试转移指令JB bit,rel;若(bit)=1,转移,PC(PC)+3relJNB bit,rel;若(bit)=0,转移,PC(PC)+3relJBC bit,rel;若(bit)=1,转移,PC(PC)+3rel;
39、同时将bit位清零。功能:根据测试条件决定程序是否转移执行。说明:若条件满足程序转移执行;若条件不满足,顺序执行。位单元测试转移指令为三字节指令,故执行该类指令,若条件满足转移时,PC(PC)+3+rel。其它测试转移指令为双字节指令,条件满足转移时,PC(PC)+2+rel。,解 MOV R0,#DATA2;赋首址 MOV DPTR,#DATA1 LOOP1:MOVX A,DPTR;取数 JZ LOOP2;判断是否为0 MOV R0,A;不为0存数 INC R0;准备取下一个数 INC DPTR SJMP LOOP1;重复取数过程 LOOP2:RET;为0结束,例3-25 将外部RAM的一个
40、数据块(首址为DATA1)传送到内部RAM(首址DATA2),遇到传送的数据为零时停止。,格式为:CJNE,relCJNE A,direct,rel;累加器A与内部RAM的direct 单元不等转移。CJNE A,#data,rel;累加器A与立即数data不等转移CJNE Rn,#data,rel;寄存器Rn与立即数data不等转移CJNE Ri,#data,rel;间接寻址的片内RAM单元 与立即数data不等转移,2.比较不相等转移指令CJNE,说明:数据比较转移指令多位三字节指令。利用该类指令不但可以实现程序的转移功能,也可以用以比较两数值的大小。指令执行后进位位C的状态相当反映了被比
41、较数与比较数相减有无借位。,解 MOV R0,#DATA LOOP1:CJNE R0,#64H,LOOP2 SJMP LOOP3LOOP2:INC R0 SJMP LOOP1LOOP3:MOV A,R0,例3-26 找出片内RAM的DATA为首址的数据块中第一个等于100的数,并将其地址存入A中。,DJNZ Rn,rel DJNZ direct,rel,功能:寄存器Rn或direct单元内容减1,如果结果为零,则程序顺序执行;如果还没有减到0,则程序转移。说明:这两条指令主要用于控制程序循环,又称循环指令。预先赋值Rn或RAM单元,以控制循环次数。,3.减1不为0转移指令DJNZ,解分析:这是
42、一个重复操作过程,可以使用循环指令。30H7FH共50H个单元,循环次数为50H。程序如下:MOV R7,#50H MOV R0,#30H NEXT:MOV R0,#0 INC R0 DJNZ R7,NEXT,例2-27 将内部RAM的30H7FH单元清0。,解 MOV DPTR,#2000H;数据传送的源地址 PUSH DPL;保存源地址 PUSH DPH MOV DPTR,#3000H;数据传送的目的地址 MOV R2,DPL;保存目的地址 MOV R3,DPH LOOP:POP DPH;取源地址 POP DPL MOVX A,DPTR;从源地址单元取数 INL DPTR;下一个单元源地址
43、 PUSH DPL;保存源地址 PUSH DPH MOV DPL,R2;取目的地址 MOV DPH,R3 MOVX DPTR,A;将数据存入目的地址 INC DPTR;下一个目的地址 MOV R2,DPL;保存目的地址 MOV R3,DPH DJNZ 30H,LOOP;判断数据传送是否结束,例3-28 把从2000H开始的片外RAM单元中的数据传送到从3000H开始单元中,数据个数存放在片内RAM30H单元中。,3.7.3 子程序调用返回指令,1.长调用指令LCALL LCALL addr162.绝对调用指令ACALL ACALL addr113.返回指令 RET RETI;中断服务子程序返回
44、指令,3.7.4 空操作指令NOP NOP;PC(PC)+1,3.8MCS-51指令机器代码,指令的存贮和运行是以二进制代码的形式进行的,这些代码称机器指令或机器码。机器指令中的代码长度各有不同,有单字节、双字节和三字节3种,对应指令分别称为单字节指令,双字节指令和三字节指令。,3.8.1 机器代码及其存贮,3000H E8 MOV A,R0 3001H 24 0F ADD A,#0FH 3003H 90 20 00 MOV DPTR,#2000H 3006H F0 MOV DPTR,A,3.8.2 机器码的查表计算,1.指令中带有立即数、直接地址、工作寄存器的机器码,每条汇编指令都有与之一一
45、对应的机器指令,亦即机器码,可由MCS-51指令表(附录6)中查出。某些指令码由表中直接给出,还有一些须经过简单的推算方能得出。,指令中的立即数、直接地址直接参与编码。,解查表,指令PUSH 80H 属PUSH direct 形式,PUSH direct的代码项为:C0 direct,所以PUSH 80H的代码为:C0 80 表中指令MOV DPTR,#data16代码项为:90 data158 data70,故MOV DPTR,#2000H的代码为:90 20 00 表中指令ADD A,R5的代码项为 282F,则可知ADD A,R5的代码为 2D,例3-29 分别给出PUSH 80H、MO
46、V DPTR,#2000H、ADD A,R5的代码。,2.非相对址控制转移类指令的机器码,1)长转移及长调用指令 在LJMP addr16及LCALL addr16中,16位地址往往是用地址标号表示的,这时须将地址标号所在指令的首址计算出。例:标号地址START为0100H,标号LOOP为8100H,则 START:LCALL LOOP的代码为:128100分别存贮在0100H、0101H和0102H的ROM单元中。,指令AJMP addr11的代码是这样生成的:addr11的高3位与00001合成一个字节,add11的低8位为第二个字节,即:a10a9a80 0001 a7a6a5a4 a3
47、a2a1a0。指令ACALL add11与之类似,代码这样生成:addr11的高3位与10001合成一个字节,add11的低8位为第二个字节,即:a10a9a81 0001 a7a0。例3-30 标号地址HERE为2070H,LOOP为235AH,则指令 HERE:AJMP LOOP,HERE:ACALL LOOP代码为何?解235AH即0010 0011 0101 1010,其低11位分别为01101011010,则 AJMP指令的机器码为:0110000101011010即61 5A ACALL指令的机器码为:0111000101011010即71 5A,2)绝对转移及绝对调用指令机器码,
48、3.相对转移指令的机器码,1)当程序向前转移时若指令为双字节指令:rel=目的地址(源地址+2)若指令为三字节指令(比较转移类指令):rel=目的地址(源地址+3)2)当程序向后转移时,偏移量为负,用补码表示,则:若指令为双字节:rel目的地址(源地址+2)补 FF(源地址+2目的地址)+1 FEH(源地址目的地址)若指令为三字节指令:rel=FDH(源地址目的地址),例3-31 若LOOP,LOOP1,LOOP2的标号值分别为0100H,0123H,008AH,则给出下列4条指令的代码。LOOP:SJMP LOOP1 LOOP:CJNE A,#64H,LOOP1 LOOP:DJNZ R0,L
49、OOP2 LOOP:SJMP LOOP解关键是计算偏移量该指令为双字节指令rel=LOOP1-(LOOP+2)=0123-(0100+2)=21H指令为:8021该指令为三字节指令 rel=LOOP1-(LOOP+3)=0123-(0100+3)=20H 指令为:B86420该指令向后转移rel=FEH-(LOOP1-LOOP2)=FEH-(0100H-008AH)=88H则指令为:D8 88rel=FEH-(LOOP-LOOP)=FEH指令为:80FE,3.9MCS-51单片机指令小结,3.9.1 MCS-51单片机指令系统组成 MCS-51汇编语言有42种操作码助记符来描述33种操作功能。
50、功能助记符与不同寻址方式组合,得到111条指令,分为5大类:1)数据传送类指令29条2)运算类指令24条3)逻辑运算及移位类指令24条4)位操作类指令17条5)控制转移类指令17条 另外,MCS-51指令根据书写格式,可分为单操作数、双操作数、三操作数和无操作数;按照长度不同,分为单字节、双字节和三字节指令;根据执行时间的长短,分为单周期、双周期和四周期指令。,3.9.2 指令执行时间,单片机的工作是在时钟脉冲的触发下进行的,时钟脉冲由晶体振荡脉冲二分频形成。一个时钟周期等于两个振荡周期。MCS-51单片机在工作时,CPU在每六个连续时钟周期内的每一时刻重复进行着固定的动作,CPU就是通过这些