第1页:项目3 51单片机指令系统封面
项目3「51单片机指令系统」系统讲解MCS-51指令的格式、寻址方式,以及数据传送、算术运算、逻辑运算、控制转移与位操作五大类指令。
第2页:指令系统概述
3.1 指令系统概述:所谓指令,就是指挥计算机工作的基本操作命令;计算机所能执行的基本操作命令的集合就构成了计算机的指令系统。
- 按一定目的编写的程序,实际就是各种指令的组合
- 程序设计语言:机器语言、汇编语言、高级语言
第3页:指令的格式
3.1.1 指令的格式:格式为「标号: 操作码 操作数 ;注释」。
- 标号:也称标识符,由用户自行定义,由1~8个字符组成,必须以字母开头,其余可以是字母或数字等
- 操作码:也称指令助记符,规定指令的功能
- 操作数:指令的操作对象,规定参与操作的数据来源或结果存放地点,大多为1~2个,个别指令有3个(如CJNE)
- 注释:必须以「;」开始的说明性文字,不是指令的功能部分,可以省略
例如:LOOP: MOV A,#05H ;累加器A中送入数据05H
第4页:指令系统的符号说明
3.1.2 指令系统的符号说明:
- Rn
- 当前选定寄存器组的工作寄存器R0~R7
- Ri
- 作为间接寻址地址指针的R0~R1
- #data
- 8位立即数,即00H~FFH
- #data16
- 16位立即数,即0000H~FFFFH
- addr16
- 16位地址,用于64K范围内寻址,通常也可用字符串表示
- addr11
- 11位地址,用于2K范围内寻址,通常也可用字符串表示
- direct
- 8位直接地址,可以是内部RAM某一单元或某一专用寄存器地址
- Rel
- 带符号的8位偏移量(-128~+127),通常也可用字符串表示
- Bit
- 位寻址区的直接寻址位或可位寻址的特殊功能寄存器的位地址
第5页:立即寻址
3.1.3 寻址方式:所谓寻址方式就是获得操作数的方式,按源操作数的性质确定,与目的操作数无关。1.立即寻址:指令中给出的就是操作数本身,用「#」作为前缀,有8位和16位两种形式。
- MOV A,#100 ;将立即数100(64H)送入累加器A
- MOV R0,#32H ;将立即数32H送入R0
- MOV 30H,#40H ;将立即数40H送入数据存储器30H单元
三条指令执行完后:A中为64H,R0中为32H,30H单元为40H。
第6页:直接寻址与寄存器寻址
- 2.直接寻址:指令中给出操作数所在的单元地址,寻址范围只限内部RAM低128单元(00H~7FH)和特殊功能寄存器;例如 MOV A,40H、MOV A,P1
- 3.寄存器寻址:操作数在寄存器中,以寄存器内容为操作数;通用寄存器指A、B、DPTR以及R0~R7,工作寄存器R0~R7常用于寄存器寻址;例如 MOV A,R0
第7页:寄存器间接寻址
4.寄存器间接寻址:指令中给出的是操作数的单元地址,而这个地址放在一个寄存器中,通过寄存器间接得到操作数。
例如:R0中内容为40H,内部RAM中40H单元内容为62H,执行指令 MOV A,@R0 后,R0中内容不变,A中内容变为62H,其操作过程示意图如图3-1所示。
第8页:变址寻址
5.变址寻址:指令中给出操作数单元的复合地址,即基址寄存器加变址寄存器的间接寻址方式。通常以DPTR或PC作为基本地址、累加器A作为变址,两者内容相加形成16位程序存储器地址。
例如:A中内容为05H,DPTR中内容为2100H,程序存储器2105H处内容为3FH,执行 MOVC A,@A+DPTR 后,DPTR不变,A中内容变为3FH,如图3-2所示。变址寻址方式仅适用于程序存储器(ROM)。
第9页:位寻址
6.位寻址:指令给出的不再是单元地址,而是8位中的一位地址,通常出现布尔累加器C。寻址范围包括内部RAM 20H~2FH位寻址区中的128位和SFR中11个可位寻址寄存器的83位。位寻址有4种表示方式:
- 直接给出位地址:MOV C,2FH
- 单元地址与位地址组合:MOV C,22H.6 表示22H单元的第6位
- 特殊功能寄存器符号与位组合:MOV C,P1.3 表示P1口的第3位
- 位的专用符号:MOV C,AC 即PSW中的D6位
第10页:相对寻址方式
7.相对寻址方式:在相对转移指令中使用的寻址方式,给出相对于PC当前所指位置的偏移量,使程序跳转到新的位置执行。
例如:在1000H处有短转移指令,rel=05H,执行 1000H: SJMP rel 后,程序转移到1007H处继续执行。该指令占两个字节,取出指令后PC指向1002H,目标地址为 PC+2+rel=1000+2+5=1007H。
第11页:单片机指令的分类
3.1.4 单片机指令的分类:MCS-51系列单片机指令系统由111条指令组成。
- 按机器码字节数:单字节指令49条、双字节指令45条、3字节指令17条
- 按执行时间:单周期指令64条、双周期指令45条、4周期指令2条(乘、除法运算)
按操作功能分为五大类:数据传送类(28条)、算术运算类(24条)、逻辑运算及移位类(25条)、控制转移类(17条)、布尔变量操作类(17条)。
第12页:以累加器A为目的操作数的数据传送指令
3.2.1 内部RAM数据传送指令:指单片机内部各寄存器和存储器之间的数据传送,按目的操作数不同分为几种类型。
- MOV A,Rn ;A←(Rn)
- MOV A,direct ;A←(direct)
- MOV A,@Ri ;A←((Ri))
- MOV A,#data ;A←data
第13页:以寄存器Rn和直接地址为目的操作数的指令
- 2.以寄存器Rn为目的操作数:MOV Rn,A;MOV Rn,direct;MOV Rn,#data,功能是把源地址单元中的内容送入工作寄存器,源操作数不变
- 3.以直接地址为目的操作数:MOV direct,A;MOV direct1,direct2;MOV direct,@Ri;MOV direct,#data,功能是把源地址单元中的内容送入直接地址指定的内部RAM单元,源操作数不变
第14页:以间接地址为目的操作数的指令
4.以间接地址为目的操作数的指令:
- MOV @Ri,A ;((Ri))←(A)
- MOV @Ri,#data ;((Ri))←data
- MOV @Ri,direct ;((Ri))←direct
这里不是将源操作数送给Ri,而是送到以Ri的内容为地址的内部RAM单元中。例如 MOV @R1,#100,若R1=32H,执行后R1值不变,32H单元的内容变为100。
【特别提示】若立即数以A、B、C、D、E或F开头,需要在前面加0,例如FFH在指令中应写成0FFH。
第15页:以DPTR为目的操作数的指令
5.以DPTR为目的操作数的指令:MOV DPTR,#data16 ;DPTR←data16。8051是8位机,这是唯一的一条16位立即数传递指令,功能是将16位立即数送入DPTR,其中高8位送入DPH,低8位送入DPL。
- 例如 MOV DPTR,#1234H 执行后,DPH中为12H,DPL中为34H
- 分别向DPH、DPL送数效果相同:MOV DPH,#35H 与 MOV DPL,#12H 相当于执行 MOV DPTR,#3512H
第16页:外部RAM数据传送:DPTR间接寻址
3.2.2 外部RAM的数据传递指令:访问外部RAM只能使用间接寻址方式。
【特别提示】在51单片机中,与外部RAM打交道的只可以是累加器A:所有送入外部RAM的数据必须通过A送去,所有读入的外部RAM数据也必须通过A读入;指令在MOV后增加「X」表示对外部RAM的数据传送。
1.使用DPTR间接寻址:
- MOVX A,@DPTR ;A←((DPTR))
- MOVX @DPTR,A ;((DPTR))←(A)
- DPTR是16位数据指针,可寻址范围为64KB(0000H~FFFFH)
第17页:外部RAM数据传送:Ri间接寻址
2.使用Ri间接寻址:
- MOVX A,@Ri ;A←((Ri))
- MOVX @Ri,A ;((Ri))←A
这两条指令与DPTR间接寻址功能基本相同,但由于Ri(R0或R1)只是8位寄存器,只提供低8位地址,可寻址范围仅为外部RAM中的低256个单元(00H~FFH)。
编程练习:将外部RAM中01H单元的数据与02H单元数据互换。
第18页:ROM数据传送指令与查表
3.2.3 ROM数据传送指令:这里的ROM既包括外部ROM也包括内部ROM,单片机ROM统一编址,指令不用区分;ROM只能读不能写,数据传送是单向的,即从ROM读取数据并只能送入累加器A中。
- MOVC A,@A+DPTR ;A←((A)+(DPTR))
- MOVC A,@A+PC ;A←((A)+(PC))
这类指令属于变址寻址方式,寻址范围64KB,也被称为查表指令。区别:以DPTR为基址时,可事先给DPTR赋64KB范围内的任意值,与A相加后可在整个ROM 64KB空间查表,使用方便;以PC为基址时,PC有严格的当前值,A为8位无符号数,只能在当前指令的256个单元范围内查表。
第19页:数据交换指令
3.2.4 数据交换指令:指内部RAM单元与累加器A的内容进行交换,分为整个字节交换、半字节交换以及累加器A半字节交换等几种。
1.字节交换指令:
- XCH A,Rn ;(A)←→(Rn)
- XCH A,direct ;(A)←→(direct)
- XCH A,@Ri ;(A)←→((Ri))
- 以上指令结果影响程序状态字寄存器PSW的P标志
2.半字节交换指令:指内部RAM单元与A之间进行低4位数据交换,XCHD A,@Ri ;(A)3-0 ←→((Ri))3-0。
第20页:堆栈指令
3.2.5 堆栈指令:堆栈是用户自己设定的内部RAM中的一块专用存储区,向栈里存取数据的操作称为堆栈操作,存放数据称为入栈,取出数据称为出栈。堆栈操作必须是字节操作,且只能直接寻址。
- PUSH direct ;SP←(SP)+1,(SP)←(direct)
- POP direct ;(direct)←((SP)),SP←(SP)-1
入栈分两步:先将SP加1,再将direct中的数据传送到以SP值为地址的RAM单元中,因此入栈数据增多时SP永远指向已入栈数据的最高地址处,即栈顶。
第21页:算术运算指令概述
3.3 算术运算指令:MCS-51指令系统有丰富的算术运算类指令,共24条,可分为不带进位加法、带进位加法、带借位减法、加1、减1、乘、除和十进制调整指令等。
- 主要完成加、减、乘、除四则运算以及增量、减量和十进制调整等操作
- 执行过程中会影响PSW中的某些位,如进位位Cy、辅助进位标志AC、溢出标志OV以及奇偶校验标志P
第22页:不带进位加法指令
3.3.1 加法指令:1.不带进位加法指令(4条)。
- ADD A,#data ;(A)+data→A
- ADD A,Rn ;(A)+(Rn)→A
- ADD A,@Ri ;(A)+((Ri))→A
- ADD A,direct ;(A)+(direct)→A
对PSW标志位的影响:
- 进位标志CY:和的D7位有进位时(CY)=1,否则为0
- 辅助进位标志AC:和的D3位有进位时(AC)=1,否则为0
- 溢出标志OV:和的D7、D6位只有一个有进位时(OV)=1;同时有进位或同时无进位时(OV)=0
- 奇偶标志P:累加器ACC中1的个数为奇数时(P)=1,为偶数时(P)=0
第23页:带进位加法指令
2.带进位加法指令(4条):
- ADDC A,#data ;(A)+data+(Cy)→A
- ADDC A,Rn ;(A)+(Rn)+(Cy)→A
- ADDC A,@Ri ;(A)+((Ri))+(Cy)→A
- ADDC A,direct ;(A)+(direct)+(Cy)→A
功能是将源操作数、累加器A中操作数以及进位标志Cy的值相加,结果送到A中。带进位加法常用于多字节加法运算,例如两个字节数相加,高位字节相加时就需要考虑低位字节相加后可能产生的进位。
第24页:加1指令
3.加1指令(5条):
- INC A ;A←(A)+1
- INC Rn ;Rn←(Rn)+1
- INC direct ;direct←(direct)+1
- INC @Ri ;(Ri)←((Ri))+1
- INC DPTR ;DPTR←(DPTR)+1
功能是使源操作数的值加1并将结果送回原来的单元。加1指令执行较快,只有INC A影响PSW的奇偶校验位,其余指令不影响标志位状态。例如(A)=0FFH,执行INC A后变为00H,但溢出标志位没有变化。
第25页:带借位减法指令
3.3.2 减法指令:1.带借位减法指令(4条)。
- SUBB A,Rn ;A←(A)-(Rn)-(CY)
- SUBB A,direct ;A←(A)-(direct)-(CY)
- SUBB A,@Ri ;A←(A)-((Ri))-(CY)
- SUBB A,#data ;A←(A)-data-(CY)
功能是将A中的值减去其后面的值,再减去Cy的值,结果送回A中。减法指令只有带借位一种,没有不带借位的减法;若要进行不带借位的减法运算,可先执行一条 CLR C 将Cy清零。使用SUBB指令时,若系统未特别指出Cy值,第一次相减一定要清零借位标志位。
第26页:减1指令
2.减1指令(4条):
- DEC A ;A←(A)-1
- DEC Rn ;Rn←(Rn)-1
- DEC direct ;direct←(direct)-1
- DEC @Ri ;(Ri)←((Ri))-1
功能是使源操作数的值减1并将结果送回原来的单元。与加1指令一样,只有DEC A影响PSW的奇偶校验位,其余指令不影响标志位状态。
第27页:乘法指令
3.3.3 乘除法指令:乘除法指令执行需要4个机器周期,是指令系统中执行时间最长的指令。
1.乘法指令:MUL AB ;BA←(A)×(B)。功能是把累加器A和寄存器B中两个8位无符号整数相乘,乘积的高8位存于B中,低8位存于A中。
- 标志位影响:CY标志总是被清0,即CY=0;OV反映乘积的位数,OV=1表示乘积为16位数(结果大于FFH,B中内容不为0),OV=0表示乘积为8位数
- 例如(A)=50H、(B)=05H,执行MUL AB后(A)=90H、(B)=01H,乘积结果为0190H
第28页:除法指令
2.除法指令:DIV AB ;A商,B余←(A)÷(B)。功能是把累加器A和寄存器B中的两个8位无符号整数相除,所得商的整数部分存于A中,余数存于B中。
- 标志位影响:CY位总是被清0;OV反映除数情况,若除数为0则OV=1,表示本次运算无意义,否则OV=0
- 例如(A)=51H、(B)=05H,执行 DIV AB 后(A)=10H(商)、(B)=01H(余数)
第29页:十进制调整指令
3.3.4 十进制调整指令:DA A 是一条专用指令,用于对BCD码十进制加法运算的结果进行修正。
- MOV A,#75H
- MOV R3,#69H
- ADD A,R3 ;(A)=DEH,CY=0
- MOV B,A ;(B)=DEH
- DA A ;(A)=44H,CY=1
第30页:累加器A清零、取反与循环左移
3.4.1 累加器A的逻辑操作指令:
- 1.累加器A清0:CLR A ;A←00H
- 2.累加器A取反:CPL A,对A取反后结果仍存入A中
- 3.累加器A循环左移:RL A,利用左移指令可实现对A中无符号数乘2的目的,D7←D0
第31页:累加器A移位与半字节交换指令
- 4.累加器A带进位循环左移:RLC A
- 5.累加器A循环右移:RR A,对A循环右移可实现无符号数除2运算
- 6.累加器A带进位循环右移:RRC A
- 7.累加器A半字节交换:SWAP A,功能是将A中内容的高4位与低4位互换
第32页:逻辑与指令
3.4.2 逻辑运算指令:1.逻辑与指令(6条)。
- 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,A ;direct←(direct)∧(A)
- ANL direct,#data ;direct←(direct)∧#data
功能是将目的操作数和源操作数按位进行逻辑与操作,结果送目的操作数。程序设计中主要用于对目的操作数中的某些位进行屏蔽(清0):将需屏蔽的位与0相与,其余位与1相与即可。
第33页:逻辑或指令
2.逻辑或指令(6条):
- 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←(direct)∨#data
功能是将目的操作数和源操作数按位进行逻辑或操作,结果送目的操作数。逻辑或指令可对目的操作数的某些位置位:将需置位的位与1相或,其余位与0相或即可,常用于组合数据。
第34页:逻辑异或指令
3.逻辑异或指令(6条):
- 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
功能是将目的操作数和源操作数按位进行逻辑异或操作,结果送目的操作数。逻辑异或指令可用于对目的操作数的某些位取反而其余位不变:将要取反的位和1异或,其余位则和0异或即可。
第35页:长转移指令
3.5 控制转移指令:程序需要循环、分支或调用子程序时,利用控制转移指令改变程序的执行顺序,分为无条件转移、条件转移及子程序调用与返回指令等。
3.5.1 无条件转移指令:MCS-51单片机有4条。1.长转移指令:LJMP addr16 ;addr16→PC。功能是将指令码中的16位地址送入程序计数器PC,使程序跳转到addr16目的地址处执行,addr16通常用标号代替。
第36页:绝对转移、相对转移与散转指令
- 2.绝对转移指令:AJMP addr11;(PC)+2→PC,addr11→PC10~PC0。addr11为11位绝对地址,范围0000H~07FFH,寻址范围2KB
- 3.相对转移指令:SJMP rel;(PC)+2+rel→PC。rel为8位目的地址,通常用标号代替;SJMP $ 表示跳转到当前行继续执行,形成死循环,主要用于等待内外中断
- 4.散转指令:JMP @A+DPTR;(A)+(DPTR)→PC。以DPTR内容为基地址、A内容为变址,根据A的不同值可使程序转移到不同地方,使用灵活
第37页:累加器判零转移指令
3.5.2 条件转移指令:当条件满足就转移,不满足则仍按顺序执行程序。
1.累加器判零转移:以判断A内容是否为0作为转移条件。
- JZ rel ;若(A)=0,则PC←(PC)+2+rel
- JNZ rel ;若(A)≠0,则PC←(PC)+2+rel
如果(A)=0则转移,否则顺序执行下一条指令;编程时可理解为 JZ 标号,即转移到标号处。
第38页:比较转移指令
2.比较转移指令:将两个操作数进行比较,以比较结果作为是否转移的条件。
- CJNE A,#data,rel ;若(A)≠data,则PC←(PC)+3+rel
- CJNE A,direct,rel ;若(A)≠direct,则PC←(PC)+3+rel
- CJNE Rn,#data,rel ;若(Rn)≠data,则PC←(PC)+3+rel
- CJNE @Ri,#data,rel ;若((Ri))≠data,则PC←(PC)+3+rel
若两数相等就顺序执行,不相等就转移;编程时rel常以标号代替。该指令还能反映两个操作数的大小:若左边的操作数≥右边的操作数,则Cy=0,否则Cy=1。
第39页:循环转移指令
3.循环转移指令:又称减1条件转移指令,常用于控制程序的转移次数。
- DJNZ Rn,rel ;(Rn)-1→Rn,若(Rn)≠0则(PC)+2+rel→PC转移执行,若(Rn)=0则(PC)+2→PC顺序执行
- DJNZ direct,rel ;(direct)-1→direct,若(direct)≠0则(PC)+2+rel→PC转移执行,若(direct)=0则(PC)+2→PC顺序执行
功能是先将操作数(Rn或direct)的内容减1并保存结果,减1后结果不为0就转移,否则顺序执行。
第40页:子程序调用指令
3.5.3 子程序调用返回指令:能完成一定功能且能被调用执行并能返回调用程序的程序叫子程序,调用者为主程序。主程序调用子程序后必须再回到主程序继续执行,返回到调用子程序下面一条指令地址处(断点地址);子程序本身也可以调用另外的子程序,称为子程序嵌套。
2.子程序调用指令:
- LCALL addr16 ;长调用指令,寻址范围64KB
- ACALL addr11 ;短调用指令,寻址范围2KB
- addr16和addr11都可以用标号代替
第41页:返回指令与空操作指令
3.返回指令:
- RET ;子程序返回指令,是子程序的最后一条指令,功能是恢复调用子程序时的断点地址
- RETI ;中断返回指令,用于中断服务程序的末尾,以便从中断程序返回主程序继续执行
3.5.4 空操作指令:NOP ;PC←PC+1。该指令不产生任何控制操作,只将程序计数器PC的内容加1,执行消耗1个机器周期、占用一个字节,常用来实现较短时间的延时。
第42页:位操作指令与位传送
3.6 位操作指令:位操作以位(bit)为单位进行运算和操作,操作数是1位数据,取值只能是0或1,故又称布尔变量操作指令。操作对象是片内RAM的位寻址区(20H~2FH)的128位和SFR中的11个可位寻址寄存器。
MCS-51的位操作指令可分为位传送、位置位与位清零、位逻辑运算和位的控制转移等。
3.6.1 位传送指令:
- MOV C, bit ;(bit)→Cy,将位地址bit中的内容送给PSW中的进位位Cy
- MOV bit, C ;(Cy)→bit,传送方向正好相反
指令中的C即Cy。
第43页:位状态设置与位运算指令
3.6.2 位状态设置指令:可实现清零、置一等操作,操作数可以是进位位Cy或是可位寻址的位。
- SETB C ;1→Cy SETB bit ;1→bit
- CLR C ;0→Cy CLR bit ;0→bit
3.6.3 位运算指令:位运算即进行逻辑运算,有与、或、非三种。
- ANL C, bit ;(Cy)∧(bit)→Cy ANL C, /bit ;(Cy)∧(/bit)→Cy
- ORL C, bit ;(Cy)∨(bit)→Cy ORL C, /bit ;(Cy)∨(/bit)→Cy
- CPL C ;(/Cy)→Cy CPL bit ;(/bit)→bit
第44页:位控制转移指令
3.6.4 位控制转移指令:
- JC rel ;若(Cy)=1则(PC)+2+rel→PC转移执行,若(Cy)=0则顺序执行
- JNC rel ;若(Cy)=0则(PC)+2+rel→PC转移执行,若(Cy)=1则顺序执行
以上两条都是两个字节的相对转移指令,且都以Cy为转移条件。
- JB bit,rel ;若(bit)=1则(PC)+3+rel→PC转移执行,若(bit)=0则顺序执行
- JNB bit,rel ;若(bit)=0则(PC)+3+rel→PC转移执行,若(bit)=1则顺序执行
- JBC bit,rel ;若(bit)=1则转移执行且 0→bit
这三条都是三字节的相对转移指令;JB与JBC基本功能相同,但后者在执行转移后还将bit位清零。