第二章MCS-51单片机指令系统

第二章MCS-51单片机指令系统
第二章MCS-51单片机指令系统

目录

第二章MCS-51单片机指令系统 (2)

第一节概述 (2)

一、指令格式 (2)

二、指令的三种表示形式 (2)

三、指令的字节数 (3)

四、指令按功能分类 (3)

五、指令系统综述 (3)

第二节寻址方式 (4)

第二章MCS-51单片机指令系统

总学时8学时

教学目的:1、了解指令字节数、指令分类和指令中所用的符号含义。

2、掌握判别指令的寻址方式。

3、掌握各类指令的格式、功能、含义和特点。

教学重点:1、指令的寻址方式。

2、指令的格式、含义、特点和功能。

3、使用指令的限制条件。

教学难点:1、指令寻址方式的意义。

2、相对寻址的意义及偏移量的计算。

3、堆栈操作时SP和堆栈变化规律。

教学方法:讲授法

教学过程:MCS-51单片机指令系统

第一节概述

一、指令格式

1、指令:计算机用于控制各种功能部件,完成某一指定动作的指示和命令。

2、指令格式:是指指令码的结构形式。指机器码的结构形式。通常指令可分为操作码和操

作数两部分,操作码部分比较简单,操作数部分比较复杂。因为MCS-51采用了地址压缩技术,大部分指令采用单地址指令格式:操作码操作数或操作数地址。这种格式的指令码中除操作数外通常还给出了一个操作数或操作数地址,称为单地址指令格式。

3、程序:完成不同功能的指令的有序集合。

二、指令的三种表示形式

识别指令的标志就是指令的表示形式。有二进制、十六进制和助记符三种形式。

1、指令的二进制形式:指令的二进制形式是一种可以直接被计算机识别和执行的形式。故

又称为指令的机器码或汇编语言的源程序的目标代码。

2、指令的十六进制形式:用十六进制数代替二进制中的二进制数,形成的指令格式称为十

六进制形式。主要用于阅读和通过键盘输入指令码。

3、指令的助记符形式:又称指令的汇编语言形式。由英文单词或英文单词缩写字母形象表

征指令的功能的形式。用于编写汇编语言源程序。

计算机只能识别和执行二进制形式,十六进制和汇编语言形式都必须通过人工和机器翻译成机器码形式,才能被计算机执行。这一过程称为汇编。

MCS-51单片机中常用的就是汇编语言形式(助记符形式)。其格式为:

标号:操作码第二操作数及操作数结果,第一操作数;指令功能解释语句

前面已经介绍过,第二操作数和操作数结果是放在累加器A中的,故,其格式简化为:

标号:操作码A,第一操作数;指令功能解释语句

其中,除“操作码”外,其余项目均可省略。

三、指令的字节数

根据一条指令的操作码和操作数的二进制码之和的位数,可以把指令分成单字节指令,双字节指令和三字节指令。CPU在执行单字节指令时,PC加1,执行双字节指令时,PC加1两次,执行三字节指令是,PC加1三次。通常指令字节数越少,所占用的存储单元越少,指令执行的速度越快。在程序设计时应尽可能选用指令字节数少的指令。

1、单字节指令:指令中只有一个字节,由8位二进制数组成。共有49条。可分为两类:一类是无操作数的单字节指令;一类是含有操作数寄存器编号的单字节指令。

1)无操作数的单字节指令:这类指令的指令码中只有操作码字段没有操作数字段,或操作数字段隐含在操作码字段中。如NOP(没有操作数);INC DPTR(操作数隐

含在操作码中);像MUL AB;DIV AB等均属于此类指令。其中的DPTR,A,B等寄

存器中都放有操作数,而隐含在操作码中。

注:只要是专用寄存器作为操作数地址的,这个专用寄存器均隐含在操作码中。

2)含有操作数寄存器编号的单字节指令:这类指令的指令码由操作码字段和专门用来指示操作数所在寄存器号的字段组成。这个寄存器号一定是寄存器的编号,而不是符号(符号地址)。能对寄存器编号的有工作寄存器R n。例如:mov a,R n;其中的n取值范围为0~7,相应的指令格式为:11101rrr。前5位二进制数是操作码且隐含了累加器A,后面的rrr为操作数所在的寄存器编号,编号范围为000~111共8种。

