水电站计算机监控技术(第二版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第二节 MCS—51指令系统

用于计算机完成各种指定操作的命令称为指令(Instruction)。一台计算机所能执行的各种指令的集合称为它的指令系统(Instruction Set)。不同的计算机有不同的指令系统,计算机的性能与指令系统的功能是否强大有很大的关系。

指令的表示方法称为指令格式,一条指令通常由操作码和操作数两部分组成。操作码用来规定指令要进行的操作;操作数则是指令操作的对象。操作数可能是一个具体的数据,也可能是指出获取数据的地址。

一、MCS—51的寻址方式

指令中说明操作数据所在地址的方式即寻址方式(Addressing mode)。寻址的“地址”即为操作数所在的存放位置,单片机有7种寻址方式。

1.直接寻址方式

直接寻址就是在指令中直接给出操作数地址的寻址方式。例如:MOV A,68H,这条指令的意义是把内部RAM中的68H单元中的数据内容传送到累加器A中。这种寻址方式能够使用利用直接字节地址来寻址的存储器空间内部RAM和特殊功能寄存器。

2.寄存器寻址方式

寄存器寻址对选定的8个工作寄存器R0~R7进行操作,以寄存器的内容为操作数的寻址方式。例如指令MOV A,R1,这条指令的意义是把R1中的内容送到累加器A中。

3.寄存器间接寻址方式

以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。例如指令MOV A,@R0,这条指令的意义是将R0寄存器指向的地址单元中的内容送到累加器A中。假如R0=#56H,此指令的功能是将56H单元中的数据送到累加器A中。寄存器间接寻址方式可用于访问内部RAM或外部数据存储器。外部数据存储器的空间为64KB,可采用DPTR寄存器作为间址寄存器进行访问,指令如下:MOVX A,@DPTR,即将DPTR指向的外部RAM单元的内容送到累加器A中。

4.立即寻址方式

指令中直接给出操作数的寻址方式。指令中的立即操作数称为立即数,以“#”符号表示。例如:MOV A,#0EH,即将0EH这个操作数送到累加器A中。除8位立即数外,MCS—51指令系统中还有一条16位立即寻址指令,以#data16表示16位立即数,该指令为:MOV DPTR,#data16,其功能是把16位立即数送数据指针DPTR。

5.变址寻址方式

以DPTR或PC作基址寄存器,以累加器A作变址寄存器,两者内容之和形成的16位操作数地址的寻址方式。例如指令:MOVC A,@A+DPTR,其功能是把DPTR和A的内容相加,相加后的结果作为程序存储器的地址,再把该地址单元的内容送到累加器A中。

6.位寻址方式

MCS—51可以对数据位进行操作,因此就有相应的位寻址方式。位寻址指令中直接使用位地址,例如:MOV C,3AH,指令功能是把3AH位的内容(状态)送进位位C。

7.相对寻址方式

相对寻址方式是为了程序的跳转而设计的。以PC的内容为基址,加上指令给出的偏移量rel作为转移的目的地址。转移的目的地址可用如下公式表示

目的地址=转移指令地址+转移指令字节数+偏移量

二、分类指令

MCS—51单片机指令系统共有指令111条,分为数据传送类、算术运算类、逻辑运算类、移位类、位操作类5大类。

1.指令格式中符号说明

Rn:当前指定的工作寄存器组中的R0~R7,n=0~7。

Ri:当前指定的工作寄存器组中的R0~R1,n=0~1。

dir:8位直接字节地址(在内部RAM和特殊功能寄存器空间中)。

#data:8位立即数。

#data16:16位立即数。

addr16:16位目的地址值。

Addr11:11位地址值。

rel:相对偏移量,为8位带符号补码数。

bit:位地址值,在位地址空间中。

(X):某寄存器或某单元的内容。

((X)):由X间接寻址的单元的内容。

2.数据传送指令

(1)以累加器A为目的操作数类指令(4条)。将源操作数指向的内容送到累加器A。源操作数有直接、立即数、寄存器和寄存器间接等寻址方式。

(2)以寄存器Rn为目的操作数的指令(3条)。将源操作数指定的内容送到所选定的工作寄存器Rn中。源操作数有直接、立即和寄存器等寻址方式。

(3)以直接地址为目的操作数的指令(5条)。将源操作数指定的内容送到直接地址direct所选定的片内RAM中。源操作数有直接、立即、寄存器和寄存器间接等寻址方式。

(4)以间接地址为目的操作数的指令(3条)。将源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。源操作数有直接、立即和寄存器等寻址方式。

(5)查表指令(2条)。对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式。

(6)累加器A与片数据存储器RAM传送指令(4条)。累加器A与片外RAM间的数据传送,使用寄存器寻址方式。

(7)堆栈操作类指令(2条)。将直接寻址单元的内容传送到堆栈指针SP所指的单元中,或把SP所指单元的内容送到直接寻址单元中。下述的第1条常称为入栈操作指令,第2条称为出栈操作指令。

(8)交换指令(5条)。将累加器A中的内容与源操作数所指的数据相互交换。

(9)16位数据传送指令(1条)。将16位立即数送入 DPTR(也称数据指针)。

3.算术运算指令

算术运算主要是执行加、减、乘、除、加1、减1和十进制调整等指令。

(1)加法指令。将立即数、直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存于A中,源操作数不变。

(2)带进位加法指令。带进位加法指令除与ADD功能相同外,在进行加法运算时还需考虑进位位C的内容。

带进位加法指令常用于多字节数的加法运算。

(3)带借位减法指令。这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C的内容相减,结果送回累加器A中。在进行减法运算中,C=1表示有借位,C=0则无借位。在进行减法运算前,如果不知道借位标志位C的状态,则应先对C进行清零操作。

(4)乘法指令。将累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。

(5)除法指令。将累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。

(6)加1指令。将源操作数的内容加1,结果送回源操作数。主要用于修改地址指针和计数的次数。

(7)减1指令。将所指的源操作数的内容减1,结果送回源操作数。

(8)十进制调整指令。在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行十进制调整和修正。指令格式为:

DA A

4.逻辑运算及移位指令

(1)逻辑运算指令。逻辑运算都是按位进行操作,MCS—51单片机对操作数可进行与、或、异或、非4种逻辑运算。

1)逻辑与指令。将源操作数和目的操作数内容按位执行与操作,将结果送到目的操作数中,源操作数中的内容保持不变。

