1、2019/6/24,1,2.1 概述,7种寻址方式,111条指令,字节数,运算速度,单字节指令:49条 双字节指令:45条 三字节指令:17条,单周期指令:64条 双周期指令:45条 四周期指令: 2 条,第二章 MCS-51指令系统Instruction Set,2019/6/24,2,功能,数据传送类:29条 算术运算类:24条 逻辑运算类:24条 控制转移类:17条 位操作类: 17条,2019/6/24,3,常用符号,Rn:工作寄存器中的寄存器R0、R1R7之一,,Ri:工作寄存器中的寄存器R0或R1,#data:8位立即数,#data16:16位立即数,direct:片内RAM或SF
2、R的地址(8位),间接寻址寄存器,Bit:片内RAM或SFR的位地址,addr11:11位目的地址,addr16:16位目的地址,2019/6/24,4,rel: 补码形式的8位地址偏移量。偏移范围为-128127 /:位操作指令中,该位求反后参与操作,不影响该位 X:片内RAM的直接地址或寄存器 (X):相应地址单元中的内容 :箭头左边的内容送入箭头右边的单元内,2019/6/24,5,2.2 寻址方式,3.2.1 立即寻址 Immediate Addressing,操作数就包含在指令代码中,在操作码之后,称为立即数,用“”表示。MCS-51如:MOV P1, #80HMOV R7, #0F
3、5HMOV DPTR,#1245H,操作数存在程序存储器中,2019/6/24,6,2.2.2 直接寻址Direct Addressing直接使用数所在单元的地址找到了操作数,所以称 这种方法为直接寻址。 操作数在SFR、内部RAM、位地址空间。 如: MOV A,00HMOV C,60HMOV A,0F0H,2019/6/24,7,2.2.3 寄存器寻址Register Addressing,对选定的工作寄存器R0R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。 例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。,提一个问题:我们知道,工作寄存器就是内存单元的一
4、部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?,2019/6/24,8,的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。,2019/6/24,9,2.2.4 寄存器间接寻址Register Indirect Addressing,把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取
5、数据。 R0,R1-8位地址,片内低128字节或片外 DPTR-16位,片外64KBMCS-51 如: MOV A,R0MOVX A,R0MOVX A,DPTR,操作数在片内RAM中,操作数在片外RAM中,操作数在片外RAM中,2019/6/24,10,以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MCS-51MOVC A, A+DPTR ;(A+DPTR) A MOVC A, A+PC ; PC+1 PC,(A+PC)A,2.2.5 变址寻址(基址+变址),Base-Register-plus-Index-Register-Indi
6、rect Addressing,操作数在程序存储器中,2019/6/24,11,如:MOVC A,A+DPTR 设DPTR=2000H,A=E0H,20E0H,47,指令代码,2019/6/24,12,2.2.6 相对寻址,将PC中的当前内容与指令第二字节给出的数相加,结 果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.常用于跳转指令。如: JC 23H若C=0,不跳转; C=1,跳转.,Relative Addressing,改变PC,2019/6/24,13,如:JC 23,1025H,23H,1
7、002H,指令代码,当前PC,2019/6/24,14,对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如: SETB 3DH; 将27H.5位置1CLR C ;Cy位清0,2.2.7 位寻址 Bit Addressing,操作数在片内RAM位地址区或SFR某些位中,2019/6/24,15,寻址方式涉及的存储器空间,2019/6/24,16,2.3 数据传送类指令(29条)Data Transfer Instruction,MCS-51 助记符:助记符:MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 源操作数寻址方式(5种):立即寻址、直
8、接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响 标志位。,2019/6/24,17,2.3.1 十六位数的传递指令(1条),MOV DPTR,#data16 8051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H 执行完了之后DPH中的值为12H,DPL中的值为34H。 如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令: MOV DPH,#3
9、5HMOV DPL,#12H。则就相当于执行了 MOV DPTR,#3512H。,2019/6/24,18,2.3.2 累加器A与片外RAM之间的数据传递类指令(4条),MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A 说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有 需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部 RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),
10、也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。,2019/6/24,19,2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,DPTRMOV DPTR,#0200HMOVX DPTR,A,2019/6/24,20,2.3.3 读程序存储器
11、指令(2条),MOVC A,A+DPTRMOVC 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单元中找到的是4。,2019/6/24,21,2.3.4 堆栈操作(2条),PUS
12、H direct ;SPSP+1,(SP)(direct)POP direct ; (direct) (SP), SPSP-1 第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOV SP,#5FHMOV A,#100MOV B,#20PUSH ACCPUSH B则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后
13、, 61H单元中的值变为20。,2019/6/24,22,1.给出每条指令执行后的结果,MOV 23H,#30H MOV 12H,#34H MOV R0,#23H MOV R7,12H MOV R1,#12H MOV A,R0 MOV 34H,R1 MOV 45H,34H MOV DPTR,#6712H MOV 12H,DPH MOV R0,DPL MOV A,R0,;(23H)=30H ;(12H)=34H ;R0=23H,;R7=34H ;R1=12H ;A=30H,;(34H)=34H ;(45H)=34H ;DPTR=6712H,;(12H)=67H ;R0=12H ;A=67H,内部
14、RAM,2019/6/24,23,2.4 算术运算类指令(24条)Arithmetic Operations,主要对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令影响PSW有关位。,2019/6/24,24,2.4.1 加法指令,ADD A,#data ; AdataAADD A,direct ; A(direct )AADD A,Rn ; ARnAADD A,Ri ; A(Ri)A 用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。,1.不带进位位的加法指令(4条),2019/6/24,25,2.带进位位的加法指令(4条),ADDC A,Rn ; AR
15、nCYAADDC A,direct ; A(direct )CYAADDC A,Ri ; A(Ri)CYAADDC A,#data ; AdataCYA 用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。 说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到065535。,2019/6/24,26,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在
16、A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H。,1067H+30A0H,0001 0000 0110 0111,0011 0000 1010 0000,0100 0001 0000 0111,1067H,30A0H,4107H,2019/6/24,27,设:1067H存在R1R0中, 30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。,MOV A,R0 ADD A,R2 ;R0+R2A和CY MOV R4,A MOV A,R1 ADDC A,R3 ;R1+R3+C
17、YA和CY MOV R5,A,2019/6/24,28,又例:,先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。然后再做10H + 30H + CY,结果是40H,所以最终的结果是4087H。,1067H+3020H,0001 0000 0110 0111,0011 0000 0010 0000,0100 0000 1000 0111,1067H,3020H,4087H,2019/6/24,29,DA A 在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。 例:A=0001
18、0101BCD(代表十进制数15)ADD A,#8,3. 十进制调整指令(1条),; A=1DH,按二进制规律加,; A=23H,按十进制规律加,DA A,2019/6/24,30,调整要完成的任务是:,(1)当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。,(2)当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。十进制调整指令执行后,PSW中的CY表示结果的百位值。,2019/6/24,31,例 若(A)0101
19、 0110B,表示的BCD码为56,(R3)0110 0111B,表示的BCD码为67,(CY)0。执行以下指令: ADD A,R2 DA A 由于(A)0010 0011B,即,且(CY)1,即,结果为BCD数123。 应该注意,DA指令不能对减法进行十进制调整。,2019/6/24,32,2.4.2 减法指令(8条),SUBB A,Rn ; ARnCYA SUBB A,direct ; A(direct )CYA SUBB A,Ri ; A(Ri)CYA SUBB A,#data ; AdataCYA 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。 如: SUBB
20、A,R2 设: A=C9H,R2=55H,CY=1, 执行指令之后,A中的值为73H。,1. 带借位的减法指令(4条),2019/6/24,33,说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。 对带符号数,要注意OV标志。OV=1,出错。,2019/6/24,34,2.5 逻辑运算类指令(24条),主要用于对2个操作数按位进行逻辑操作,结果送到 A或直接寻址单元。主要操作与、或、异或、移位、取反、清零等。对标志位的影响除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,Logic Operations,2019/6/24,35,
21、2.5.1 逻辑或指令(6条),ORL A,Rn ;ARnA ORL A,direct ;A(direct)A ORL A,Ri ;A(Ri)A ORL A,#data ;AdataA ORL direct,A ;(direct)A(direct) ORL direct,#data ;(direct)data(direct),例:71H和56H相或:01110001 (71H) ) 01010110 (56H),01110111 即77H,后两条指令,若直接地址为I/O端口,则为“读改写”操作。,OR Logic Instruction,2019/6/24,36,2.5.2 逻辑与指令 (6条
22、),ANL A,Rn ;ARnA ANL A,direct ;A(direct)A ANL A,Ri ;A(Ri)A ANL A,#data ;AdataA ANL direct,A ;(direct)A(direct) ANL direct,#data ;(direct)data(direct),例:71H和56H相与:01110001 (71H) )01010110 (56H),01010000 即50H,后两条指令,若直接地址为I/O端口,则为“读改写”操作。,ANd Logic Instruction,2019/6/24,37,例:71H和56H相异或:01110001 (71H) )
23、 01010110 (56H),2.5.2 逻辑异或指令(6条),XRL A,Rn ;A RnA XRL A,direct ;A (direct)A XRL A,Ri ;A (Ri)A XRL A,#data ;A dataA XRL direct,A ;(direct) A(direct) XRL direct,#data ;(direct) data(direct),00100111 即27H,后两条指令,若直接地址为I/O端口,则为“读改写”操作。,eXclusive-oR Logic Instruction,2019/6/24,38,2.5.3 清0与取反指令(2条),取反:CPL A
24、 ;/AA 例:若A=5CH,执行CPL A结果:A=A3H,清0:CLR A ;0A,ComPlement Logic Operation,2019/6/24,39,2.5.4 循环移位指令(4条),RL A RR A RLC A RRC A,后两条指令,影响P标志和CY。,Rotate Logic instruction,2019/6/24,40,例:,若A=5CH,CY=1,执行RLC A后,,对RLC、RRC指令,在CY=0时RLC相当于乘以2RRC相当于除以2,结果:A=B9H,CY=0,P=1,2019/6/24,41,2.6 控制转移类指令( 17条) Branching Ins
25、truction,共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型: 无条件转移和条件转移 相对转移和绝对转移 长转移和短转移 调用与返回指令,2019/6/24,42,2.6.1 无条件转移类指令(4条),短转移类指令:AJMP addr11长转移类指令:LJMP addr16相对转移指令:SJMP rel间接转移指令:JMP A+DPTR,(1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。那么他们的区别何在呢?,2019/6/24,43,跳转的范围不同。,短转移类指令:AJMP addr11长转移类指令:LJMP addr16相对
26、转移指令:SJMP rel,转移范围: 2KB 64KB -128+127,指令构成不同。AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。,指令长度不同原则上,所有用SJMP或AJMP的地方都可以用 LJMP来替代。,2019/6/24,44,间接转移指令:JMP A+DPTR,这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。 指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。,(2)第四条指令与前三条指令相比有所不同,2019/6/24,45,例: MO
27、V DPTR,#TAB ;将TAB代表的地址送入DPTRJMP A+DPTR ;跳转 TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段 TAB+2: AJMP ROUT1 ;跳转ROUT1开始的程序段 TAB+4: AJMP ROUT2 ;跳转ROUT2开始的程序段 TAB+6: AJMP ROUT3 ;跳转ROUT3开始的程序段. ROUT0:. ROUT1:. ROUT2:. ROUT3:,执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行-散转。 A=0,转ROUT0 A=2,转ROUT1 A=4,转ROUT2 A=6,转ROUT3,2019/6/24,46,2.6
28、.2 条件转移指令(8条),条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。,一、判A内容是否为0转移指令(2条),JZ rel ;如果A=0,则转移,否则顺序执行。JNZ rel ;如果A0,就转移。 转移到相对于当前PC值的8位移量的地址去。即: 新的PC值=当前PC+偏移量rel 我们在编写汇编语言源程序时,可以直接写成:JZ 标号 ;即转移到标号处。,2019/6/24,47,例:,MOV A,R0JZ L1MOV R1,#00HAJMP L2L1: MOV R1,#0FFHL2: SJMP L2END在执行上面这段程序前:如果R0=0,结果R1=0F
29、FH。而如果R00,则结果是R1=00H。把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么?,如果R0=0,结果R1=00H。如果R0 0,结果是R1中的值为0FFH。,2019/6/24,48,二、比较不等转移指令(4条),CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel CJNE Ri,#data,rel 此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。 同样地,使用时,我们可以将rel理解成标号,即:CJNE A,#data,标号CJNE A,direct,标号CJNE Rn,#data,
30、标号CJNE Ri,#data,标号,2019/6/24,49,利用这些指令,可以判断两数是否相等。 但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能: 如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。 如果前面的数大,则CY=0,否则CY=1。 因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。,2019/6/24,50,举例:,MOV A,R0CJNE A,#10H,L1MOV R1,#0 ;如R0=10H,则不转移R1=00H;AJMP L3 L1:JC L2 ;如CY=1即 R010H,则转移AJMP L3 L2:MOV R1,#0FF
31、H L3:SJMP L3因此最终结果是:本程序执行前, 如果R0=10H,则R1=00H; 如果R010H,则R1=0AAH; 如果R010H,则R1=0FFH。,2019/6/24,51,三、减1不为0转移指令(2条),DJNZ Rn,rel DJNZ direct,rel DJNZ指令的执行过程是这样的: 它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。 例:DJNZ 10H,LOOP. LOOP: .,2019/6/24,52,例:MOV 23H,#0AHCLR A LOOP: ADD A,23HDJNZ 23H,
32、LOOP SJMP $ 上述程序段的执行过程是: 将23H单元中的数连续相加,存至A中,每加一次, 23H单元中的数值减1,直至减到0,共加(23H)次。,2019/6/24,53,2.6.3 调用与返回指令(4条),一、调用指令(2条),LCALL addr16 ;长调用指令(3字节)ACALL addr11 ;短调用指令(2字节) 上面两条指令都是在主程序中调用子程序,两者的区别: 对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。 使用时可以用:LCALL 标号 ;标号表示子程序首地址ACALL 标号 来调用子程序。,2019/6/24,54
33、,指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。,二、返回指令 (2条),子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。 RET ;子程序返回指令 RETI ;中断子程序返回指令 两者不能互换使用。,2019/6/24,55,3.6.4 空操作指令(1条),NOP 空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。,RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。 RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。,2019/6/24,56,2.7 位操作指令(
34、 17条),Boolean Operations,MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。 在MCS-51 中,有一部份RAM和一部份SFR是具有位寻址功能的。 位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位007FH); 可以位寻址的特殊功能寄存器:8031中有一,2019/6/24,57,些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除, 如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、 IE(中断允许控制寄存器)、SCON(
35、串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0-P3(I/O端口锁存器)。在进行位处理时, CY用作“位累加器” 。,2019/6/24,58,以PSW中位4( RS1 )为例。 直接(位)地址方式:如 D4H; 点操作符号方式:如 PSW.4,D0H.4; 位名称方式:如 RS1; 用户定义名方式:如用伪指令 bitSUB.REG bit RS1 定义后,可用SUB.REG代替RS1。,位地址表达方式,2019/6/24,59,2.7.1 位传送指令(2条),MOV C,bit ;bit C MOV bit,C ;C bit 这组指令的功能是实现位累加器(CY)和其它位地址之
36、间的数据传递。 例:MOV C,P1.0 ;将P1.0的状态送给C。 MOV P1.0,C ;将C中的状态送到P1.0 ;引脚上去。,2019/6/24,60,2.7.2 位清0和置位(4条),位清0指令 CLR C ;使CY=0CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使P1.0变为0位置1指令 SETB C ;使CY=1SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P.0变为1,2019/6/24,61,2.7.3 位逻辑运算指令 (6条),位与指令 ANL C,bit ;Cy与指定位的值相与,结果送Cy ANL C,/bit ;先将指定的位
37、地址中的值取出后取反,再和Cy相与,结果送回Cy。但注意:指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0,2019/6/24,62,位取反指令 CPL C ;使Cy值取反。 CPL bit ;使指定的位的值取反。 例:CPL P1.0,位或指令 ORL C,bit ORL C,/bit,2019/6/24,63,2.7.4 位条件转移指令(5条),判Cy转移指令 JC relJNC rel第一条指令的功能是如果Cy=1就转移,否则就顺序执行。第二条指令则和第一条指令相反,即如果Cy=0就转移,否则就顺序执行。同样理解: JNC 标号,2019/6/24,64,判位变量转移指令 JB bit,rel JNB bit,rel JBC bit,rel 第一条指令:如果指定的(bit)=1,则转移,否则顺序执行,第二条指令功能相反。同样理解:JB bit,标号 第三条指令是如果指定的(bit)=1,则转移,并把该位清0,否则顺序执行。,