1、3.1 指令系统简介 3.2 寻址方式 3.3 数据传送类指令 3.4 算术运算类 3.5 逻辑运算类 3.6 控制转移类 3.7 位操作类 3.8 汇编语言的伪指令,第三章 MCS-51单片机的指令系统 Instruction Set,3.1 指令系统简介,第三章 MCS-51单片机的指令系统 Instruction Set,指令是规定计算机进行某种操作的命令。 计算机所能执行的所有指令的集合称指令系统。机器语言指令二进制数编码 汇编语言指令英文缩写词助记符,标号: 操作数,操作数 ;注释,3.1.1 指令格式,标号:指令起始地址,是一种符号地址。 操作码:指令助记符,规定指令完成的功能。
2、操作数:指定指令的操作对象。包括数据、存放数据的单元地址、符号常量数据、符号地址等。多个操作数之间用逗号隔开。 注释:便于阅读理解的解释性文字。;隔开。,功能,数据传送类:29条 算术运算类:24条 逻辑运算类:24条 控制转移类:17条 位操作类: 17条,111条指令,字节数,运算速度,单字节指令:49条 双字节指令:45条 三字节指令:17条,单周期指令:64条 双周期指令:45条 四周期指令: 2条,3.1.2 指令分类,3.2 寻址方式,立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址(基址+变址) 相对寻址 位寻址,在指令系统中,寻找参与运算的操作数的方式称寻址方式。,7种
3、寻址方式,常用符号,Rn:工作寄存器中的寄存器R0、R1R7之一。,Ri:工作寄存器中的寄存器R0或R1,#data:8位立即数,#data16:16位立即数,direct:片内RAM或SFR的地址(8位),间接寻址寄存器,Bit:片内RAM或SFR的位地址,addr11:11位目的地址 2K范围,addr16:16位目的地址 64K范围,rel: 补码形式的8位地址偏移量。偏移范围为-128127 /:位操作指令中,该位求反后参与操作,不影响该位 X:片内RAM的直接地址或寄存器 (X):相应地址单元中的内容 :箭头左边的内容送入箭头右边的单元内,3.2.1 立即寻址Immediate Ad
4、dressing,操作数就包含在指令代码中,在操作码之后,称为立即数,用“”表示。MCS-51 单片机汇编指令如:MOV A, #80HMOV R7, #0F5HMOV DPTR,#1245H,操作数存在于程序存储器中,3.2.2 直接寻址Direct Addressing直接使用数据所在单元的地址找到操作数,所以称 这种方法为直接寻址。 操作数在SFR、内部RAM、位地址空间。 如: MOV A,05HMOV C,60HMOV A,0F0H,3.2.3 寄存器寻址Register Addressing,以寄存器的内容为操作数,进行数据操作的指令。包括工作寄存器R0R7、累加器A、通用寄存器B
5、、地址寄存器DPTR等。单字节指令。例:MOV A,R0; 将R0工作寄存器中的数据送到A中去。,问题:工作寄存器就是内存单元的一部分,如果选择工作寄存器组0,则R0就是RAM的00H单元,那么,MOV A,00H 和 MOV A,R0 有区别吗?,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。,3.2.4 寄存器间接寻址Register Indirect Addressing,R0,R1-8
6、位地址,片内128字节或片外低256 DPTR-16位,片外64KB MCS-51 汇编指令 如: MOV A,R0MOVX A,R0MOVX A,DPTR,操作数在片内RAM中,操作数在片外RAM中,把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。,以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MOVC A, A+DPTR ;(A+DPTR) A MOVC A, A+PC ; PC+1 PC,(A+PC)A,3.2.5 变址寻址(基址+变址),Base-Register-plus-Index-Regist
7、er-Indirect Addressing,操作数在程序存储器中,如:MOVC A,A+DPTR 设DPTR=2000H,A=E0H,20E0H,47H,指令代码,3.2.6 相对寻址,常用于跳转指令。如: JC 23H若C=0,不跳转; C=1,跳转.将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令后的字节地址) 指令第二字节给出的数据称为偏移量,(1字节带符号数),Relative Addressing,改变PC,如:JC 23H,1025H,23H,1002H,指令代码,当前PC,对片内RAM的位寻址区和某些
8、可位寻址的特殊功能寄存器进行位操作时的寻址方式。如: SETB 3DH; 将27H.5位置1CLR C ;Cy位清0,3.2.7 位寻址 Bit Addressing,操作数在片内RAM位地址区或SFR某些位中,寻址方式涉及的存储器空间,3.3 数据传送类指令(29条)Data Transfer Instruction,助记符:MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为ACC的指令影响奇偶标志P外,
9、一般不影响标志位。,3.3.1 内部RAM的传递指令(16条),(1)以 A 为目的操作数MOV A,#data ;立即寻址MOV A,direct ;直接寻址MOV A,Rn ;寄存器寻址MOV A,Ri ;寄存器间接寻址 (2)以 Rn 为目的操作数MOV Rn,#data ;立即寻址MOV Rn,direct ;直接寻址MOV Rn,A ;寄存器寻址 (3)以 直接地址 为目的操作数MOV direct,#data ;立即寻址MOV direct1,direct2 ;直接寻址MOV direct,A ;寄存器寻址MOV direct,Rn ;寄存器寻址MOV direct,Ri ;寄存器
10、间接寻址,3.3.1 内部RAM的传递指令(16条),(4)以 寄存器间接地址Ri 为目的操作数MOV Ri,#data ;立即寻址MOV Ri,direct ;直接寻址MOV Ri,A ;寄存器寻址MOV Ri,Rn X ;寄存器寻址MOV Ri,Ri X ;寄存器间接寻址 (5)以 DPTR 为目的操作数MOV DPTR,#data16 ;立即寻址注意 (1)区分各种寻址方式的含义(2)传送指令不影响标志位(Cy、AC、OV),但A的值影响奇偶标志位 P,MOV DPTR,#data16 8051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。
11、其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H 执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令: MOV DPH,#12HMOV DPL,#34H。则就相当于执行了:MOV DPTR,#1234H。,3.3.2 累加器A与片外RAM之间的数据传递类指令(4条),MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A 说明:1.只有累加器A能够与外部RAM交换数据。内部RAM间可以直接进行数据的传递,而外部则不行。例:将外部RAM中0100H单元的数据送入0200H单元。
12、指令:MOV DPTR,#100HMOVX A,DPTRMOV DPTR,#200HMOVX DPTR,A,3.3.2 累加器A与片外RAM之间的数据传递类指令(4条),MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A 说明:2.要读或写外部的RAM,必须要知道RAM的地址,后两条指令中,地址被直接放在DPTR中。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,只提供低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。,3.3.3 读程序存储器指令(2条),MOVC A,A+DPTR ;变址寻址M
13、OVC A,A+PC ;变址寻址将ROM中的数送入A中。 也被称为查表指令,常用来查询做好在ROM中的表格。 指令执行前后,A中的值不一定相同。,若R0=2,则最终地址为100H+2=102H,找到的结果是4。,例:有一个数在R0中,要求用查表的方法确定它的平方值(此数取值范围是0-5),MOV DPTR,#100H MOV A,R0 MOVC A,A+DPTR ORG 0100H DB 0,1,4,9,16,25,3.3.4 堆栈操作指令(2条),PUSH direct;SP SP+1,(SP) (direct)POP direct; (direct) (SP), SP SP-1第一条为压入
14、指令,将direct中的内容送入堆栈中。第二条为弹出指令,将堆栈中的内容送回direct中。 SP 始终指向栈顶。,例: MOV SP,#5FHMOV A,#100MOV B,#20HPUSH ACCPUSH B,20H,64H,60H,61H,3.3.5 数据交换指令(5条),(1)字节交换XCH A,directXCH A,RnXCH A,Ri(2)半字节交换XCHD A,Ri(3)累加器A高低半字节交换SWAP A,A,Ri,1,5,2,A,1,5,2,A,A,1,5,1,5,A,A,Ri,3,5,2,C,2,5,3,C,例:给出每条指令执行后的结果,MOV 23H,#30H MOV 1
15、2H,#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,内部RAM,3.4 算术运算类指令(24条)Arithmetic Operations,主要对8位无符号数;也可用于带符号数运算
16、。包括:加、减、乘、除、加1、减1运算指令影响PSW有关位。Cy、AC、OV、P。,3.4.1 加法指令,ADD A,#data ; AdataAADD A,direct ; A(direct )AADD A,Rn ; ARnAADD A,Ri ; A(Ri)A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。,1.不带进位位的加法指令(4条),2.带进位位的加法指令(4条),ADDC A,#data ; AdataCYAADDC A,direct ; A(direct )CYAADDC A,Rn ; ARnCYAADDC A,Ri ; A(Ri)CYA用途:将A中的值和其后面的值以及
17、进位位C中的值相加,最终结果存在A,常用于多字节数运算中。 说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到065535。,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H + 30H + CY,结果是41H,所以最终的结果是4107H。,1067H+30A0H,0001 0000 0110
18、 0111,0011 0000 1010 0000,0100 0001 0000 0111,1067H,30A0H,4107H,设:1067H存在R1R0中, 30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。,ORG 1000H MOV A,R0 ADD A,R2 ;R0+R2A和CY MOV R4,A MOV A,R1 ADDC A,R3 ;R1+R3+CYA和CY MOV R5,A,又例:,先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。然后再做10H + 30H + CY,结果是40H,所以最终的结果是4087H。,
19、1067H+3020H,0001 0000 0110 0111,0011 0000 0010 0000,0100 0000 1000 0111,1067H,3020H,4087H,DA A 在进行压缩BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。 例:A=0001 0101 BCD(代表十进制数15)ADD A,#8 ; A=1DH,按二进制规律加DA A ; A=23H,按十进制规律加,3. 十进制调整指令(1条),调整要完成的任务是:,(1)当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=
20、1),则应在低4位加6调整,以产生低4位正确的BCD结果。,(2)当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。十进制调整指令执行后,PSW中的CY表示结果的百位值。,例:若(A)0101 0110B,表示的BCD码为56,(R3)0110 0111B,表示的BCD码为67, (CY)0。执行以下指令:ADD A,R3DA A,由于(A)0010 0011B,且(CY)1 结果为BCD数123。 应该注意,DA指令不能对减法进行十进制调整。,4 加1指令(5条),加1指令共有如下5条指令, 助记符为I
21、NC。 INC A ; (A)(A)+1 INC direct ; (direct)(direct)+1 INC Rn ; (Rn)(Rn)+1 INC Ri ; (Ri)(Ri)+1 INC DPTR ; (DPTR)(DPTR)+1,例如: 设(R0)=7EH, (7EH)=FFH, (7FH)=38H, (DPTR)=10FEH, 分析逐条执行下列指令后各单元的内容。 INC R0 ; 使7EH单元内容由FFH变为00HINC R0 ; 使R0的内容由7EH变为7FHINC R0 ; 使7FH单元内容由38H变为39HINC DPTR ; 使DPL为FFH, DPH不变INC DPTR
22、; 使DPL为00H, DPH为11HINC DPTR ; 使DPL为01H, DPH不变,3.4.2 减法指令(8条),SUBB A,#data ; AdataCYA SUBB A,Rn ; ARnCYA SUBB A,direct ; A(direct )CYA SUBB A,Ri ; A(Ri)CYA 将A中的值减去源操作数所指内容以及进位位C中的 值,最终结果存在A中。 如: SUBB A,R2 设: A=C9H,R2=55H,CY=1, 执行指令之后,A中的值为73H。 减法运算实际是补码相加。补码=/原码+1,1. 带借位的减法指令(4条),说明:没有不带借位的减法指令,如果需要做
23、不带借位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。,2. 减1指令,减1指令有如下4条指令, 助记符为DEC。 DEC direct ;(direct)(direct)-1 DEC A ;(A)(A)1 DEC Rn ;(Rn) (Rn)1 DEC Ri ;(Ri) (Ri)1,3.4.3 乘法指令(8条),MUL AB,(B) AxB积的高八位 (A) AxB积的低八位,(CY)0 (OV)0,当乘积FFH时,乘、 除法指令为单字节4周期指令, 在指令执行周期中是最长的两条指令。 1. 乘法指令,乘法指令的功能是把累加器A和寄存器B中的两
24、个8位无符号数相乘, 将乘积16位数中的低8位存放在A中, 高8位存放在B中。 若乘积大于FFH(255), 则溢出标志OV置1, 否则OV清0。 乘法指令执行后进位标志CY总是清零, 即CY=0。 另外, 乘法指令本身只能进行两个8位数的乘法运算, 要进行多字节乘法还需编写相应的程序。 例如: 若(A)=4EH(78), (B)=5DH(93) 执行指令: MUL AB 结果为: 积为(BA)=1C56H(7254) FFH(255), (A)=56H, (B)=1CH, OV=1, CY=0, P=0。,例3: 利用单字节乘法指令进行双字节数乘以单字节数运算。 若被乘数为16位无符号数,
25、地址为M1和M1+1(低位先、 高位后), 乘数为8位无符号数, 地址为M2, 积存入R2、 R3和R4三个寄存器中。 (M1+1) (M1) (M2) R3 R4 B A R2 R3 R4,参考程序如下: MOV R0, M1 ; 被乘数地址存于R0MOV A, R0 ; 取16位数低8位 MOV B, M2 ; 取乘数MUL AB ; (M1)(M2)MOV R4, A ; 存积低8位 MOV R3, B ; 暂存(M1)(M2)高8位 INC R0 ; 指向16位数高8位MOV A, R0 ; 取被乘数高8位,MOV B ,M2 ; 取乘数MUL AB ; (M1+1)(M2)ADD A
26、, R3 ; (A)+(R3)得(积)158MOV R3, A ; (积)158存R3MOV A, B ; 积最高8位送AADDC A,00H ; 积最高8位+CY得(积)2316MOV R2, A ; (积)2316存入R2若上述程序执行前: (M1+1)=ABH, (M1)=CDH, (M2)=64H, 则执行后: (R2)=43H, (R3)=1CH, (R4)=14H。,2. 除法指令 (A)(A)(B)之商(B)(A)(B)之余数(CY)0, (OV)0 除法指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数, 所得商存于累加器A中, 余数存于寄存器B中, 进位标
27、志CY和溢出标志OV均被清零。 若除数B中的内容为0时, 除法运算没有意义, 结果为不定值, 此时溢出标志OV被置为1 , 即OV=1, 而CY仍为0。,DIV AB,例4: 利用除法指令把累加器A中的8位二进制数转换为3位BCD数, 并以压缩形式存放在地址M1、 M2单元中。 解: 累加器A中的8 位二进制数, 先对其除以100(64H), 商数即为十进制的百位数; 余数部分再除以10 (0AH), 所得商数和余数分别为十进制十位数和个位数, 即得到3位BCD数。 百位数放在M1中, 十位、个位数压缩BCD数放在M2中, 十位与个位数的压缩BCD数的存放是通过SWAP和ADD指令实现的。参考
28、程序如下:,MOV B, 64H ; 除数100 送B DIV AB ; 得百位数 MOV M1, A ; 百位数存于M1中 MOV A, 0AH ; 取除数10 XCH A, B ; 上述余数与除数交换 DIV AB ; 得十位数和个位数 SWAP A ; 十位数存于A的高4位 ADD A, B ; 组成压缩BCD数 MOV M2, A ; 十、 个位压缩BCD数存M2若上述程序执行前: (A)=A8H (168), 则执行后: (M1)=(01)BCD, (M2)=(68)BCD。,3.5 逻辑运算类指令(24条),主要用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。主要操作与
29、、或、异或、移位、取反、清零等。对标志位的影响除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,Logic Operations,3.5.1 逻辑或指令(6条),逻辑:有1为1,全0为0。ORL A,#data ;AdataA ORL A,direct ;A(direct)A ORL A,Rn ;ARnA ORL A,Ri ;A(Ri)A ORL direct,A ;(direct)A(direct) ORL direct,#data ;(direct)data(direct),例:71H和56H相或:01110001 (71H) ) 01010110 (56H),011101
30、11 即77H,后两条指令,若直接地址为I/O端口,则为“读-改-写”操作。,OR Logic Instruction,3.5.2 逻辑与指令 (6条),逻辑:全1为1,有0为0。ANL A,#data ;AdataA ANL A,direct ;A(direct)A ANL A,Rn ;ARnA ANL A,Ri ;A(Ri)A ANL direct,A ;(direct)A(direct) ANL direct,#data ;(direct)data(direct),例:71H和56H相与:01110001 (71H) )01010110 (56H),01010000 即50H,后两条指令
31、,若直接地址为I/O端口,则为“读改-写”操作。,ANd Logic Instruction,例:71H和56H相异或:01110001 (71H) ) 01010110 (56H),3.5.2 逻辑异或指令(6条),逻辑:相同为0,不同为1 XRL A,#data ;A dataA XRL A,direct ;A (direct)A XRL A,Rn ;A RnA XRL A,Ri ;A (Ri)A XRL direct,A ;(direct) A(direct) XRL direct,#data ;(direct) data(direct),00100111 即27H,后两条指令,若直接地
32、址为I/O端口,则为“读-改-写”操作。,eXclusive-oR Logic Instruction,3.5.3 清0与取反指令(2条),(2)取反:CPL A ;/AA例:若A=5CH,执行CPL A 0101 1100B结果:A=A3H 1010 0011B,(1)清0:CLR A ;0A,ComPlement Logic Operation,3.5.4 循环移位指令(4条),RL A RR A RLC A RRC A,后两条指令,影响P标志和CY。,Rotate Logic instruction,例:若A=5CH,CY=1,执行RLC A后,,对RLC、RRC指令,在CY=0时RLC
33、相当于乘以2RRC相当于除以2,结果:A=B9H,CY=0,P=1,3.6 控制转移类指令( 17条) Branching Instruction,共有17条控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型: 无条件转移和条件转移 相对转移和绝对转移 长转移和短转移 调用与返回指令,3.6.1 无条件转移类指令(4条),绝对转移指令:AJMP addr11长转移类指令:LJMP addr16短转移类指令:SJMP rel(相对转移类指令)间接转移指令:JMP A+DPTR,说明1:前三条指令:PC值改变,即跳转到一标号处。区别何在呢?,跳转的范围不同。,绝
34、对转移指令:AJMP addr11长转移类指令:LJMP addr16相对转移指令:SJMP rel,转移范围: 2KB 64KB -128+127,指令构成不同。AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。,指令长度不同 原则上,所有用SJMP或AJMP的地方都可以用 LJMP来替代。,间接转移指令:JMP A+DPTR,这条指令的用途也是跳转。 转移地址由A+DPTR形成,并直接送入PC。 指令对A、DPTR和标志位均无影响。 本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。,说明2:第四条指令与前三条指令相比有所不同,条件 case,Case
35、1,Case 1,Case 1,next program,。,程序流程,例: MOV 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,转ROUT
36、1 A=4,转ROUT2 A=6,转ROUT3,3.6.2 条件转移指令(8条),条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。,(1)判A内容是否为0转移指令(2条),JZ rel ;如果A=0,则转移,否则顺序执行。JNZ rel ;如果A0,就转移。 转移到相对于当前PC值的8位移量的地址去。即: 新的PC值=当前PC+偏移量rel 在编写汇编语言源程序时,可以直接写成:JZ 标号 ;即转移到标号处。,例:,MOV A,R0JZ L1MOV R1,#00HAJMP L2L1: MOV R1,#0FFHL2: SJMP L2END在执行上面这段程序前:如
37、果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么?,如果R0=0,结果R1=00H。如果R00,结果是R1中的值为0FFH。,(2)比较不等转移指令(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,
38、标号CJNE Ri,#data,标号,利用这些指令,可以判断两数是否相等。 想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能: 如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。 如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。,举例:,MOV A,R0CJNE A,#10H,L1MOV R1,#0 ;如R0=10H,则不转移R1=00HAJMP L3 L1:JC L2 ;如CY=1即 R010H,则转移AJMP L3 L2:MOV R1,#0FFH L3:SJMP L3因此最终结果是:本程序执行前, 如果R0
39、=10H,则R1=00H; 如果R010H,则R1=0AAH; 如果R010H,则R1=0FFH。,(3)减1不为0转移指令(2条),DJNZ Rn,rel DJNZ direct,rel DJNZ指令的执行过程是这样的: 它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。 例:DJNZ 10H,LOOP. LOOP: .,例:MOV 23H,#0AHCLR A LOOP: ADD A,23HDJNZ 23H,LOOP SJMP $ 上述程序段的执行过程是: 将23H单元中的数连续相加,存至A中,每加一次, 23H单元中的
40、数值减1,直至减到0,共加(23H)次。,3.6.3 调用与返回指令(4条),(1)调用指令(2条),LCALL addr16 ;长调用指令(3字节)ACALL addr11 ;绝对调用指令(2字节) 上面两条指令都是在主程序中调用子程序 区别:短调用指令,被调子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。使用时可以用:LCALL 标号 ;标号表示子程序首地址,指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。,LCALL sb1,Sb1:,主程序,子程序,main:,RET,(2)返回指令 (2条),子程序执行完后必须回到主程序,如何返回呢?只要执
41、行一条返回指令就可以了。 RET ;子程序返回指令 RETI ;中断子程序返回指令 两者不能互换使用。,RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。 RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。,3.6.4 空操作指令(1条),NOP 空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。,3.7 位操作指令( 17条),Boolean Operations,51单片机有一个位处理器(又称布尔处理器) 有一组位变量处理的指令集 包括位变量传送、逻辑运算、控制程序转移等。 有一部份RAM和一部份SFR
42、是具有位寻址功能的。 位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位007FH) 可以位寻址的特殊功能寄存器,有些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除, 如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、 IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0-P3(I/O端口锁存器)。 在进行位处理时,CY用作“位累加器” 。,以PSW中位4( RS1 )为例。 PSW地址=0D0H p18 直接(位)地址方式:如 D4H; 点操作符号方式:如 PSW.4,D0H.4;
43、 位名称方式:如 RS1; 用户定义名方式:如用伪指令 bitSUB.REG bit RS1定义后,可用SUB.REG代替RS1。,位地址表达方式,3.7.1 位传送指令(2条),MOV C,bit ;bit C MOV bit,C ;C bit 这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。 例:MOV C,P1.0 ;将P1.0的状态送给C。 MOV P1.1,C ;将C中的状态送到P1.1 ;引脚上去。,3.7.2 位清0和置位(4条),位清0指令 CLR C ;使CY=0CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使P1.0变为0位置1指令 SE
44、TB C ;使CY=1SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P1.0变为1,3.7.3 位逻辑运算指令 (6条),位与指令 ANL C,bit ;Cy与指定位的值相与,结果送Cy ANL C,/bit ;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回Cy。 注意:指定的位地址中的值本身并不发生变化。 例:ANL C,/P1.0,位取反指令 CPL C ;使Cy值取反。 CPL bit ;使指定的位的值取反。例:CPL P1.0,位或指令 ORL C,bit ;Cy和bit中有1,则Cy=1 ORL C,/bit ;Cy和/bit中有1,则Cy=1,3.
45、7.4 位条件转移指令(5条),判Cy转移指令 JC rel ;如果Cy=1就转移,否则就顺序执行JNC rel ;如Cy=0就转移,否则就顺序执行可用标号: JNC 标号,判位变量转移指令 JB bit,rel ;(bit)=1,则转移 JNB bit,rel ;(bit)=0,则转移 JBC bit,rel ;(bit)=1,则转移,并把该位清0可用标号:JB bit,标号,指令系统小结,数据传送类:29条 算术运算类:24条 逻辑运算类:24条 控制转移类:17条 位操作类: 17条,数据传送类:29条,表1 数据传送类指令一览表,表2 算术运算指令,表3 算术运算指令,表4 逻辑运算指
46、令,表5 控制转移指令,表6 位操作指令,3.8 汇编语言的伪指令,汇编起始地址伪指令 ORG 汇编结束伪指令 END 字节数据定义为指令 DB 子数据定义为指令 DW 空间定义为指令 DS 赋值伪指令 EQU = 定义内部RAM符号地址 DATA,MCS-51单片机汇编语言编程过程,用 编辑程序 编写出 汇编语言源程序 *.ASM 用 汇编程序 翻译成 机器代码程序 *.OBJ并生成 打印文档 *.PRN 用 下载程序 烧写到 程序存储器 伪指令:用来向汇编程序提供编译要求的控制指令和信息。控制输入输出、定义数据和符号、条件汇编、分配存储空间。 伪指令无机器码,3.8.1 汇编起始地址伪指令
47、,助记符:ORG 格式: 标号: ORG 16位地址 功能:给定程序块或数据块存放的起始地址例: ORG 8000HSTART: MOV A,#30HADD A,#20H,编译后 地址 代码 8000H 74 30 8002H 24 20,3.8.2 汇编结束伪指令,助记符:END 格式: 标号: END 表达式 功能: 结束汇编,之后的程序不再汇编。要求位于程序最后,3.8.3 字节数据定义伪指令,助记符:DB 格式: 标号: DB 1字节数据的数据表 功能:从标号开始的地址存放数据。例: ORG 1000HTAB: DB -2,-4,100,DB 30H,A,C ,编译后 地址 代码 1000H FE FC 64 1003H 30 41 43,3.8.4 字数据定义伪指令,助记符:DW 格式: 标号: DW 16位字数据的数据表 功能:从标号开始的地址存放数据。先存高8位,后存低8位 例: ORG 1000HTAB: DW 324AH,3CHDW AB,编译后 地址 代码 1000H 32 4A 00 3C 1003H 41 43,3.8.5 空间定义伪指令,助记符:DS 格式: 标号: DS 表达式 功能:从标号自定的地址单元开始,保留指定数目的备用存储单元。 例: ORG 1000HBUF: DB 10HDS 05HDB 11H,