2、双字节指令

双字节指令码中,一个字节为操作码字段,放在前,另一个字段为操作数字段,放在后面。它可以是立即数,也可以是片内RAM地址,共有45条。

3、三字节指令

三字节指令的指令码中,第一字节为操作码,第二和第三字节均为操作数或操作数地址。由于有2个字节的操作数或操作数地址。三字节指令共有17条4类:1)mov DPTR,#data16

2)mov direct,#data

3)CJNE A,#data,rel

4)LCALL addr16

四、指令按功能分类

MCS-51指令系统共有111条指令,操作码字节采用42种助记符,可以进行51中基本运算。按功能可分成5类:数据传输指令(29条);算术运算指令(24条);逻辑运算指令(24条);控制转移指令(17条);位操作指令(17条)。

五、指令系统综述

1、指令系统:某种单片机指令的集合或全体。

2、指令系统操作数字段使用的符号:

MCS-51指令系统中,除采用了42种助记符表示操作码的功能外,还在操作数字段使用了一些符号:

1)R n:工作寄存器。可以是R0~R7中的任意一个。

2)#data:立即数(8位二进制数)。即指令码中直接给出的8位二进制数,因此不占用内存单元。#是立即数的标志。

3)Direct:直接地址(8位二进制数)。是指片内RAM中的128B中的任何一个存储单元的地址以及SFR中的一个(可以使用符号地址,也可以使用物理地址)。

4)@R i:表示寄存器间址,即寄存器里的内容作为操作数的地址。其中R i表示当前选中的工作寄存器,且只能是R0或R1。@是寄存器间址的标志。

5)#data16:16位立即数。

6)@DPTR:表示以DPTR为数据指针的间址。用于访问片外的RAM/ROM。

7)Bit:位地址。可以是片内RAM位地址,SFR的位地址。

8)Addr11:11位目标地址。

9)Addr16:16位目标地址。

10)rel:补码形式表示的8位地址偏移量。

11)$:当前指令地址。

12)/:位操作数的取反操作前缀。

13)(?):表示内容,表示以“?”为地址的存储单元或寄存器中的内容(与direct比较,direct表示地址)。

14)((?)):(总的)表示内容。表示以“?”为地址的存储单元或寄存器中的内容作为地址的存储单元或寄存器中的内容。

15):表示将箭头右边的内容送入箭头左边的单元中。

第二节寻址方式

寻址方式:寻找操作数的方法称为寻址方式。

计算机执行指令的过程实际上就是不断寻找操作数和对操作数的过程。

在MCS-51系统中,操作数存放的范围是很宽的,可以在片外ROM/RAM中,也可以在片内ROM/RAM中,还可以在片内SFR中,这些地址的表示也是很丰富和灵活的,A,B,DPTR,PC等direct,Rn,Ri等C,bit等。寻址包括两方面内容:一是操作数的寻址,二是指令地址的寻址,(如转移指令,调用指令),其寻址的方式共有7种,寄存器寻址,直接寻址,立即数寻址,寄存器间址,变址寻址,相对寻址和位寻址。

对于两个操作数指令,若不特别声明,寻址方式均是指源操作数的寻址方式。

寻址方式所对应的寄存器和存储器空间见P40表3.1.

一、寄存器寻址

操作数存放在寄存器中,指令中直接给出该寄存器的名称(指寄存器的编号),这种寻址方式为寄存器寻址。如,mov A,Rn;把Rn中的内容传到A中。

采用寄存器寻址的有:1、工作寄存器组Rn;2、累加器A(用其编号,而不用其符号地址ACC或物理地址E0H)3、通用寄存器B;4、数据指针DPTR;5、C(布尔加法器)。

在形成的操作码中隐含有指示的寄存器的编号,

二、直接寻址

是指在指令中直接给出操作数所在存储单元的地址号,该地址指示了参与操作的数据所在的字节地址或位地址。这种寻址方式主要用于对特殊功能寄存器和内部RAM(低128B)的访问。如:MOV A,30H。