在逻辑运算中有:1 ∧ X=X,0 ∧ X=0。因此,可用ANL指令实现对目的操作数的某些位进行清零;某些位保持不变。如ANL A,#0FH,指令执行后使A的高4位置0,低4保持不变。

2)逻辑或操作指令。将源操作数和目的操作数按位执行或操作,将结果送到目的操作数中,源操作数保持不变。

在逻辑或运算中有:1 ∨ X=1,0 ∨ X=X。因此,可用ORL指令实现对目的操作数的某些位进行置1;某些位保持不变。

3)逻辑异或操作指令。将源操作数和目的操作数按位执行异或操作,将结果送到目的操作数中,源操作数不变。

在逻辑异或运算中有:1X=/X(取反),0X=X,因此,可用XRL指令实现对目的操作数的某些位进行求反,某些位保持不变。

4)累加器求反指令。将累加器A中的内容逐位取反后送回A中。指令格式为CPL A

(2)循环移位指令。MCS—51单片机的移位指令只能对累加器A进行逻辑移位,执行一次指令只能移一位。移位操作有循环左移、循环右移、带进位循环左移和带进位循环右移4种,图3-5为循环移位指令的执行过程示意图。

1)循环左移指令

RL A

2)循环右移指令

RR A

3)带进位循环左移指令

RLC A

4)带进位循环右移

RRC A

图 3-5 循环移位指令的执行过程示意图

5.位操作指令

布尔处理功能是MCS—51系列单片机的一个重要特征,是以位(bit)为单位进行操作的。

(1)位传送指令。在可寻址位bit与累加位C之间的传送操作。位传送指令有以下两种形式。

(2)位运算指令。位运算有与、或、非等位操作,指令格式如下。

(3)置位与复位指令。对C及可寻址位进行置位或复位操作,共有4条指令,格式如下。

(4)位控制转移指令。位控制转移指令是以位的状态作为实现程序转移的判断条件,指令格式如下。

6.控制转移类指令

通常情况下,程序的顺序执行是由PC自动加1实现的。要改变程序的执行顺序,实现分支转移,应通过控制转移类指令强迫改变PC值的方法来实现。

(1)条件转移指令。

1)短跳转指令。

AJMP addr11

这是2K字节范围内的无条件跳转指令。AJMP把MCS—51单片机的64K程序存储器空间划分为32个区,每个区2K字节,转移的目标地址必须与AJMP下一条指令的第一个字节在同一2K个字节区范围内。执行该指令时,先将PC加2,然后把addr11送入PC.10~PC.0,PC.15~PC.11保持不变,程序转移到目标地址指定的地方。

2)相对转移指令。

SJMP rel

