|
3.3 单片机的指令 |
指令不同于伪指令,单片机的指令是切实可以产生实际操作的命令。单片机使用这些指令,可以实现外部数据信息的读取,内部CPU的算法和流程处理,以及对外部接口设备进行控制等。
单片机的指令系统和军队的指挥命令类似,通过完备的命令来协调各个部分的动作。单片机CPU所能执行的所有指令的集合也就是单片机的指令系统。
一般来说,不同类型及不同厂商的单片机,其指令系统并不是完全一样的。对于51系列的单片机来说,为了兼容性的考虑,各个厂商保证了其指令集基本一致。因此,学习和掌握了其中一种指令系统,对其他51系列的任何单片机都可以很容易地上手。
对于增强型51系列单片机,基本上采用了绝大部分的8051指令集。除此之外,还提供了一些增强型的指令。也就是如果该单片机内部集成了更多的硬件资源,那么将会提供相应的指令进行访问。
在程序中的每条指令都必须遵循特定的格式,指令格式其实就是指令的表示方法。对于单片机汇编语言来说,一条指令通常由操作码和操作数两部分组成,示例如下:
操作码 操作数
其中,操作码表示了指令执行什么操作,一般采用指令的助记符来表示。操作数表示了指令的操作对象,可以是地址、寄存器或者立即数。在操作码和操作数之间,一般至少需要1个空格或制表符,用来区分指令的两部分。
在一个指令中,操作数的个数是确定的。但不同的指令可以有不同的操作数个数。例如,某些指令具有默认的操作对象,便不需要跟操作数。有些指令需要一个操作数,而有些指令则需要两个或者两个以上的操作数。对于多个操作数的指令,操作数和操作数之间需要用“,”来分隔。
单片机的指令按照其对应的机器码的长度,可以分为如下三种。
●单字节指令,其对应的机器码只有一个字节,在单片机的程序存储器中占用1个字节的存储单元。单字节指令的功能明确专一,操作简单。
●双字节指令,其对应的机器码为两个字节,第一个字节表示操作码,第二个字节表示操作数。双字节指令在单片机的程序存储器中占用两个字节的存储单元。
●三字节指令,其对应的机器码为三个字节,第一个字节表示操作码,后二个字节表示操作数。三字节指令在单片机的程序存储器中占用三个字节的存储单元。
指令的执行是需要操作对象的,单片机指令获取操作对象的方式便是指令的寻址方式。多样化的寻址方式为单片机提供了灵活的程序设计方法。这就与去往某地可以有多个路径可供选择一样。这样带来的好处是不同的需求下采用不同的寻址方式可以提高指令执行的速度。但是,这也增加了单片机指令系统的复杂程序,为学习带来不便。
在单片机指令系统中,提供了立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址共7种寻址方式。
1.立即寻址
立即寻址相当于直接给出操作数,此时的操作数称为立即数。立即数的前面采用标识符“#”来表示,是寻址指令中直接出现的数据。在这里,立即数可以采用不同的表示方式:
●十六进制,结尾用字符H来区别;
●十进制,结尾用字符D来区别,一般可以省略;
●八进制,结尾用字符O来区别;
●二进制,结尾用字符B来区别。
在单片机中,立即寻址方式的寻址空间是程序存储器,也就是说立即寻址方式所操作的立即数是存储在指令字节中的。
立即寻址的立即数主要是8位单字节数据,典型的立即寻址示例如下:
这里,“37H”就是十六进制立即数,该指令的功能是把37H这个数本身送到累加器A中。指令的操作码为74H,操作数为37H,如图3-1所示。
另外,在51单片机的指令系统中,由于寄存器DPTR为16位的寄存器,因此此时立即数是16位的,用于向地址指针传送16位的地址值。示例如下:
这里,“1122H”为16位立即数,该指令将立即数的高8位11H送入DPH,将低8位22H送入DPL。该指令的操作码是90H,操作数是1122H,如图3-2所示。
图3-1 MOV A,#37H指令执行示意图
图3-2 MOV DPTR,#1122H指令执行示意图
2.直接寻址
直接寻址方式相当于将操作数存放的地址告诉指令,此时为了和立即寻址相区别,地址前没有标识符“#”。在单片机中,直接寻址方式可寻址如下两类存储空间。
●片内RAM的低128个字节单元,其地址为00H~7FH。这样,在这128位地址的直接寻址方式中,00H代表第0位,01H代表第1位,依此类推。
●特殊功能寄存器,其直接地址也可以用特殊功能寄存器的符号名称表示。直接寻址也是访问特殊功能寄存器的唯一方法。
直接寻址指令,示例如下:
这里,“2EH”就是直接寻址的地址。该指令的操作码是E5H,功能是把内部RAM地址为2EH中的内容12H传给累加器A。该指令执行的示意图如图3-3所示。
图3-3 MOV A,2EH指令执行示意图
3.寄存器寻址
寄存器寻址相当于告诉指令操作数所存放的寄存器,此时,寄存器中的内容作为操作数。由于寄存器位于单片机CPU的内部,因此采用寄存器寻址的速度比其他几种寻址方式要快,可以使程序具有较高的运算处理速度。但是单片机中可以使用的寄存器比较少,寄存器寻址可以寻址如下几种:
●通用寄存器R0~R7
●累加器A
●寄存器AB
●数据指针DPTR
在指令的操作数位置上指定寄存器的寻址方式。其中,寄存器的内容作为操作数。采用寄存器寻址方式的指令一般都是一个字节的指令。这种方式可以寻址寄存器R0~R7、A和AB,以及数据指针DPTR。示例如下:
这里,该指令将通用寄存器R1中的数据传送到累加器A中。指令的操作码是E9,其执行的示意图如图3-4所示。
图3-4 MOV A,R1指令执行示意图
4.寄存器间接寻址
寄存器间接寻址相当于绕了更大的弯,此时数据存放在RAM中,而该RAM的地址放在寄存器中。这样,通过访问寄存器来获得RAM中操作数的寻址方式便是寄存器间接寻址。在单片机中,寄存器间接寻址可以访问如下所述的存储空间。
●片内RAM的低128个字节单元,此时需要使用R0、R1作为间接寻址的寄存器。
●外部RAM,如果采用R0、R1作为间接寻址的寄存器,可寻址256个单元。
●外部RAM,如果采用16位的DPTR作为间接寻址的寄存器,可寻址外部RAM的完整64KB地址空间。
在寄存器间接寻址的指令中,寻址的寄存器前需要加“@”标识符。这样可以和寄存器寻址相区别。典型的寄存器间接寻址示例如下:
这里,R1为间接寻址寄存器,其中的数据4AH是操作数在RAM中的地址,而内部RAM的4AH单元中的内容12H才是指令真正寻找的操作数。该指令的操作码是E7,它把该操作数传送到累加器A,如图3-5所示。
下面再举一个间接寻址寄存器用于目的操作数的例子如下:
这里,寄存器R1为间接寻址的寄存器,其中存有RAM地址4AH。该指令的操作码是F7,将累加器A中的内容送入RAM的4AH单元,如图3-6所示。
图3-5 MOV A,@R1指令执行示意图
图3-6 MOV @R1,A指令执行示意图
5.变址寻址
变址寻址提供了16位地址的寻址能力,它采用基址寄存器加变址寄存器方式来寻址。其中,基址寄存器为DPTR或PC,变址寄存器为累加器A,用于存放地址偏移量。在单片机中,变址寻址方式一般常用于访问程序储存器中的数据表格。变址寻址共有如下两种形式。
●MOV A, @A+DPTR:其功能是将累加器A的内容与数据指针DPTR的内容相加形成操作数的地址,即程序储存器的16位地址。该指令取此地址中的内容送入累加器A中,指令的操作码为93H,如图3-7所示。
●MOV A, @A+PC:其功能是将累加器A的内容与PC的内容相加形成操作数的地址,即程序储存器的16位地址。该指令取此地址中的内容送入累加器A中,其操作码为83H。
图3-7 MOV A,@A+DPTR示意图
6.相对寻址
相对寻址是根据指定地址的偏移量,然后从当前PC值跳转到偏移量所指向的地址的方式。这里地址偏移量为带符号的8位二进制数,其取值范围为-128~+127。因此,相对寻址可以寻址当前PC的-128~127之间的某段程序存储器。相对寻址的典型示例如下。
该方式由PC值和相对地址偏移量rel共同构成。其中相对地址偏移量rel在指令中由操作数给出。程序中将程序计数器PC的当前值与指令中给出的偏移量rel相加,其结果作为转移地址送入PC中,即跳向一个新的地址来执行程序。相对寻址是在相对转移指令中,修改PC指针的值,故可用来实现程序的分支转移。
SJMP 33H
该指令的执行示意图如图3-8所示。本指令占用两个字节,因此PC指针的当前值为PC+2。地址偏移量为33H,则程序跳转的地址为PC+2+33H。
图3-8 SJMP 33H指令执行示意图
7.位寻址
位寻址是特别为位操作区域提供的寻址方式,在指令中直接给出位地址即可。在51系列单片机中,可以位寻址的区域如下:
●片内RAM的20H~2FH单元,共16×8=128位。可直接使用位地址来表示,例如,20H单元的0~7位的位地址为00H~07H。也可以使用RAM地址加位序号表示,例如2AH.1表示2AH单元的D1位。
●可位寻址的特殊功能寄存器相应位,这些位均有特定的名称,因此可以直接采用位名称来表示,也可以采用寄存器符号加位序号表示,例如PSW.3表示PSW寄存器中的D3位。
典型的位寻址指令示例如下:
这里,指令把地址2AH中的第6位D5,即2AH.5的值(0或1)传送到位累加器CY中,如图3-9所示。
图3-9 MOV C,2AH.3指令执行示意图
51系列单片机的指令系统提供了111条指令,按照指令所执行的操作可以细分为如下5类:
●数据传送类,共29条指令;
●算术运算类,共24条指令;
●逻辑运算及移位类,共24条指令;
●控制转移类,共17条指令;
●位操作类,共17条指令。
这里列出所有这些指令,包括它们所使用的助记符、所对应的机器码、功能及特性等。读者可以在程序设计中经常翻阅。51系列单片机的指令集如表3-3所示。
表3-3 51系列单片机指令集
续表
续表
续表
续表