在直接寻址方式中,可以直接用符号地址代替。

三、立即寻址

是指在指令中直接给出参与操作的数据(立即数)的寻址方式,立即数前加“#”。这种寻址方式主要用于对特殊功能寄存器和对指定存储单元赋予初始值。如:MOV A,#30H。四、寄存器间接寻址

是指以指令中指定存储器(R0,R1,DPTR)的内容作为操作数的地址,再以该地址对应单元中的内容作为操作数,为了区别于寄存器寻址,因此在寄存器间接寻址中的寄存器名称前加地址符号“@”。如:MOV A,@R1。

五、变址寻址

是指将基址寄存器(DPTR和PC)与变址寄存器(A)的内容相加,形成一个16位结果,作为操作数的地址,实现对程序存储器的访问。如:MOVC A,@A+DPTR。

六、相对寻找

是指以程序计数器PC的当前值与指令中给定的8位偏移量相加,其结果作为跳转指令的目的地址,如:SJMP REL。

七、位寻址

是指按二进制位(bit)进行的寻址,可寻址位包括片内RAM的20H~2FH共16个字节128位和部分特殊功能寄存器的相关位,如:MOV 00H,C。

寄存器寻址:A,B或R n

直接寻址:片内低128B和SFR(符号地址)

RAM

位寻址:片内20H~2FH,SFR

@R i:低128B和片外RAM低128B

寄存器间址:

片外RAM64K

@DPTR:

片外ROM64K

@A+PC

变址寻址:

ROM

@A+DPTR

相对寻址:PC+2+rel

第三节8051指令系统

指令系统是计算机所固有的,是表征计算机性能特性的重要指标;同时它也是汇编语言程序

设计的基础。

学习指令系统时,应注意:

1、指令的格式、功能。

2、操作码的含义,操作数的表示方法。

3、寻址方式,源、目的操作数的范围。

4、对标志位的影响。

5、指令的适用范围。

6、正确估算指令的字节数。

一、数据传送类指令

数据传送类指令共29条,是把源操作数传送到指定目的操作数。指令执行后,源操作数的内容不变,而目的操作数的内容被修改;数据传送类指令对程序状态字PSW的Cy、Ac、OV位不产生影响。

数据传送类指令寻址范围:累加器A、片内RAM、SFR、片外RAM

数据传送类指令功能:(目的地址)←(源地址)。

1、片内数据传送指令(16条)

数据传送指令是在80C51内部RAM和特殊功能寄存器SFR间的传送,指令助记符为“MOV”,源操作数的寻址方式可以是立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。

1)8位数据传送指令(15条)

MOV A,#data ;A ←data

MOV A,direct ;A ←(direct)

MOV A,Rn ;A←(Rn)

MOV A,@Ri ;A←((Ri))

MOV direct ,#data ;direct ←data

MOV direct1,direct2 ;direct1 ←(direct2)

MOV direct,A ;direct ←(A)

MOV direct ,@Ri ;direct ←((Ri))

MOV direct,Rn ;direct ←(Rn)

MOV Rn,A ;Rn ←(A)

MOV Rn,direct ;Rn←(direct)

MOV Rn,#data ;Rn←data

MOV @Ri,A ;(Ri) ←(A)

MOV @Ri,direct ;(Ri) ←(direct)

MOV @Ri,#data ;(Ri) ←data

注:1、在片内能存放操作数的空间只能是#,A,direct,R n和@R;

2、立即数不能作为目的操作数;

3、在一条指令中R n和@R i不能同时出现。

2)16位数据传送指令(1条)

当需要对片外的RAM单元或I/O端口进行访问时,或进行查表操作

时,必须将16位地址赋给地址指针DPTR,这就必须使用16位数据传送

指令,这也是80C51指令系统中唯一的一条16位数据传送指令。

指令格式为:

MOV DPTR,#data16 ;属于立即寻址方式。

2、片外数据传送指令(4条)

当80C51 CPU与外部数据存储器或I/O端口之间进行数据传送时,只

能通过累加器Acc进行。其指令助记符为:MOVX,其中的X表示外部

(External),指令的表现形式如下:

