1、单片机原理及应用系统设计 第3章 STC单片机的指令系统主要内容汇编器的伪指令STC系列单片机指令系统概述寻址方式数据传送指令运算和位移指令控制转移和位操作指令什么是指令系统?什么是指令系统?l 指令系统是指微型单片计算机指令系统是指微型单片计算机CPU所有指令的集合,反映所有指令的集合,反映CPU的基本功能,是硬件人员和程序员能见到的机器的主要的基本功能,是硬件人员和程序员能见到的机器的主要属性,是硬件构成的计算机系统向外部世界提供的直接界面。属性,是硬件构成的计算机系统向外部世界提供的直接界面。一个一个CPU的指令系统是固定的,不同类型的的指令系统是固定的,不同类型的CPU的指令系统的指令
2、系统不同,同一系列向上兼容。不同,同一系列向上兼容。l 如如STC系列单片机与系列单片机与AVR单片机、单片机、MSP430单片机、单片机、PIC单单片机等指令系统都不相同。片机等指令系统都不相同。3.1 STC 系列单片机指令系统概述系列单片机指令系统概述 什么是什么是CISC和和RISC?STC系列单片机是复杂指令集系统系列单片机是复杂指令集系统CISC(Complex Instruction Set Computer),而,而AVR单片机、单片机、MSP430单片单片机、机、PIC单片机等都是精简指令集系统单片机等都是精简指令集系统RISC(Reduced Instruction Set
3、 Computer)。CISC和和RISC分别是分别是CPU的两种典型构架,二者的主要差异的两种典型构架,二者的主要差异:1.指令系统指令系统:RISC常用指令具有简单高效的特色。对不常用常用指令具有简单高效的特色。对不常用的功能,一般没有设置专门的指令。而的功能,一般没有设置专门的指令。而CISC的指令系统比较丰的指令系统比较丰富,有专用指令来完成特定的功能。富,有专用指令来完成特定的功能。2.存储器操作存储器操作:RISC对存储器的限制较多,而对存储器的限制较多,而CISC对存储器对存储器操作的指令多。操作的指令多。3.程序程序:RISC汇编语言程序一般需要交大的内存空间,实现汇编语言程序
4、一般需要交大的内存空间,实现特殊功能时程序复杂,不容易设计;而特殊功能时程序复杂,不容易设计;而CISC程序语言相对简单,程序语言相对简单,科学计算及复杂操作的程序设计容易。科学计算及复杂操作的程序设计容易。4.用户使用用户使用:RISC结构简单,指令规整,性能容易把握,易结构简单,指令规整,性能容易把握,易学易用;学易用;CISC结构复杂,功能强大,实现特殊功能容易。结构复杂,功能强大,实现特殊功能容易。5.应用范围应用范围:RISC是适合于专用机;而是适合于专用机;而CISC更适合于通用机。更适合于通用机。机器指令机器指令 单片机编程时,无论是用汇编语言还是高级语言,如单片机编程时,无论是
5、用汇编语言还是高级语言,如C语语言,最终都要由编译器将汇编语言或高级语言转换成机器言,最终都要由编译器将汇编语言或高级语言转换成机器语言,那么什么是机器语言呢?语言,那么什么是机器语言呢?在理解机器语言前,需要先知道在理解机器语言前,需要先知道机器指令机器指令。所谓机器指令。所谓机器指令就是用二进制数编码表示的指令,它是就是用二进制数编码表示的指令,它是CPU能直接识别的能直接识别的唯一的语言。唯一的语言。汇编语言和高级语言区别汇编语言和高级语言区别 汇编语言是面向机器,反映机器运动的实际过程,与计算汇编语言是面向机器,反映机器运动的实际过程,与计算机的硬件结构和指令系统密切相关。它占用内存空
6、间小,机的硬件结构和指令系统密切相关。它占用内存空间小,执行速度快,但是缺点是编程繁琐,调试困难,可读性和执行速度快,但是缺点是编程繁琐,调试困难,可读性和可移植性差。可移植性差。高级语言是独立于机器、面向过程或对象的语言。其算法高级语言是独立于机器、面向过程或对象的语言。其算法是按照人的思维方式给出,比较接近人的自然语言。是按照人的思维方式给出,比较接近人的自然语言。C语语言等高级语言编程效率高、可读性和可移植性强。言等高级语言编程效率高、可读性和可移植性强。STC系列单片机内的系列单片机内的8051 CPU指令集总共有指令集总共有111条指令,与条指令,与传统的传统的MCS-51单片机的指
7、令系统完全兼容。单片机的指令系统完全兼容。总共有总共有111条指令,其中数据传送类指令条指令,其中数据传送类指令29条,算术运算类指条,算术运算类指令令24条,逻辑运算类指令条,逻辑运算类指令24条,控制转移类指令条,控制转移类指令17条,位操条,位操作类指令作类指令17条。条。STC单片机指令系统属于复杂指令集系统(单片机指令系统属于复杂指令集系统(CISC,Complex Instruction Set Computing)。在)。在CISC微控制器中,程序的微控制器中,程序的各条指令是按照程序的顺序串行执行的,每条指令中的各个各条指令是按照程序的顺序串行执行的,每条指令中的各个操作也是按
8、顺序串行执行的。操作也是按顺序串行执行的。3.1.2 3.1.2 指令系统概述指令系统概述一一 指令指令、指令系统和程序、指令系统和程序CPU是一个可以完成一些基本操作的电子器件。下面介绍一下指是一个可以完成一些基本操作的电子器件。下面介绍一下指令、指令系统和程序的概念。令、指令系统和程序的概念。指令:指令:通常来说,编码表示通常来说,编码表示CPU的一个基本操作,成为一条的一个基本操作,成为一条指令。指令。指令系统:指令系统:全部指令集称为指令系统。指令系统反映全部指令集称为指令系统。指令系统反映CPU的的基本功能,是硬件人员和程序员能见到的机器的主要属性,是基本功能,是硬件人员和程序员能见
9、到的机器的主要属性,是硬件构成的计算机系统向外部世界提供的直接界面。硬件构成的计算机系统向外部世界提供的直接界面。一般来说,一个一般来说,一个CPU的指令系统是固定的,不同类型的指令系统是固定的,不同类型CPU的的指令系统是不同的,同一系列指令系统是不同的,同一系列CPU的指令系统是向上兼容。的指令系统是向上兼容。程序:程序:程序是为要解决的问题编写出来的指令集合。用户为解程序是为要解决的问题编写出来的指令集合。用户为解决自己的问题所编写的程序称为源程序。决自己的问题所编写的程序称为源程序。二二 机器码和机器码和机器语言机器语言 机器码机器码 用二进制数编码表示的指令,称为机器指令或机器码。用
10、二进制数编码表示的指令,称为机器指令或机器码。机器语言机器语言 机器码机器使用的一组规则,称为机器语言。所谓机器语机器码机器使用的一组规则,称为机器语言。所谓机器语言,就像学习外语一样,除了要掌握词汇(指令),还要言,就像学习外语一样,除了要掌握词汇(指令),还要学习语法。学习语法。机器语言的特点是机器语言的特点是CPU能够直接识别的唯一语言;面向机能够直接识别的唯一语言;面向机器,可直接被单片机执行;执行速度快,占内存空间小;器,可直接被单片机执行;执行速度快,占内存空间小;编程效率低。编程效率低。三三 汇编语言的指令格式汇编语言的指令格式 指令格式是指令码的结构形式。指令格式是指令码的结构
11、形式。一般来说,指令由操作码和操作数两部分组成。其中操作一般来说,指令由操作码和操作数两部分组成。其中操作码部分比较简单,是由指令功能的英文单词的缩写形式组成;码部分比较简单,是由指令功能的英文单词的缩写形式组成;操作数部分则比较复杂,分为无操作数、一个操作数和两个操作数部分则比较复杂,分为无操作数、一个操作数和两个操作数等情况。操作数等情况。汇编语言的指令一般由四个部分组成,其格式如下:汇编语言的指令一般由四个部分组成,其格式如下:标号:标号:指令助记符指令助记符 操作数操作数1 ,操作数,操作数2 ,操作数,操作数3 ;注释注释(1)标号)标号 标号是指令的符号地址。通常作为转移指令的操作
12、数。对标号是指令的符号地址。通常作为转移指令的操作数。对标号的规定如下:标号的规定如下:标号名称由标号名称由1-31个字符组成,首字符不能是数字,可个字符组成,首字符不能是数字,可以包括字母、数字、以包括字母、数字、“_”和和“?”等字符;等字符;不能用已定义的保留字(如指令助记符、伪指令、寄不能用已定义的保留字(如指令助记符、伪指令、寄存器名称和运算符);存器名称和运算符);标号后面必须跟英文冒号标号后面必须跟英文冒号“:”。(2)指令助记符)指令助记符 指令助记符是指令功能的英文缩写。它是汇编语句中唯一指令助记符是指令功能的英文缩写。它是汇编语句中唯一不能空缺的部分。汇编器在汇编时会将其翻
13、译成对应的二不能空缺的部分。汇编器在汇编时会将其翻译成对应的二进制代码。进制代码。(3)操作数)操作数 操作数是指令要操作的数据或数据的地址。操作数可以空操作数是指令要操作的数据或数据的地址。操作数可以空缺,也可能是一个、两个、三个。各操作数之间以英文逗号缺,也可能是一个、两个、三个。各操作数之间以英文逗号分隔。操作数内容额能包括以下几种。分隔。操作数内容额能包括以下几种。数据数据 有以下有以下4种形式:种形式:二进制数,末尾用字母二进制数,末尾用字母B标识。标识。十进制数,末尾用字母十进制数,末尾用字母D标识或字母标识或字母D省略。省略。十六进制数,末尾用字母十六进制数,末尾用字母H标识。标
14、识。ASCII码,以单引号对其标识。码,以单引号对其标识。符号符号 符号可以用符号名、标号或特定的符号符号可以用符号名、标号或特定的符号“$”等。等。表达式表达式 由运算符和数据构成的算式。由运算符和数据构成的算式。(4)注释)注释 注释只是对语句的说明。注释字段可以增加程序的注释只是对语句的说明。注释字段可以增加程序的可读性,有助于编程人员的阅读和维护。该字段必须可读性,有助于编程人员的阅读和维护。该字段必须以英文分号以英文分号“;”开头,当一行写不下时,允许换行接开头,当一行写不下时,允许换行接着写,但是换行时要注意使用分号着写,但是换行时要注意使用分号“;”开头。开头。指令系统中常用符号
15、说明如表指令系统中常用符号说明如表3-1所示所示。序号符号含义1Rn当前选中的工作寄存器组中的寄存器R0R72Ri当前选中的工作寄存器组中的寄存器R0或R13间接寻址或变址寻址前缀4#data8位立即数5#data1616位立即数6direct片内RAM单元地址及SFR地址7addr1111位目标地址8addr1616位目标地址9rel补码形式表示的8位地址偏移量10bit片内RAM位地址、SFR中的位地址11(x)表示x地址单元或寄存器的内容12(x)表示以x单元或寄存器内容为地址所指定单元的内容13/位操作的取反操作前缀表表3-1 指令系统符号说明指令系统符号说明 汇编指令形成的代码由操作
16、码和操作数组成。操作码表示汇编指令形成的代码由操作码和操作数组成。操作码表示指令要完成的何种动作,操作数表示参与操作的数据来源指令要完成的何种动作,操作数表示参与操作的数据来源及去处。及去处。所谓寻址方式:是指寻找操作数所在单元的方法。所谓寻址方式:是指寻找操作数所在单元的方法。基于基于51核的核的STC系列单片机有系列单片机有7种寻址方法,下面将逐种寻址方法,下面将逐一进行介绍。一进行介绍。3.2 寻址方式寻址方式在在这种寻址方式中,指令多是双字节的。立即数就是存放在这种寻址方式中,指令多是双字节的。立即数就是存放在程序存储器中的常数,换句话说就是操作数(立即数)是包程序存储器中的常数,换句
17、话说就是操作数(立即数)是包含在指令字节中的。含在指令字节中的。立即数可以是一个字节,也可以是两个字节,通常用立即数可以是一个字节,也可以是两个字节,通常用“#”作前缀。例如:作前缀。例如:MOV A,#3AH 这条指令的指令代码为这条指令的指令代码为74H、3AH,是双字节指令,这条,是双字节指令,这条指令的功能是把立即数指令的功能是把立即数3AH送入累加器送入累加器A中。中。直接寻址是指令中直接给出操作数的地址。例如:直接寻址是指令中直接给出操作数的地址。例如:MOV A,30H 这条指令中操作数就在这条指令中操作数就在30H单元中,也就是单元中,也就是30H是操作数是操作数的地址,并非操
18、作数。的地址,并非操作数。3.2.1 3.2.1 立即寻址立即寻址 在基于在基于51核的核的STC系列单片机中,直接地址只能用来表示系列单片机中,直接地址只能用来表示内部数据存储器、位地址空间以及特殊功能寄存器,具体的内部数据存储器、位地址空间以及特殊功能寄存器,具体的说就是:说就是:(1)内部数据存储器)内部数据存储器RAM低低128单元。在指令中是以直接单元。在指令中是以直接单元地址形式给出。单元地址形式给出。我们知道低我们知道低128单元的地址是单元的地址是00H-7FH。在指令中直接以。在指令中直接以单元地址形式给出这句话的意思就是这单元地址形式给出这句话的意思就是这0-127共共12
19、8位的任何位的任何一位,例如一位,例如0位是以位是以00H这个单元地址形式给出、这个单元地址形式给出、1位就是以位就是以01H单元地址给出、单元地址给出、127位就是以位就是以7FH形式给出。形式给出。(2)位寻址区。)位寻址区。20H-2FH地址单元。地址单元。(3)特殊功能寄存器。专用寄存器除以单元地址形式给出)特殊功能寄存器。专用寄存器除以单元地址形式给出外,还可以以寄存器符号形式给出。外,还可以以寄存器符号形式给出。例如:例如:MOV IE,#85H 上述指令中断允许寄存器上述指令中断允许寄存器IE的地址是的地址是80H,那么也就是此,那么也就是此指令也可以以指令也可以以 MOV 80
20、H,#85H的形式表述。的形式表述。【注】直接寻址是唯一能访问特殊功能寄存器的寻址方式。【注】直接寻址是唯一能访问特殊功能寄存器的寻址方式。现在分析下面几条指令:现在分析下面几条指令:MOV 65H,A ;将;将A的内容送入内部的内容送入内部RAM的的65H单元地址单元地址MOV A,direct ;将直接地址单元的内容送入;将直接地址单元的内容送入A中中MOV direct,direct ;将直接地址单元的内容送直接地址单元;将直接地址单元的内容送直接地址单元 MOV IE,#85H ;将立即数;将立即数85H送入中断允许寄存器送入中断允许寄存器IE 数据前面加了数据前面加了“#”的,表示后
21、面的数是立即数,如的,表示后面的数是立即数,如#85H,就表示就表示85H就是一个立即数。就是一个立即数。数据前面没有加数据前面没有加“#”号的,就表示后面的是一个存储单元号的,就表示后面的是一个存储单元地址如地址如MOV 65H,A这条指令的这条指令的65H就是一个单元地址。就是一个单元地址。直接寻址是在指令中直接给出操作数单元的地址。在这种寻直接寻址是在指令中直接给出操作数单元的地址。在这种寻址方式中,指令的操作数部分直接是操作数的地址。址方式中,指令的操作数部分直接是操作数的地址。51核单片机中,用直接寻址方式只能给出核单片机中,用直接寻址方式只能给出8位地址。因此,位地址。因此,直接寻
22、址的寻址范围只能限于片内直接寻址的寻址范围只能限于片内RAM,具体来说,就是,具体来说,就是可以访问内部数据可以访问内部数据RAM区中区中007FH共共128个单元以及所有的个单元以及所有的特殊功能寄存器。在指令助记符中,直接寻址的地址可用两特殊功能寄存器。在指令助记符中,直接寻址的地址可用两位十六进制数表示。对于特殊功能寄存器,可用它们各自的位十六进制数表示。对于特殊功能寄存器,可用它们各自的名称符号来表示,这样可以增加程序的可读性。名称符号来表示,这样可以增加程序的可读性。例如:例如:MOV A,1AH 此条指令属于直接寻址,其中此条指令属于直接寻址,其中1AH所表示的是直接地址,所表示的
23、是直接地址,即内部即内部RAM区中的区中的1AH单元。这条指令的功能是将内部单元。这条指令的功能是将内部RAM区中区中1AH地址单元对应的内容传送到累加器地址单元对应的内容传送到累加器A中。中。3.2.2 直接寻址直接寻址操作数操作数存放在工作寄存器存放在工作寄存器R0R7、累加器、累加器A或寄存器或寄存器B中。中。例如:例如:MOV A,R2 寄存器寻址的寻址范围是:寄存器寻址的寻址范围是:(1)4个工作寄存器组共有个工作寄存器组共有32个通用寄存器,但在指令中只个通用寄存器,但在指令中只能使用当前寄存器组(工作寄存器组的选择是由程序状态字能使用当前寄存器组(工作寄存器组的选择是由程序状态字
24、PSW中的中的RS1和和RS0来确定的),因此在使用前常需要通过来确定的),因此在使用前常需要通过对对PSW中的中的RS1、RS0位的状态设置,来进行对当前工作寄位的状态设置,来进行对当前工作寄存器组的选择。存器组的选择。3.2.3 寄存器寻址寄存器寻址(2)部分专用寄存器。如累加器)部分专用寄存器。如累加器A、通用寄存器、通用寄存器B、地址寄、地址寄存器存器DPTR和进位位和进位位CY。寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器寄存器寻址方式是指操作数在寄存器中,因此指定了寄存器名称就能得到操作数。名称就能得到操作数。其实寄存器寻址方式就是对由其实寄存器寻址方式就是对由PSW程序状
25、态字确定的工作程序状态字确定的工作寄存器组的寄存器组的R0-R7进行读进行读/写操作。写操作。寄存器间接寻址指令中寄存器的内容作为操作数存放的地址,寄存器间接寻址指令中寄存器的内容作为操作数存放的地址,指令中间接寻址寄存器前用指令中间接寻址寄存器前用“”表示前缀。表示前缀。寄存间接寻址方式是指寄存器中存放的是操作数的地址,即寄存间接寻址方式是指寄存器中存放的是操作数的地址,即操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。基于基于51核的核的STC系列单片机规定工作寄存器的系列单片机规定工作寄存器的R0、R1做为做为间接寻址寄存器。用
26、于寻址内部或外部数据存储器的间接寻址寄存器。用于寻址内部或外部数据存储器的256个单个单元。例如:元。例如:MOV R0,#30H ;将值;将值30H加载到加载到R0中中 MOV A,R0 ;把内部;把内部RAM地址地址30H内的值放到累加器内的值放到累加器A中中 MOVX A,R0 ;把外部;把外部RAM地址地址30H内的值放到累加内的值放到累加器器A中中3.2.4 寄存器间接寻址寄存器间接寻址 如果用如果用DPTR做为间址寄存器,那么它的寻址范围是多少做为间址寄存器,那么它的寻址范围是多少呢?呢?DPTR是一个是一个16位的寄存器,所以它的寻址范围就是位的寄存器,所以它的寻址范围就是2的的
27、16次方次方=65536=64K。因此用。因此用DPTR做为间址寄存器的寻址空做为间址寄存器的寻址空间是间是64K,所以访问片外数据存储器时,我们通常就用,所以访问片外数据存储器时,我们通常就用DPTR做为间址寄存器。做为间址寄存器。例如:例如:MOV DPTR,#1234H ;将;将DPTR值设为值设为1234H(16位)位)MOVX A,DPTR ;将外部;将外部RAM或或I/O地址地址1234H内的值存入累加器内的值存入累加器A 在执行在执行PUSH(入栈)和(入栈)和POP(出栈)指令时,采用堆栈(出栈)指令时,采用堆栈指针指针SP作寄存器间接寻址。作寄存器间接寻址。例如:例如:PUS
28、H 30H ;把内部;把内部RAM地址地址30H内的值放到堆内的值放到堆栈区中栈区中 堆栈区是由堆栈区是由SP寄存器指定的,如果执行上面这条命令前,寄存器指定的,如果执行上面这条命令前,SP为为60H,命令执行后会把内部,命令执行后会把内部RAM地址地址30H内的值放到内的值放到RAM的的61H内。内。那么做为寄存器间接寻址用的寄存器主要有哪些呢?我们那么做为寄存器间接寻址用的寄存器主要有哪些呢?我们前面提到的有四个,前面提到的有四个,R0、R1、DPTR、SP。寄存器间接寻址范围总结:寄存器间接寻址范围总结:(1)内部)内部RAM低低128单元。对内部单元。对内部RAM低低128单元的间接单
29、元的间接寻址,应使用寻址,应使用R0或或R1作间址寄存器,其通用形式为作间址寄存器,其通用形式为Ri(i=0或或1)。)。(2)外部)外部RAM 64KB。对外部。对外部RAM64KB的间接寻址,应的间接寻址,应使用使用DPTR作间址寻址寄存器,其形式为作间址寻址寄存器,其形式为DPTR。例如:例如:MOVX A,DPTR ;把;把DPTR指定的外部指定的外部RAM单单元的内容送入累加器元的内容送入累加器A (3)外部)外部RAM的低的低256单元是一个特殊的寻址区,除可单元是一个特殊的寻址区,除可以用以用DPTR作间址寄存器寻址外,还可以用作间址寄存器寻址外,还可以用R0或或R1作间址寄作间
30、址寄存器寻址。存器寻址。例如:例如:MOVX A,R0 ;把;把R0指定的外部指定的外部RAM单元的单元的内容送入累加器内容送入累加器A (4)堆栈操作指令()堆栈操作指令(PUSH和和POP)也应算作是寄存器间)也应算作是寄存器间接寻址,即以堆栈指针接寻址,即以堆栈指针SP作间址寄存器的间接寻址方式。作间址寄存器的间接寻址方式。(5)寄存器间接寻址方式不可以访问特殊功能寄存器。寄)寄存器间接寻址方式不可以访问特殊功能寄存器。寄存器间接寻址也须以寄存器符号的形式表示,为了区别寄存存器间接寻址也须以寄存器符号的形式表示,为了区别寄存器寻址和寄存器间接寻址的区别,在寄存器间接寻址方式中,器寻址和寄
31、存器间接寻址的区别,在寄存器间接寻址方式中,寄存器的名称前面加前缀标志寄存器的名称前面加前缀标志“”。变址寻址是以程序计数器变址寻址是以程序计数器PC或或DPTR为基址寄存器,累加器为基址寄存器,累加器A为变址寄存器,变址寻址时,把两者的内容相加,所得到为变址寄存器,变址寻址时,把两者的内容相加,所得到的结果作为操作数的地址。这种方式常用于访问程序存储器的结果作为操作数的地址。这种方式常用于访问程序存储器ROM中的数据表格,即查表操作。中的数据表格,即查表操作。例如:例如:MOVC A,A+PC MOVC A,A+DPTR 源操作数地址源操作数地址=变地址变地址+基地址基地址 基地址寄存器基地
32、址寄存器 DPTR 或或 PC;变址寄存器;变址寄存器 A。3.2.5 变址寻址变址寻址 变址寻址只能读出程序内存入的值,而不能写入,也就是变址寻址只能读出程序内存入的值,而不能写入,也就是说变址寻址这种方式只能对程序存储器进行寻址,或者说它说变址寻址这种方式只能对程序存储器进行寻址,或者说它是专门针对程序存储器的寻址方式。是专门针对程序存储器的寻址方式。例如:例如:MOVC A,A+DPTR 这条指令的功能是把这条指令的功能是把DPTR和和A的内容相加,再把所得到的内容相加,再把所得到的程序存储器地址单元的内容送的程序存储器地址单元的内容送A。假若指令执行前。假若指令执行前A=54H,DPT
33、R=3F21H,则这条指令变址寻址形成的操作数地址就是,则这条指令变址寻址形成的操作数地址就是54H+3F21H=3F75H。如果。如果3F75H单元中的内容是单元中的内容是7FH,则,则执行这条指令后,累加器执行这条指令后,累加器A中的内容就是中的内容就是7FH。变址寻址的指令只有三条,分别如下:变址寻址的指令只有三条,分别如下:JMP A+DPTR MOVC A,A+DPTR MOVC A,A+PC 第一条指令是一条无条件转移指令,这条指令的意思就是第一条指令是一条无条件转移指令,这条指令的意思就是DPTR加上累加器加上累加器A的内容做为一个的内容做为一个16位的地址,执行位的地址,执行J
34、MP这条指令是,程序就转移到这条指令是,程序就转移到A+DPTR指定的地址去执行。指定的地址去执行。第二和第三条指令第二和第三条指令MOVC A,A+DPTR和和MOVC A,A+PC。这两条指令的通常用于查表操作,功能完全一样,但使用起这两条指令的通常用于查表操作,功能完全一样,但使用起来却有一定的差别,现详细说明如下:来却有一定的差别,现详细说明如下:1、PC是程序指针是程序指针,是十六位。,是十六位。DPTR是一个是一个16位的数据位的数据指针寄存器,它们的寻址范围都应是指针寄存器,它们的寻址范围都应是64K。程序计数器。程序计数器PC是是始终跟踪着程序的执行的,也就是说始终跟踪着程序的
35、执行的,也就是说PC的值是随程序的执行的值是随程序的执行情况自动改变的,不可以随便给情况自动改变的,不可以随便给PC赋值。而赋值。而DPTR是一个数是一个数据指针,可以给空的数据指针据指针,可以给空的数据指针DPTR进行赋值。再看进行赋值。再看MOVC A,A+PC这条指令的意思是将这条指令的意思是将PC的值与累加器的值与累加器A的值相加作为一个地址,而的值相加作为一个地址,而PC是固定的,累加器是固定的,累加器A是一个是一个8位的寄存器,它的寻址范围是位的寄存器,它的寻址范围是256个地址单元。个地址单元。2、MOVC A,A+PC 这条指令的寻址范围其实就是只能在当前指令下这条指令的寻址范
36、围其实就是只能在当前指令下256个地个地址单元。如果需要查询的数据表在址单元。如果需要查询的数据表在256个地址单元之内,则个地址单元之内,则可以用可以用MOVC A,A+PC这条指令进行查表操作。但如果这条指令进行查表操作。但如果超过了超过了256个单元,则不能用这条指令进行查表操作。个单元,则不能用这条指令进行查表操作。3、DPTR是一个数据指针,这个数据指针我们可以给它赋是一个数据指针,这个数据指针我们可以给它赋值操作的。通过赋值操作可以使值操作的。通过赋值操作可以使MOVC A,A+DPTR这这条指令的寻址范围达到条指令的寻址范围达到64K。这就是这两条指令在实际应用。这就是这两条指令
37、在实际应用当中要注意的问题。当中要注意的问题。基于基于51核的核的STC系列单片机有位处理功能,可以对数据系列单片机有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。所谓位寻址,就位进行操作,因此就有相应的位寻址方式。所谓位寻址,就是对内部是对内部RAM或可位寻址的特殊功能寄存器或可位寻址的特殊功能寄存器SFR内的某个位,内的某个位,直接加以置位为直接加以置位为1或复位为或复位为0。3.2.6 位寻址位寻址位寻址的范围,也就是哪些部份可以进行位寻址位寻址的范围,也就是哪些部份可以进行位寻址:(1)51单片机的内部数据存储器单片机的内部数据存储器RAM的低的低128单元中有单元中有一
38、个区域叫位寻址区。它的单元地址是一个区域叫位寻址区。它的单元地址是20H-2FH。共有。共有16个个单元,一个单元是单元,一个单元是8位,所以位寻址区共有位,所以位寻址区共有128位。这位。这128位位都单独有一个位地址,其位地址的名字就是都单独有一个位地址,其位地址的名字就是00H-7FH。(2)对专用寄存器位寻址。一般来说,地址单元可以被)对专用寄存器位寻址。一般来说,地址单元可以被8整除的专用寄存器,通常都可以进行位寻址,当然并不是全整除的专用寄存器,通常都可以进行位寻址,当然并不是全部,大家在应用当中应引起注意。部,大家在应用当中应引起注意。把指令中给定的地址偏移量与本指令所在单元地址
39、(把指令中给定的地址偏移量与本指令所在单元地址(PC内容)内容)相加得到真正有效的操作数所存放的地址。相加得到真正有效的操作数所存放的地址。专用寄存器的位寻址表示方法:专用寄存器的位寻址表示方法:下面我们以程序状态字下面我们以程序状态字PSW来进行说明。来进行说明。3.2.7 相对寻址相对寻址B7B6B5B4B3B2B1B0CY AC F0 RS1 RS0 OV F1P(1)直接使用位地址表示:)直接使用位地址表示:PSW的第五位地址是的第五位地址是D5,可以表示为,可以表示为D5H。MOV C,D5H(2)位名称表示:表示该位的名称,例如)位名称表示:表示该位的名称,例如PSW的位的位5是是
40、F0,可用,可用F0表示。表示。MOV C,F0(3)单元(字节)地址加位表示:)单元(字节)地址加位表示:D0H单元位单元位5,表示为,表示为DOH.5。MOV C,D0H.5(4)专用寄存器符号加位表示:例如)专用寄存器符号加位表示:例如PSW.5。MOV C,PSW.5 这四种方法实现的功能都是相同的,只是表述的方式不同而已这四种方法实现的功能都是相同的,只是表述的方式不同而已。数据传送指令是单片机的最基本和最主要操作。数据传送操数据传送指令是单片机的最基本和最主要操作。数据传送操作可以在片内作可以在片内RAM和和SFR内进行,也可以在累加器内进行,也可以在累加器A和片外和片外存储器之间
41、进行。指令中必须指定传送数据的源地址和目的存储器之间进行。指令中必须指定传送数据的源地址和目的地址,以便机器执行指令时把源地址中的内容传送到目的地地址,以便机器执行指令时把源地址中的内容传送到目的地址中,但源地址中的内容不变。址中,但源地址中的内容不变。在这类指令中,除了在以累加器在这类指令中,除了在以累加器A为目的操作数时的传送指为目的操作数时的传送指令会对奇偶标志位令会对奇偶标志位P有影响外,其余指令执行时均不会影响有影响外,其余指令执行时均不会影响任何标志位。任何标志位。数据传送指令数据传送指令共有共有28条条,分为内部数据传送指令、外部数据,分为内部数据传送指令、外部数据传送指令、堆栈
42、操作指令和数据交换指令传送指令、堆栈操作指令和数据交换指令4类。类。3.3 数据传送指令数据传送指令3.3.1 内部数据传送指令内部数据传送指令内部数据传送指令内部数据传送指令共有共有15条条,这些指令的源操作数和目的操,这些指令的源操作数和目的操作数地址都在单片机内部,可以是片内作数地址都在单片机内部,可以是片内RAM的地址,也可以的地址,也可以是特殊功能寄存器是特殊功能寄存器SFR的地址。的地址。指令格式如下:指令格式如下:MOV,其中其中 是目的操作数地址,是目的操作数地址,是源操作数地址。是源操作数地址。1.立即寻址型传送指令 这类指令共有这类指令共有4条,其特点是源操作数是立即数。条
43、,其特点是源操作数是立即数。MOV A,#data MOV Rn,#dataMOV Ri,#data MOV direct,#data2.直接寻址型传送指令 这类指令共有这类指令共有5条,其特点是指令码中至少含有一个操作数条,其特点是指令码中至少含有一个操作数的直接地址。的直接地址。MOV A,direct MOV direct,A MOV Rn,directMOV Ri,direct MOV direct1,direct2 这些指令的功能是把源操作数传送到目的存储单元,目的这些指令的功能是把源操作数传送到目的存储单元,目的存储单元可以是累加器存储单元可以是累加器A、工作寄存器、工作寄存器Rn
44、和片内和片内RAM单元。单元。3.寄存器寻址型传送指令这类指令共有这类指令共有3条。其特点是源操作数和目的操作数有一个条。其特点是源操作数和目的操作数有一个是工作寄存器是工作寄存器Rn。MOV A,Rn MOV Rn,A MOV direct,Rn 4.寄存器间址型传送指令这类指令共有这类指令共有3条。其特点是条。其特点是Ri中存放的不是操作数本身,而中存放的不是操作数本身,而是操作数所在存储单元的地址。是操作数所在存储单元的地址。MOV A,Ri MOV Ri,A MOV direct,Ri 第一条指令的功能是把第一条指令的功能是把Ri中地址所指中地址所指RAM单元中的操作数单元中的操作数传
45、送到累加器传送到累加器A中。中。第二条指令的功能是把累加器第二条指令的功能是把累加器A中的操作数传送到以中的操作数传送到以Ri中的中的内容为地址的存储单元。内容为地址的存储单元。第三条指令的功能是把以第三条指令的功能是把以Ri中内容为地址的源操作数传送到中内容为地址的源操作数传送到direct存储单元。存储单元。3.3.2 外部数据传送指令外部数据传送指令1.外部RAM/ROM的字传送指令在基于在基于51核的核的STC系列单片机指令系统中,只有唯一的一条系列单片机指令系统中,只有唯一的一条字传送指令(字传送指令(16位数)。位数)。MOV DPTR,#data16 该指令的功能是把该指令的功能
46、是把16位立即数传送到位立即数传送到DPTR寄存器中,其寄存器中,其中高中高8位送入位送入DPH,低,低8位送入位送入DPL。【注】【注】DPTR是一个是一个16位的寄存器,可以分为两个单独的位的寄存器,可以分为两个单独的8位位寄存器寄存器DPH和和DPL分别使用。分别使用。2.外部ROM的字节传送指令这类指令共有这类指令共有2条,均属于变址寻址指令,因为专门用于查表,条,均属于变址寻址指令,因为专门用于查表,故又称为查表指令。故又称为查表指令。MOVC A,A+DPTRMOVC A,A+PC 第一条指令采用第一条指令采用DPTR作为基址寄存器,查表时用来存放表作为基址寄存器,查表时用来存放表
47、的起始地址。的起始地址。第二条指令以第二条指令以PC作为基址寄存器,但指令中作为基址寄存器,但指令中PC的地址是可的地址是可以变化的,它随着被执行指令在程序中位置的不同而变化。以变化的,它随着被执行指令在程序中位置的不同而变化。一旦被执行指令在程序中的位置确定以后,一旦被执行指令在程序中的位置确定以后,PC中的内容也中的内容也被给定。被给定。3.外部RAM的字节传送指令这类指令共有这类指令共有4条,功能是实现外部条,功能是实现外部RAM与累加器与累加器A直接的数据直接的数据传送。传送。MOVX A,RiMOVX Ri,AMOVX A,DPTRMOVX DPTR,A前两条指令用于访问外部前两条指
48、令用于访问外部RAM的低地址区,地址范围是的低地址区,地址范围是0000H00FFH;后两条指令用于访问外部;后两条指令用于访问外部RAM的的64KB存储区,存储区,地址范围是地址范围是0000HFFFFH。3.3.3 堆栈操作指令堆栈操作指令 堆栈操作堆栈操作指令是一种特殊的数据传送指令,共有指令是一种特殊的数据传送指令,共有2条指令,其条指令,其特点是根据堆栈指针特点是根据堆栈指针SP中栈顶地址进行数据传送操作。中栈顶地址进行数据传送操作。PUSH directPOP direct 第一条指令称为入栈指令,功能是把第一条指令称为入栈指令,功能是把direct为地址的操为地址的操作数传送到堆
49、栈中。作数传送到堆栈中。第二条指令称为出栈指令,功能是把堆栈里的操作数传第二条指令称为出栈指令,功能是把堆栈里的操作数传送到送到direct中。中。3.3.4 数据数据交换指令交换指令数据交换指令共有数据交换指令共有4条,其中字节交换指令条,其中字节交换指令3条,半字节交换条,半字节交换指令指令1条。条。XCH A,RnXCH A,directXCH A,RiXCHD A,Ri 前前3条指令的功能是把累加器条指令的功能是把累加器A中的内容和片内中的内容和片内RAM单元单元内容相互交换。内容相互交换。第第4条指令是半字节交换指令,用于把累加器条指令是半字节交换指令,用于把累加器A中的低中的低4位
50、位与与Ri为间址寻址单元的低为间址寻址单元的低4位相互交换,各自的高位相互交换,各自的高4位保持位保持不变。不变。3.4 运算运算和位移指令和位移指令在在基于基于51核的核的STC系列单片机的指令系统中,这类指令和核系列单片机的指令系统中,这类指令和核心指令,共有心指令,共有49条,分为三大类条,分为三大类:算术运算指令算术运算指令 逻辑运算指令逻辑运算指令 移位指令移位指令3.4.1 算术运算指令算术运算指令 算术运算算术运算指令共有指令共有24条,分为加法、减法、十进条,分为加法、减法、十进制调整和乘除法指令四类。制调整和乘除法指令四类。1.加法指令 加法指令共有加法指令共有13条,由不带