《单片机指令系统3-1指令格式.PPT》由会员分享,可在线阅读,更多相关《单片机指令系统3-1指令格式.PPT(48页珍藏版)》请在三一办公上搜索。
1、第三章 单片机指令系统,3-1 指令格式,3-2 指令寻址方式,3-3 MCS-51指令系统,一.汇编语言指令格式标号:操作码 操作数1,操作数2;注释例:LOOP:MOV A,#40H;取参数,1.标号:指令的符号地址。2.操作码:指明指令功能。,3.操作数:指令操作对象。包括数据、地址、寄存器名及约定符号。4.注释行:说明指令在程序中的作用。操作码和操作数是指令主体。,MOV_move传送XCH_exchange交换ANL_and logic与逻辑运算XRL_exclusive or异或运算MUL_Multiply乘法RR_rotate right右循环SJMP_short jump短跳转
2、RET_return 子程序返回,3-1 指令格式,二.机器语言指令格式,操作码 操作数1 操作数2分为单字节、双字节和三字节指令。,指令中操作码和操作数是指令主体,称为指令可执行部分,附录指令表中可查出对应指令代码。,举例:汇编语言:机器语言:MOV A,R0E8HMOV R6,#32H7E 32HMOV 40H,#64H75 40 64H,11101000,三.指令描述符号介绍,在介绍指令之前,先把描述指令的一些符号的意义作些介绍。,Rn当前工作寄存器区中的8个寄存器R.0R7(n=07)。Ri当前工作寄存器区中的2个工作寄存器R.0、R1(i=0,1)。direct8位的内部数据存储器单
3、元中的地址。#data包含在指令中的8位常数。#data16包含在指令中的16位常数。addr1616位目的地址。addr1111位目的地址。rel8位带符号的偏移字节,简称偏移量。DPTR数据指针,可用作16位地址寄存器。bit内部RAM或专用寄存器中的直接寻址位。,A累加器。B专用寄存器,用于乘法和除法指令中。C进位标志或进位位,或布尔处理机中的累加器。间址寄存器或基址寄存器的前缀,如Ri,DPTR。/位操作数的前缀,表示对该位操作数取反,如/bit。单元中的内容。()由寻址的单元中的内容。箭头左边的内容被箭头右边的内容所代替。,3-2 指令寻址方式,3-2-1 寻址方式和操作数类型,3-
4、2-2 寻址方式一.立即寻址方式指令中给出实际操作数据(立即数)。举例:8位立即数:MOV A,#40H;A40H 16位立即数:MOV DPTR,#2100H;DPTR2100H,一、寻址方式 是指指令中确定操作数的形式。,二、操作数类型位(b)位寻址区中的一位二进制数据字节(B)8位二进制数据字(W)16位双字节数据,二.直接寻址方式,指令中直接给出操作数地址的寻址方式,能直接寻址的存储空间为内部RAM和特殊功能寄存器(SFR)。,例2:MOV PSW,#20H;PSW#20H PSW为直接寻址寄存器的符号地址。,例1:MOV A,30H;A(30H),思考题:直接寻址方式指令和立即寻址方
5、式指令的形式有什么不同?,三.寄存器寻址方式以通用寄存器的内容为操作数的寻址方式。例:MOV A,R0;AR0设指令执行前 A=20H,R0=40H,执行指令后,A=?,R0=?,四.寄存器间接寻址方式 以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。存放地址的寄存器称为间址寄存器或数据指针,包括R0,R1,DPTR,SP等。例:MOV A,R0;A(R0)设指令执行前 A=20H,R0=40H,地址为40H存储器单元内容如图。执行指令后,A=?,R0=?,(40H)=?,30H,40H,30H,40H,40H,0100 0000,A,0010 0000,R0,0100 0000,R0
6、,40H,五.变址寻址方式 由基址寄存器PC或DPTR中内容加上偏移量之和形成操作数的地址的寻址方式。偏移量由累加器A提供。,例:MOVC A,A+DPTR;A(A+DPTR)设指令执行前 A=09H,DPTR=2000H,存储器单元内容如图所示。执行指令后,A=?DPTR=?,12H,2000H,六.位寻址方式 对位地址中的内容作位操作的寻址方式。它其实是一种直接寻址方式。例:MOV C,40H;Cy(位地址40H)设指令执行前 Cy=1,位地址40H存储器单元如上图,执行指令后,Cy=?,0,七、相对寻址,以当前程序计数器PC的内容为基础,加指令给出的一偏移量形成新的PC值的寻址方式。,2
7、008,例:SJMP 06H;PC PC+2+06H 假设该指令在程序存储器2000H(即PC=2000H),则执行指令后,PC=?,程序的执行过程如右图所示。即:程序转移到2008H处执行。,2008H,3-3MCS-51指令系统,指令按功能可分为如下几类:数据传送、算术运算类、逻辑运算、程序转移、子程序调用及返回、位操作指令。,3-3-1 数据传送指令实现寄存器、存储器之间的数据传送。一.内部传送指令:片内数据存储器数据传送。二.外部传送指令:片外数据存储器数据传送。三.交换指令:片内数据存储器数据传送。四.堆栈操作指令:片内数据存储器数据传送。五.查表指令:程序存储器数据传送。,一、内部
8、传送指令:实现片内数据存储器中数据传送。指令格式:MOV 目的操作数,源操作数 寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间址。,指令机器码:E8EFE5 directE6、E7 74 data F8FFA8AF direct 787F data,MOV A,Rn;ARnMOV A,direct;A(direct)MOV A,Ri;A(Ri)MOV A,#data;AdataMOV Rn,A;RnAMOV Rn,direct;Rn(direct)MOV Rn,#data;Rndata,MOV dir,A;(dir)AMOV dir,Rn;(dir)RnMOV dir1,dir2;(dir
9、1)(dir2)MOV dir,#data;(dir)dataMOV dir,Ri;(dir)(Ri)MOV Ri,A;(Ri)AMOV Ri,dir;(Ri)dirMOV Ri,#data;(Ri)dataMOV DPTR,#data16;DPTRdata16,指令机器码:F5 dir888F dir85 dir2 dir175 dir data 8687 dirF6F7 dir A6A7 dir7677 data90 data16,例1:顺序执行下列指令序列,求每一步执行结果。,MOV A,#30HMOV 40H,AMOV R0,#20HMOV R0,40HMOV 30H,20H,例2:用
10、两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。,;A=30H;(40H)=30H;R0=20H;(20H)=30H;(30H)=30H,解2:MOV R0,#60H MOV A,R0,解1:MOV A,60H,说明:,4.只有指令表中的指令才有对应指令代码,计算机才能执行。编程时,不能随意创造发明指令。,1.一条指令中不能同时出现两个工作寄存器:非法指令:MOV R1,R2MOV R2,R0,2.间址寄存器只能使用 R0、R1。非法指令:MOV A,R2,3.SFR区只能直接寻址,不能用寄存器间接寻址。非法指令:MOV R0,#80HMOV A,R0,二、外部传送指令实现片外
11、数据存储器和累加器A之间的数据传送。,指令格式:MOVX 目的操作数,源操作数寻址方式:片外数据存储器用寄存器间址方式。1.DPTR作16位数据指针,寻址64KB片外RAM空间MOVX A,DPTR;A(DPTR)MOVX DPTR,A;(DPTR)A2.Ri作8位数据指针,寻址256B片外RAM空间MOVXA,Ri;A(P2Ri)MOVXRi,A;(P2Ri)A,指令机器码,E2E3HF2F3H,E0HF0H,例3:将片外数据存储器数据从2000H传送到2100H。,MOV DPTR,#2000HMOVX A,DPTRMOV DPTR,#2100HMOVX DPTR,A,习 题:将片外RAM
12、 0000H单元的数据传送到片内RAM地址为60H的单元。,;DPTR=2000H;A=X;DPTR=2100H;(2100H)=X,片外数据存储器不能直接寻址。下列为非法指令:MOVX A,2000H MOVX 2100H,2000H,思考题:为什么对DPTR的数据传送使用内部传送指令?,三、交换指令 实现片内RAM区的数据双向传送。,1.字节交换指令XCH A,Rn;A RnXCH A,Ri;A(Ri)XCH A,direct;A(direct),习题:将片内RAM60H单元与61H单元的数据交换。,例4:设A=29H,(2AH)=38H,执行指令 XCH A,2AH后,A=?(2AH)=
13、?,38H,29H,XCH 60H,61H 对吗?,指令机器码:C8CFHC6C7H C5 dir,2.半字节交换指令,XCHD A,Ri;A03(Ri)03 SWAP A;A47 A03,例5:将片内2AH和2BH单元中的ASCII码转换成压缩式BCD码存入20H单元。,A,00000000,00H,00001000,10000000,10000101,08H,80H,85H,MOV A,#00H,MOV R0,#2AH,MOV R1,#2BH,XCHD A,R0,SWAP A,XCHD A,R1,MOV 20H,A,00000000,00H,00000000,00H,85H,R1,R0,习
14、题:交换片内RAM 40H单元和 41H单元的低半字节。,指令机器码:D6D7HC4,四、堆栈操作指令入栈指令:PUSH dir;SPSP+1,(SP)(dir)出栈指令:POP dir;(dir)(SP),SPSP-1,例:设 A=02,B=56H,执行下列指令后,SP=?,A=?,B=?,SP,SP 02,SP 56H 02,56H 02HSP,SP 56H 02,SP 56H 02,56H SP 02,02H,A,56H,SBR:MOV SP,#30H;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H POP B POP A,机器码:C0 dirD0 dir
15、,PC,PC,PC,PC,PC,PC,B,00H,01H,56H,02H,五、查表指令 实现从程序存储器读取数据到A累加器,只能使用变址间接寻址方式。多用于查常数表程序,可直接求取常数表中的函数值。,1DPTR为基址寄存器 MOVCA,A+DPTR;A(A+DPTR)查表范围为 64KB 程序存储器任意空间,称为远程查表指令。2PC为基址寄存器MOVCA,A+PC;A(A+PC)常数表只能在查表指令后256B范围内。,例:查表法求Y=X2。设X(0X15)在片内RAM的20H单元中,要求将查表求Y,存入片内RAM的21H单元。,解法1:ORG 1000HSQU:MOV DPTR,#TAB;确定
16、表首地址(基地址)MOV A,20H;取X(偏移量MOVC A,A+DPTR;查表求Y=X2MOV 21H,A;保存YRET;子程序结束;其它程序段ORG 2000H;常数表格首地址TAB:DB 00,01,04,09,225;平方表,解法2:指令地址 源程序 ORG 1000H;程序起始地址 1000H SQU:MOV A,20H;取X 1002H ADD A,#03H;修正偏移量 1004H MOVC A,A+PC;查表求Y=X2 1005H MOV 21H,A;存结果 1007H RET;子程序结束 1008H TAB:DB 00,01,04;平方表 100BH DB 09,225,思考
17、题:当0X255时,如何用查表法编程求Y=X2。,习题:找出指令错误并改正:,1MOV A,#1000H;A1000H2MOVX A,1000H;A(1000H)片外RAM3MOVC A,1000H;A(1000H)片外ROM4MOVX 60H,A;片外RAM(60H)A5MOV R0,60H;片内RAM:(61H)(60H)MOV 61H,R06.XCH R1,R2;R1R27.MOVX DPTR,#2000H;DPTR2000H8.MOVX 60H,DPTR;片内RAM片外RAM,3-3-2 算术运算指令,该类指令共24条。主要是进行无符号数的四则运算。与数据传送指令不同,多数算术运算指令
18、会影响标志位的状态,即CPU执行算术运算指令后,根据数据操作情况自动设置标志位的状态。,MCS-51 的程序状态字寄存器 PSW 为标志寄存器。其格式如下:,其中标志位(自动设置状态)为CY、AC、OV和P。用户选择位(编程设置状态)有RS0、RS1和F0。,一加、减指令1.加法指令,0011 1011+0011 1011 0111 0110,76H 0 0 1 1,1)不带进位加法:ADD A,源操作数(影响Cy、OV、AC、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 例1
19、:A=3BH,PSW=0,执行指令 ADD A,#3BH求:A=,Cy=,OV=,AC=,P=,PSW=?,01000001=41H,解:OV=Cy7Cy6=0,无进位Cy=0,产生辅助进位AC=1,A中数据的个数为奇数,P=1。,1001 1010 1110 0011+0 1 0111 1101,2)带进位加法:ADDC A,源操作数(影响Cy、OV、AC、P)ADDC A,Rn;A A+Rn+C ADDC A,direct;A A+(direct)+C ADDC A,Ri;A A+(Ri)+C ADDC A,#data;A A+#data+C 其中:C来自PSW状态寄存器中的进位位C。,7
20、DH 1 1 0 0,例2:A=9AH,R2=E3H,PSW=0,执行指令ADDC A,R2 后求:A=,Cy=,OV=,AC=,P=,PSW=?,10000100=84H,带进位加法指令ADDC用于多字节运算,例:设双字节数 X 存在片内RAM 41H、40H单元,Y存在42H、43H单元,编程求 Z=X+Y,并存入片内RAM单元44H、45H、46H。,ADDS:MOV A,40HADD A,42HMOV 44H,AMOV A,41HADDC A,43HMOV 45H,AMOV A,#0ADDC A,#0MOV 46H,ARET,;取被加数低字节;加上加数低字节;保存和的低字节;取被加数高
21、字节;加上加数高字节;保存和的高字节;求高字节进位;子程序结束,;低字节相加;高字节相加;计算高字节进位;子程序结束,2带借位减法指令 SUBB A,源操作数(影响Cy、OV、AC、P),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,00 0 0 0 0,习题:编程求双字节减法。设X、Y存在片内 RAM 60H起始单元,计算 Z=X-Y。,例:A=5AH,R2=5AH,Cy=0,执行下列指令SUBB A,R2求:A=,Cy=,OV=,P=,AC=?,3.
22、增量、减量指令,INC 单操作数;加1指令 INC A;A A+1 INC Rn;Rn Rn+1 INC direct;(direct)(direct)+1 INC Ri;(Ri)(Ri)+1 INC DPTR;DPTR DPTR+1DEC 单操作数;减1指令 DEC A;A A-1 DEC Rn;Rn Rn-1 DEC direct;(direct)(direct)-1 DEC Ri;(Ri)(Ri)-1,注意:没有指令 DEC DPTR 可用指令 DEC DPL 代替,二、乘除指令,MUL AB;BAAB,Cy0,;当积高字节B=0,OV0;B0,则OV1,例:A=60H(96),B=C0
23、H(192),执行指令 MUL AB 后,求:A=,B=,Cy=,OV=,P=?解:96 192=18432(4800H),00H 48H 0 1 0,12H 0CH 0 0 0,例:A=F6H(156),B=0DH(13),执行指令 DIV AB 后求:A=,B=,Cy=,OV=,P=?解:156 13=18(12H),余数=12(0CH)。,思考题:如何实现多字节数据的乘除运算。,DIV AB;AB,A商,B余数,Cy0,;当除数B=0,OV1;B0,则OV0,十进制加法指令:ADD A,源操作数DA A带进位十进制加法指令:ADDC A,源操作数DA A,作业:BCD码加法编程。设X、Y
24、为4位压缩BCD码,求 Z=X+Y。,三、BCD调整指令:DAA;对 A 中加法结果进行调整,且必须跟;在ADD或ADDC指令之后。,1)“与”操作指令 ANL A,Rn;A A Rn ANL A,direct;A A(direct)ANL A,Ri;A A(Ri)ANL A,#data;A A#data,2)“或”操作指令 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)(di
25、rect)#data,3-3-3 逻辑运算与循环类指令,逻辑运算指令共有24条。主要用于对8位数进行逻辑“与”、“或”、“异或”、取反、清零以及循环移位。,5)8位循环指令 RL A;A循环左移一位 RR A;A循环右移一位,3)“异或”操作指令 XRL A,Rn;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,4)求反与清除指令 CPL A;A A CLR A;A 0
26、,6)9位循环指令RLC A;带Cy循环左移一位RRC A;带Cy循环右移一位,例2:A=23H,执行指令 CPL A 后,A=?解:23H取反为DCH。,例1:A=23H,(20H)=40H,执行指令 ANL A,20H 后 A=?解:23H40H=00H,例3:A=20H,执行指令 RL A 后,A=?解:A中的各位向左移1位后,A=40H。,00H,DCH,40H,例4:设 A=11000101,Cy=0,分别执行下列单条指令:CPL A 求:A=,Cy=RL ARLC A,10001010 1,例5:编程将寄存器 R6R5 中的双字节数X左移一位。,CLR CMOV A,R5RLC A
27、MOV R5,AMOV A,R6RLC AMOV R6,A,;Cy=0,设 R6=55H,R5=AAH,;R6=01010101,R5=10101010,Cy=0,;R6=01010101,R5=01010100,Cy=1,;R6=10101011,R5=01010100,Cy=0,思考题:如何将寄存器R2中的数据奇数位取反,偶数位不变?,3-3-4 转移指令 转移指令通过改写PC的当前值,从而改变CPU执行程序的顺序,使程序发生跳转。,按转移条件分类:1)无条件转移:执行无条件转移指令,程序无条件转移到指定处。2)条件转移:指令中给出转移条件,执行指令时,先测试条件,若满足条件,则程序发生转
28、移,否则,仍顺序执行程序。,按转移方式分类:,1)绝对转移:指令给出转移目的的绝对地址 nn,执行指令后,PCnn。,2)相对转移:指令给出转移目的与转移指令的相对偏移量e,执行指令后,PCPC+e。,一.无条件转移指令 1.长转移指令:LJMP addr16;PC addr16 指令机器码:02 addr16指令转移范围:64KB,2.绝对转移指令:AJMP addr11;PCPC+2;PC100pn100;PC1511不变 指令机器码:a108 00001,a70 指令转移范围:2KB 转移时要求转移前后保持 PC1511不变。,相对偏移量 rel 的计算式:rel=目的指令地址-(转移指
29、令地址+指令字节数),3.短转移指令:SJMP rel;PCPC+2+rel指令机器码:80H,rel 相对偏移量 rel为8位补码。指令转移范围:前128后127字节,编程时,用标号代替转移目的地址,转移指令的操作数交给汇编程序计算。LJMP NEXT AJMP NEXT SJMP NEXT NEXT:,例:计算转移指令的相对偏移量 rel,并判断是否超出转移范围。,相对偏移量=2150H-(2130H+2)=001EH,只取低8位:e=1EH 指令机器码:801EH,习题:计算程序中转移指令的相对偏移量 e,并判断是否超出转移范围。地址 源程序2130H LOOP:21B0H SJMP L
30、OOP,指令地址源程序2130H SJMP NEXT 2150HNEXT:MOV A,R2,4间接转移指令(多分支转移指令)JMP A+DPTR.;PCA+DPTR指令机器码 73H,指令转移范围64KB。,KEY:MOV DPTR,#KTAB MOV A,40H ADD A,A JMP A+DPTRKTAB:AJMP FUNC0 AJMP FUNC1 FUNC0:FUNC1:,应用:处理功能键。要求不同功能键执行不同程序段。设每个功能键对应一个键值 X(0XFH)。设X已存入片内RAM的40H单元中。若X=0,则执行程序段FUNC0若X=1,则执行程序段FUNC1。,二条件转移指令,1.判零
31、转移指令JZ rel;若A=00H,PCPC+2+rel(转移),;若A00H,PC不变(不转移),条件转移指令形成程序的分支,赋予计算机判断决策能力。转移条件:1)标志位的状态 2)位地址中的状态,JNZ rel;PCPC+2+rel(转移);若A=00H,PC不变(不转移),2.判Cy转移指令JC rel;Cy=1则转移(PCPC+2+rel),;Cy=0不转移 JNC rel;Cy=0则转移(PCPC+2+rel),;Cy=1不转移,3.判位转移指令JB bit,rel;(b)=1转移(PCPC+3+rel),;否则不转移 JNB bit,rel;(b)=0转移(PCPC+3+rel),
32、;否则不转移,JBC bit,rel;(b)=1转移(PCPC+2+rel),;且(bit)0,否则不转移,4.比较不相等转移指令:CJNE A,direct,rel;若A(direct),则转移;(PC PC+3+rel),否则程序顺序执行,CJNE A,#data,rel;若A#data,则转移;(PC PC+3+rel),否则程序顺序执行 CJNE Ri,#data,rel,6循环转移指令:DJNZ Rn,rel;Rn Rn-1,若Rn 0,则转移;PC PC+2+rel;否则,程序顺序执行。DJNZ direct,rel;direct(direct)-1,;若(direct)0,则转移
33、(PC PC+3+rel);否则,程序顺序执行。,例:用于循环结构程序。设要求程序循环执行100次MOV R2,#64H;设循环计数器初值LOOP:;多次循环程序段 DJNZ R2,LOOP;循环控制;循环结束,说明:CJNE指令对标志C有影响。若第一操作数大于或等于第二操作数,则C=0;否则C=1。利用对C的判断,可使这几条指令实现两操作数相等与否的判断,还可完成两数大小的比较。,3-3-5 子程序调用和返回指令,子程序调用和返回指令也使程序发生转移。子程序调用过程(如右图):,一长调用指令LCALL addr16;PCPC+3,;SPSP+1,(SP)PCL,SPSP+1,(SP)PCH;
34、PCaddr16addr16为子程序起始地址,编程时可用标号代替。指令机器码:12 addr16 指令调用范围:64KB,与转移指令不同,转移时,先用堆栈保存当前地址。,二绝对调用指令ACALL addr11;PCPC+2;SPSP+1,(SP)PCL,SPSP+1,(SP)PCH;PC100addr11,PC1511不变addr11为子程序首地址指令机器码:a10810001,a70 指令调用范围 2KB。,三子程序返回指令RET;PCH(SP),SPSP-1,;PCL(SP),SPSP-1,RET指令机器码为22HRET指令从堆栈弹出保存的PC地址,实现子程序返回。,RETI机器码为:32
35、HRETI指令从堆栈弹出保存的PC地址,实现中断子程序返回。,RETI;PCH(SP),SPSP-1,;PCL(SP),SPSP-1,20H 92H,21H 53H,SP,SP,SP,SP,SP,PC,2000H,208FH,2092H,2100H,2150H,2153H,2200H,2250H,2251H,2153H,2092H,21FFH,2200H,SP,SP,SP,SP,SP,SP,SP,SP,MAIN:MOV SP,#30H;设置栈底 LCALL SUB;调用子程序 SUB:;子程序段 RET;返回主程序,例:子程序调用,注意:1.子程序起始指令要使用标号,用作子程序名。2.执行返回
36、指令RET之前,保证栈顶内容为主程序返回地址,以便正确返回主程序。,常用格式:MAIN:;主程序LCALL SUBR;调用SUBRSUBR:;子程序首地址RET;子程序返回,3-3-6 布尔变量操作指令 对片内RAM中位寻址区操作。位累加器Cy和位地址bit。,一位传送MOV C,bit;Cy(bit)MOV bit,C;(bit)Cy,例:将位地址20H的一位数传送到位地址30H中:MOV C,20H MOV 30H,C二位清0、置1、取反:CLR、SETB、CPL:CLR C;Cy0,CLR bit;(bit)0 CPL C;CyCy,CPL bit;(bit)(bit),SETB C;Cy1 SETB bit;(bit)1,例:设 Cy=1,(位地址40H)=1,执行指令 ANL C,/40H 后,Cy=?,(位地址40H)=?,0,习题:设累加器A中数据为 29H,Cy=0,执行指令 ORL C,0E3H 后,Cy=?,1,三位逻辑运算:ANL、ORL:ANL C,bit;CC(bit)ANL C,/bit;CC/(bit)ORL C,bit;CC(bit)ORL C,/bit;CC/(bit),