MOVX A,@DPTR ;A ←((DPTR))

MOVX @DPTR,A ;(DPTR)←(A)

MOVX A,@Ri ;A ←((Ri))

MOVX @Ri,A ;(Ri)←(A)

注意:(1)使用Ri时,只能访问低8位地址为00H~FFH的地址段;

(2)使用DPTR时,能访问0000H ~FFFFH的地址段。

3、查表指令(2条)

查表指令也称为ROM数据传送指令,功能是实现从程序存储器ROM中

读取数据。其指令助记符为:MOVC,其中的C表示代码(Code),指

令的表现形式如下:

MOVC A, @A+PC ;A ←((A)+(PC))

MOVC A, @A+DPTR ;A ←((A)+(DPTR))

4、堆栈指令(2条)

在80C51系统之中,设计了一个先进后出(FILO)或后进先出

(LIFO)区域,用于临时保护数据及子程序调用、中断调用时保护现场

和恢复现场,该区域称为堆栈,在SFR中有一个堆栈指针SP,用以指出

栈顶位置。堆栈操作指令的实质是以栈指针SP为间址寄存器的间址寻址

方式。堆栈区应避开使用的工作寄存器区和其他需要使用的数据区,系

统复位后,SP的初始值为07H。为了避免重叠,一般初始化时要重新设

置SP。指令的表现形式如下:

PUSH direct /Acc

;SP←(SP)+1,((SP))←(direct/Acc)

POP direct /Acc

;(direct/Acc)←((SP)),SP←(SP)-1

5、交换指令(5条)

若进行数据传送时,要求保存目的操作数,则可采用数据交换

指令。指令的表现形式如下:

1)整字节交换指令:

XCH A,Rn ;(A) ←→(Rn)

XCH A,direct ;(A) ←→(direct)

XCH A,@Ri ;(A) ←→((Ri))

2)半字节交换指令:

XCHD A,@Ri ;(A) 3~0 ←→((Ri))3~0

3)累加器A高低半字节的交换指令:

SWAP A ;(A)3~0←→(A)7~4

二、算术运算类指令(24条)

算术运算指令有加法、减法、乘法和除法四类。对于加、减运算的两个操作数,一个存放在累加器A中(此操作数也为目的操作数);另一个存放在R0~R7或@Ri(片内RAM)中,或是#data(立即数)。除加1和减1指令外,其他所有的指令都将影响程序状态字PSW的标志位。指令的表现形式如下:

1、不带进位的加法指令(4条)

ADD A,Rn ;(A)←(A)+(Rn)

ADD A,direct ;(A)←(A)+(direct)

ADD A,@Ri ;(A)←(A)+((Ri))

ADD A,#data ;(A)←(A)+ data

加法运算影响PSW的标志位。如果D3位有进位,则辅助进位标志AC置位;否则AC为0(不管AC原来是什么值)。如果D7位有进位,则进位标志CY置位;否则CY为0(不管CY原来是什么值)。如果D6位和D7位中一个有进位而另一个无进位,则OV=1,溢出。

2、带进位的加法指令(4条)

ADDC A,Rn ;A←(A)+(Rn)+(CY)

ADDC A,direct ;A ←(A)+(direct)+(CY)

ADDC A, @Ri ;A ←(A)+((Ri))+(CY)

ADDC A, #data ;A ←(A)+data+(CY)

该类指令主要用于多字节的加法运算。

3、加1指令(5条)

加1指令又称为增量指令,其功能是使操作数所指定的单元的内容加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)+1

注意:以上指令仅影响PSW中的奇偶标志位。4、减1指令(4条) 减1指令又称为减量指令,其功能是使操作数所指定的单元的内容减1。

DEC A ;A←(A)-1

DEC Rn ;Rn ←(Rn)-1

DEC direct ;direct ←(direct)-1

DEC @Ri ;(Ri) ←((Ri))-1

注意:以上指令仅影响PSW中的奇偶标志位。

5、减法指令(4条)

减法运算只有带借位的减法指令,而没有不带借位的减法指令。指令的功能是从累加器中减去不同寻址方式的减数以及进位位CY的状态。其差仍存放在累加器A中。如果需要实现不带借位的减法计算,应预先置CY=0(利用CLR C指令),然后用减法指令SUBB 实现计算。SUBB对PSW中的所有标志位均产生影响。

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)