这是无条件转移指令,其中rel为相对偏移量。rel能实现的程序转移是双向的。rel为正,则向后转移;rel为负,则向前转移。执行本指令时,在PC加2(本指令为2个字节)之后,把指令的有符号的偏移量rel加到PC上,并计算出目标地址。用户在编写程序时,只需在相对转移指令中,直接写上要转向的目标地址标号就可以了。

例如:LOOP:MOV A,#67H;LOOP标示的指令

SJMP LOOP;程序跳到LOOP所标示的指令位置

程序在汇编时,由汇编程序自动计算偏移量rel。

3)长跳转指令。

LIMP addr16

这条指令执行时无条件地转向addr16指出的目标地址。转移的目标地址可以在64K程序存储器地址空间的任何位置。

4)间接跳转指令。

JMP@A+DPTR

这是一条单字节的转移指令,转移的目标地址由A中8位无符号数与DPTR的16位数内容之和来确定。本指令以DPTR内容作为基址,A的内容作变址。因此,只要把DPTR的值固定,而给A赋予不同的值,即可实现程序的多分支转移。

(2)条件转移指令。执行条件转移指令时,如指令中规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。当条件满足时,把下一条指令的第一个字节地址装入PC,再把指令中带符号的相对偏移量rel加到PC上,计算出应转向的目标地址。转移的目标地址在以下一条指令地址为中心的256个字节范围内(-128~+127)。

1)以累加器A的内容为转移条件。

2)比较不相等则转移指令。

3)减1不为0转移指令。这是一组把减1与条件转移两种功能结合在一起的指令,共两条。

(3)调用子程序指令。

1)短调用指令。

ACALL addr11

这是2K字节范围内的凋用子程序的指令。执行时先把PC加2(本指令为2字节指令),获得下一条指令地址,把该地址压入堆栈中存放起来,最后调子程序,就是把PC的高5位和指令代码中的addr11连接获得16位的子程序入口地址,并送入PC,转向执行子程序。所调用的子程序地址必须与ACALL指令下一条指令的第一个字节在同一个2KB区内。

2)长调用指令。

LCALL addr16

LCALL指令可以调用64K字节范围内程序存储器中的任何一个子程序。指令执行时,先把程序计数器加3(本指令为3字节指令)获得下条指令的地址,并把它压入堆栈,同时把堆栈指针加2。接着把addr16装入PC中,然后从PC指向的地址开始执行程序。

(4)子程序的返回指令。

RET;从调用子程序返回,与LCALL或ACALL指令配合使用。

(5)中断返回指令。

RETI;从中断服务程序中返回。

(6)空操作指令。

NOP

执行该指令时CPU不进行任何实际操作,只消耗一个机器周期的时间。只执行(PC)+1→PC操作。NOP指令常用于程序中的等待或时间的延迟。

三、伪指令

伪指令在汇编程序中将各分类指令翻译成机器指令提供信息,汇编时不生成代码。汇编语言的伪指令较多,本书仅介绍常用的一部分。

1.常量和标号

(1)常量。常量是指在汇编时已经有确定数值的量。以数值形式出现在符号指令中的常量称数值常量;使用预先定义的名称来表示的常量称符号常量。

符号常量由伪指令EQU定义,其格式如下:

常量名 EQU 表达式

如:PI EQU 30H;30H→PI

(2)标号。MCS—51 MBUG把标号分为数据标号和指令标号两类。

1)数据标号。数据标号是程序存储器中的数据或数据区的符号表示。数据标号名即是数据的地址或数据区的首地址。指令中的存储器操作数可以用数据标号或地址表达式给出。数据标号使用数据定义伪指令DB(定义字节)和DW(定义字)来定义。其格式是:

[数据标号名]数据定义伪指令 表达式[,…]

用DW定义的字数据标号占用两个存储单元,低地址单元存放的是字的高字节,高地址单元存放的是字的低字节。如有一字数据标号的定义为

ABC DW 1234H

其中,ABC单元的内容为12H,ABC+1单元的内容为34H。

2)指令标号。指令标号是指令地址的符号表示。直接写在指令前,用冒号“:”隔开。如标号CYCLE的定义为

CYCLE:MOV A,@R0

2.程序的定位和结束伪指令

(1)置汇编地址计数器伪指令。汇编地址计数器的值可以用伪指令ORG设置,其格式为

ORG 数值表达式

功能是将汇编地址计数器的值设置成数值表达式的值。其值的范围是0000H~FFFFH。在程序的第一条指令之前,若没有设置ORG伪指令,汇编地址时程序计数器的值将被设置为0000H。

(2)源程序结束伪指令。源程序结束伪指令的格式为

END

功能是标志整个程序汇编结束。