忆和难修改等缺点。因此人们通常不用它来编写程序。指令的十六进制形式虽然读写方便,但仍不易为人们识别和修改,通常也不被用来编写程序,只是在某些场合(如实验室,才被用来作为输人程序的一种辅助手段。指令以这种十六进制代码输入机器以后,需要由常驻于机器内部的监控程序把它们翻译为二进制形式存人内存储器,而后才能为机器所识别和执行。指令的助记符形式又称为指令的汇编符形式或汇编语句形式,是一种由英文单词或缩写字母形象表征指令功能的形式。这种形式不仅易为人们识别和读写,而且记忆和交流极为方便,常常被人们用来进行程序设计。但编好和修改好的程序必须通过人工或机器把它们翻译成机器码形式才能被计算机执行。例如,如果累加器A中已有一个加数10,那么,能够完成10+8并把结果送人累加器A的加法指令的二进制形式为0010010000001000B;指令的十六进制形式为2408H;指令的助记符形式为: ADD A, #08H ;A←A+08H
其中,ADD为操作码,指示进行加法操作,逗号右侧为源操作数或第一操作数,逗号左侧的累加器A在指令执行前为第二操作数寄存器,在指令执行后为结果操作数寄存器;分号的后面部分为注释,它并非指令的组成部分。只是用来标明相应指令的功能。
2.3.1.3 指令的字节数
在指令的二进制形式中,指令不同,指令的操作码和操作数也不相同。有些指令的操作码和操作数加起来只有1个字节,这种指令称之为单字节指令;有些指令是双字节指令,操作码和操作数各占1个字节。同样道理,可以有3字节指令、4字节指令等等。
按照指令码的字节来分,MCS-51单片机通常可以分为单字节、双字节和3字节指令三种。
(1) 单字节指令(49条)
单字节指令码只有一个字节,由8位二进制数组成。这类指令共有49条,占总指令数的44%。通常,单字节指令又可打为两类:一类是无操作数的单字节指令;另一类是含有操作数寄存器编号的单字节指令。
1) 无操作数单字节指令 这类指令的指令码只有操作码字段,没有专门指示操作数的字段,操作数是隐含在操作码中的。例如,INC DPTR指令的二进制形式为
其中:8位二进制数码皆为操作码,DPTR数据指针由操作码隐含。
2) 含有操作数寄存器号的单字节指令 这类指令的指令码由操作码字段和专门用来指示操作数所在寄存器号的字段组成。 例如,8位数传送指令
MOV A, Rn ;A←Rn
- 26 -
其中:n的取值范围为0~7,相应指令码格式如图2-14所示。
图2-14 MOV A, Rn指令的格式
图2-14中,r r r 3位为源操作数所在的寄存器号。取值范围为000B~111B;其余5位为操作码,目的操作数寄存器是累加器A,由操作码字段隐含。 (2) 双字节指令(46条)
双字节指令含有两个字节,可以分别存放在两个存储单元中,操作码字节在前,操作数字节在后。操作数字节可以是立即数(即指令码中的数),也可以是操作数所在的片内RAM地址。 例如:8位数传送指令
MOV A, #data ;A←data
这条指令的含义是把指令的第2字节data取出来存放到累加器A中,该指令的指令码为:
其中:74H为操作码,占1个字节;data为源操作数,也占1个字节;累加器A是目的操作数寄存器,由操作码隐含。 (3) 三字节指令(16条)
这类指令的指令码的第1字节为操作码,第2和第3字节为操作数或操作数地址。由于有两个字节的操作数或操作数地址,故三字节指令共有如下四类:
- 27 -
通常,指令字节数越少,指令执行速度越快,所占存储单元也就越少。因此,在程序设计中,应在可能的情况下注意选用指令字节数少的指令。 2.3.1.4指令的分类
指令通常是按功能分类的。MCS51单片机按功能可以分为5类:数据传送指令、算术运算指令、逻辑操作和环移指令、控制转移指令和位操作指令等。 (1) 数据传送指令(28条)
这类指令共有28条,主要用于在单片机片内RAM和特殊功能寄存器SFR之间传送数据,也可以用于在单片机片内和片外存储单元之间传送数据。数据传送指令是把源地址中操作数传送到目的地址(或目的寄存器)的指令,在该指令执行后源地址中的操作数不被破坏,源操作数有8位和16位之分,前者称为8位数传送指令,后者称为16位数传送指令。
交换指令也属于数据传送指令,是把两个地址单元中的内容相互交换。因此,这类指令中的操作数或操作数地址是互为“源操作数/源操作数地址”和“目的操作数/目的操作数地址”的。 (2) 算术运算指令(24条)
算术运算指令共有24条,用于对两个操作数进行加、减、乘、除等算术运算。在两个操作数中,一个应放在累加器A中,另一个可以放在某个寄存器或片内RAM单元中,也可以放在指令码的第2和第3个字节中。指令执行后,运算结果便可保留在累加器A中,运算中产生的进位标志、奇偶标志和溢出标志等皆可保留在PSW中,参加运算的两数可以是8位的,也可以是16位的。 (3) 逻辑操作和环移指令(25条)
这类指令包括逻辑操作和环移两类指令。逻辑操作指令用于对两个操作数进行逻辑乘、逻辑加、逻辑取反和异或等操作,大多数指令也需要把两个操作数中的一个预先放人累加器A,操作结果也在累加器A中。环移指令可以对累加器A中的
- 28 -
数进行环移,环移指令有左环移和右环移之分,也有带进位位Cy和不带进位位Cy之分。
(4) 控制转移指令(17条)
控制转移指令分为条件转移、无条件转移、调用和返回等指令,共17条。这类指令的共同特点是可以改变程序执行的流向,或者是使CPU转移到另一处执行,或者是继续顺序地执行。无论是哪一类指令,执行后都以改变程序计数器PC中的值为目标。
(5) 位操作指令(17条)
位操作指令又称布尔变量操作指令,共分为位传送、位置位、位运算和位控制转移指令等四类。其中,位传送、位置位和位运算指令的操作数不是以字节为单位进行操作,而是以字节中某位中的内容为单位进行的;位控制转移指令不是以检测某个字节为条件而转移,而是以检测字节中的某一位的状态来转移的。
2.3.1.5 指令系统综述
指令的集合或全体称为指令系统。指令系统是微型计算机核心部件CPU的重要性能指标,是进行CPU内部电路设计的基础,也是计算机应用工作者共同关心的问题。因此,计算机类型不同,指令系统中每条指令的格式和功能也不相同。 MCS-51单片机指令系共有111条指令,可以实现51种基本操作。这111条指令的分类方法颇多,除可以按照指令功能和字节数分类外,还可以按照指令的机器周期数来分类。如果按照指令的机器周期数来分,MCS-51系列单片机常可以分为单机器周期指令57条,双机器周期指令52条和四机器周期指令2条等。 (1) 指令系统中所用符号的说明
MCS-51指令系统中的所有指令如附录所列,附表中,除了操作码字段采用了42种操作码助记符外,还在源操作数和目的操作数字段中使用了一些符号。这些符号的含义归纳如下:
1) Rn:工作寄存器,可以是R0-R7中的一个;
2) #data:8位立即数,实际使用时data应是00H-FFH中的一个。
3) direct:8位直接地址,实际使用时direct应该是00H-FFH中的一个,也可以是特殊功能寄存器SFR中的一个。
4) @Ri:表示寄存器间接寻址,Ri只能是R0或R1。 5) #data16:16位立即数。
6) @DPTR:表示以DPTR为数据指针的间接寻址,用于对外部64K RAM/ROM寻址。 7) bit: 位地址
8) addr11:11位目标地址。 9) addrl6:16位目标地址。
10) rel: 8位带符号地址偏移量。
- 29 -
11) $:当前指令的地址 (2) 指令对标志位的影响
MCS-51指令分两类:一类指令执行后要影响到PSW中某些标志位的状态,即不论指令执行前标志位状态如何,指令执行时总按标志位的定义形成新的标志状态;另一类指令执行后不会影响到标志位的状态,标志位原来是什么状态,指令执行后也是这个状态。
不同的指令对标志位影响是不相同的,每条指令对标志位的影响如附录所示,其中,√表示对相应标志位有影响,×表示对相应标志位无影响。 2.3.2 寻址方式
在计算机中,寻找操作数的方法定义为指令的寻址方式。在执行指令时,CPU首先要根据地址寻找参加运算的操作数,然后才能对操作数进行操作,操作结果还要根据地址存入相应存储单元或寄存器中。因此,计算机执行程序实际上是不断寻找操作数并进行操作的过程。通常,指令的寻址方式可以有多种,寻址方式越多,指令功能就越强。
在MCS-51单片机中.操作数的存放范围是很大的.可以放在片外ROM/RAM中,也可以放在片内ROM/RAM以及特殊功能寄存器SFR中。为了适应这一操作数范围内的寻址,MCS-51的指令系统共使用了7种寻址方式,它们是:寄存器寻址、直接寻址、立即寻址、寄存器寻址、变址寻址、相对寻址和位寻址等。 (1) 寄存器寻址
这类指令所需操作数在MCS-51内部累加器A、通用寄存器B和某个工作寄存器R0-R7等中,指令码内含有该操作数的寄存器号。例如,加1指令INC Rn,含义是把Rn工作寄存器中的内容加1,其指令格式为:
其中:r r r三位二进制代码可以代表工作寄存器R0-R7中的任何一个。其编号如图3-1所示。苦r r r=000B,则上述指令变为 INC R0,指令码为08H,CPU执行后可使R0中的内容加1。由表2-2可知,R0的物理地址由PSW中RS1和RS0的状态决定。因此,若设RS1=01B,则R0的物理地址必为08H,MCS-51单片机执行INC R0指令后,08H单元中的内容可由原来的24H变为25H,如图2-15所示。
- 30 -