6、无符号数乘法指令(1条)

无符号数乘法指令完成A与B中两个8位无符号数相乘,16位乘积的低位字节放在累加器A,高位字节放在B中。

指令格式为:MUL AB ;(B)(A)←(A)×(B)

无符号数乘法指令对PSW标志位的影响:Cy位总是被清0的,P是由累加器A中1的个数的奇偶性决定的。乘法运算中,若乘积大于FFH,则OV标志位置1,否则清0。除法运算中,若除数为0,则OV标志位置1,否则清0。

7、无符号数除法指令(1条)

无符号数除法指令完成A与B中两个8位无符号数相除,商放入累加器A,余数放入寄存器B中。

指令格式为:DIV AB ;(A)←(A)/(B)…(B)

无符号数乘法指令对PSW标志位的影响:Cy位总是被清0的,P是由累加器A中1的个数的奇偶性决定的,若除数为0,则OV标志位置1,否则清0。

三、逻辑操作类指令(24条)

逻辑操作类指令用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。常用的逻辑运算和移位类指令有:逻辑与、逻辑或逻辑异或、清0、求反(非)、循环移位等24条指令,它们的操作数都是8位的。逻辑运算都是按位进行的,除用于逻辑运算外,还可用于模拟各种数字逻辑电路的功能,进行逻辑电路的设计。

1、逻辑与指令(6条)

逻辑与指令的运算符号’∧’。运算规则是:0∧0=0,0∧1=0,1∧0=0,1∧=1。常用于屏蔽字节中的某些位,或者使指定位为“0”。

指令的表现形式如下:

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

2、逻辑或指令(6条)

逻辑或指令的运算符号’∨’。运算规则是:0∨0=0,0∨1=1,1∨0=1,1∨=1。常用于置位字节中的某些指定位,或者使指定位为“1”。

指令的表现形式如下:

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

3、逻辑异或指令(6条)

逻辑异或指令的运算符号’⊕’。运算规则是:0⊕0=0,1⊕1=0,0⊕1=1,1⊕0=1。常用于使字节中的某些指定位取反,或者用于判断两个字节中的数据是否相等。指令的表现形式如下:

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、累加器A清0和取反指令(2条)

指令格式:CLR A ;(A)←00H

CPL A ;(A)←(/A)

特点:可以节省存储空间,提高程序执行效率。

5、循环移位指令(4条)

80C51的循环移位指令只能对累加器A进行循环移位。可分为:不带进位的循环左、右移位(RL、RR)和带进位的循环左、右移位(RLC、RRC)两类。

不带进位的循环左、右移位指令。

循环左移RL A ;Ai+1←Ai,A0←A7

循环右移RR A ;Ai←Ai+1,A7←A0

带进位的循环左、右移位指令。

循环左移RLC A ;Ai+1←Ai,Cy←A7,A0←Cy

循环右移RRC A ;Ai←Ai+1,Cy←A0,A7←Cy

四、控制转移类指令(17条)

为了控制程序的执行方向,80C51提供了17条控制转移指令,可分为无条件转移指令、条件转移指令、子程序调用及返回指令。

编程的灵活性取决于控制转移类指令,特别是条件转移指令。转移类指令丰富就能很方便地实现程序的向前、向后跳转,并根据条件分支运行、循环运行、调用子程序等。这些指令功能是通过修改程序计数器PC内容来实现,因为PC 的当前值是将要执行的下一条指令的地址。除了CJNE影响PSW的进位标志位Cy外,其余均不影响PSW的标志位。

1、无条件转移指令(4条)

无条件转移指令是指无需条件的程序转移,当执行到无条件转移指令时,就直接转移到该指令所提供的地址去。在程序设计中使用转移指令时指令中的地址或偏移量均可直接采用标号,因为在执行程序前进行汇编成时,编译系统会给每一个标号赋予一个实际的二进制地址。指令的表现形式如下:

1)长转移指令:LJMP addr16 ;PC←addr16

LJMP 称为长转移指令,其机器码为:02H、a15~a8B、a7~a0B,占3B。执行这条指令时就将addr16的内容赋给PC,程序无条件的转移到的程序存储器PC中与addr16对应地址单元执行,跳转范围64KB。

2)绝对转移指令:AJMP addr11 ;PC←(PC)+2,PC10~PC0←addr11 AJMP称为绝对转移指令,其机器码为:a10a9a800001B、a7a6a5a4a3a2a1a0B,占2B。指令中包含11位(2^11=2KB)的转移地址码addr11(a10~a0),转移目标地址必须和AJMP 指令的下一条指令首字节处于同一2KB区域内,且转移目标地址为:PC当前值的高5位保持不变低11位用addr11填充,形成新的目标地址。地址形成示意图如图所示。

3)相对转移指令:SJMP rel ;PC←(PC)+2+rel

相对转移指令的机器码为:80H、rel, 占2B。由于rel是一个用补码表示的带符号的8位二进制数,所以其相对转移范围为-128~+127,共256B区域。

转移目标地址为:源地址+2+rel= PC当前值((PC)+2)+rel。

若偏移量rel为FEH(-2的补码),则转移目标地址就等于源地址即程序始终运行SJMP 指令,相当于动态停机,这弥补了80C51没有专用停机指令的遗憾。动态停机的软件实现:

HERE:SJMP HERE

或者写为:SJMP $ ;“$”表示该指令首字节所在的地址,此时可省略标号。

4)间接(散)转移指令:JMP @A+DPTR ;PC ←(DPTR)+(A)

JMP 为单字节指令,指令的机器码为73H,转移目标地址为由(A)+(DPTR)形成,并直接送入PC,指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。

2、条件转移指令(8条)

条件转移指令是依据某种特定条件而实现转移的指令。当条件满足时发生转移(相当

于执行一条件相对转移指令);当条件不满足时,顺序执行下一条指令。判定条件的方法主要有三种情况:判断累加器的内容是否为0、判断两个数是否相等和判断减1是否为0。

在执行条件转移指令时,PC指针已经指向下一条指令的首地址(PC当前值):

若条件满足:转移目标地址=PC当前值+偏移量rel

若条件不满足:目标地址=PC当前值

1)累加器A为零(非零)转移

指令JZ rel ;若(A)=0,则转移PC ←(PC)+2+rel

;若(A)≠0,则顺序执行:PC ←(PC)+2 JNZ rel ;若(A)≠0,则转移PC ←(PC)+2+rel

;若(A)=0,则顺序执行PC ←(PC)+2 指令的转移范围:rel的取值范围是在执行当前转移指令后的PC值基础上的-128~+127(用补码表示)范围内。可以采用符号地址表示。

偏移量rel的计算方法:

rel = 转移目标地址-转移指令地址(当前PC值) -2

2)减1非零转移

指令DJNZ Rn,rel ;Rn←(Rn)-1

;若(Rn)≠0,则转移PC←(PC)+2+rel

;若(Rn)=0,则程序顺序执行PC←(PC)+2

DJNZ direct,rel ;direct←(direct)-1

;若(direct)=0,则程序顺序执行PC ←(PC)+3

;若(direct)≠0,则转移PC ←(PC)+3+rel0

3)比较(不相等)转移指令

比较转移指令的格式:CJNE <目的操作数>,<源操作数>,rel 说明:

(1)当<目的操作数>为A时,<源操作数>可以是#data、direct;

(2)当<目的操作数>为Rn、@Ri时,<源操作数>只能是#data。

比较转移指令的比较实质是减法运算,影响Cy标志位,但不保存最后的差值,并且两个操作数的内容不变,比较(不相等)转移指令的机器码占3B。指令的表现形式为:

CJNE A,#data,rel

CJNE A,direct,rel

CJNE Rn,#data,rel

CJNE @Ri,#data,rel

若<目的操作数>=<源操作数>,则程序顺序执行:

PC←(PC)+3,CY=0

若<目的操作数>><源操作数>,则程序转移:

PC←(PC)+3 +rel,CY=0

若<目的操作数><<源操作数>,则程序转移:

PC←(PC)+3+rel,CY=l

3、子程序调用和返回指令(4条)

在程序设计中,为了简化程序结构、减少程序所占的存储空间,往往将需要反复执行的某段程序编写成子程序,供主程序在需要时调用。一个子程序可以在程序中反复多次调用。为了实现主程序对子程序的一次完整调用,必须有子程序调用指令和子程序返回指令。子程序调用指令在调用程序中使用,而子程序返回指令则是被调用子程序的最后一条指令,调用与返回指令是成对使用的。当执行调用指令时,自动把程序计数器PC中的断点地址压

入到堆栈中,并自动将子程序入口地址送入程序计数器PC中;当执行返回指令时,自动把堆栈中的断点地址恢复到程序计数器PC中。

1)绝对调用指令

ACALL addr11 ;PC←(PC)+2,

;SP←(SP)+1,(SP)←(PC)7~0

;SP ←(SP)+1,(SP)←(PC)15~8,(PC)10~0←addr11 其中:addr11为11位地址,实际编程时可以用符号地址。并且只能在2KB范围以内调用子程序。

2)长调用指令

LCALL addr16 ;PC←(PC)+3,

;SP←(SP)+1,((SP))←(PC)7~0

;SP ←(SP)+1,((SP))←(PC)15~8,(PC)15~0←addr16 其中:addr16为16位地址,实际编程时可以用符号地址。可以在64KB范围以内调用子程序。

3)子程序返回指令

RET ;(PC)15~8←((SP)),SP←(SP)1,

;(PC)7~0←((SP)),SP ←(SP)1

4)中断返回指令

RETI ;(PC)15~8←((SP)),SP←(SP)1,

;(PC)7~0←((SP)),SP ←(SP)1

说明:中断服务程序是一种特殊的子程序,它是在计算机响应中断时,由硬件完成调用而进入相应的中断服务程序。RETI指令与RET指令相仿,区别在于RET是从子程序返回,RETI 是从中断服务程序返回。无论是RET还是RETI都是子程序执行的最后一条指令。

4、空操作指令(1条)

CPU不执行任何操作,消耗了一个机器周期,常用于软件延时或在程序可靠性设计中用来稳定程序。

NOP ;PC ←(PC)+1

五、位操作指令(17条)

位操作又称布尔变量操作,它是以位为单位来进行运算和操作的.80C51系统内设置了一个位处理器(布尔处理机),它有自己的累加器(借用进位标志CY)、存储器(位寻址区中的各位),也有完成位操作的运算器等,有一套位变量处理的指令集。

1、位传送指令(2条)

MOV C,bit ;CY ←(bit)

MOV bit,C ;(bit) ←(CY)

2、位置位和位复位指令(4条)

对进位标志CY以及位地址所规定的各位进行置位(置1)或复位(置0)操作。

SETB C ;使CY=1(置位)

SETB bit ;使指定的位地址等于1(置位)

CLR C ;使CY=0(复位)

CLR bit ;使指令的位地址等于0(复位)

3、位运算指令(6条)

位运算指令中,只有位逻辑与、位逻辑或和位取反运算,对于其它位逻辑运算可以参照布尔代数的运算规则。

ANL C,bit ;位与,CY←CY∧bit

ANL C,/bit ;位与,CY←CY∧/bit

ORL C,bit ;位或,CY←CY∨bit

ORL C,/bit ;位或,CY←CY∨/bit

CPL C ;位取反,CY←/CY

CPL bit ;位取反,bit←/bit

4、位转移指令(3条)

JB bit,rel

;若(bit)=1,则转移(PC)←(PC)+3+rel,否则顺序执行

JNB bit,rel

;若(bit)=0,则转移(PC)←(PC)+3+rel,否则顺序执行

JBC bit,rel

;若(bit)=1,则转移(PC)←(PC)+3+rel,且(bit )←0,否则顺序执行

5、判CY标志指令(2条)

JC rel ;若(Cy )=1,则转移(PC)←(PC)+2+rel , 否则顺序执行

JNC rel ;若(Cy )=0,则转移(PC)←(PC)+2+rel , 否则顺序执行

相关主题
相关文档
最新文档