第3章 MCS-51单片机的指令系统 人们是通过单片机的指令系统控制单片机工作的。人机之间进行交流信息、驱动单片 机实现各种功能操作的最直接、最基本的命令是一种直接面向机器的语言。理解并熟练掌 握单片机的指令系统是应用单片机的前提。本章将详细介绍MCS-51系列单片机指令系统 的格式、寻址方式、各类指令及其功能特点。 3.1 指令系统概述 指令是直接控制单片机相关硬件完成基本操作的命令。一个单片机能够执行的所有指 令的集合,称为该单片机的指令系统。指令系统与机器硬件密切相关,不同系列型号的单片 机有不同的指令系统。指令系统是由单片机生产厂商定义并集成在单片机中的,体现单片 机的主要功能,也是表征单片机性能的重要指标之一。专用于MCS-51系列单片机的指令 系统(即MCS-51单片机指令系统)共有111条,是本章学习的主要内容。 指令系统作为一种直接面向机器的计算机语言,发展出了两种语言形式:机器语言指 令和汇编语言指令,二者本质上都是面向机器的语言,即机器语言,它们之间存在一一对应 的关系,下面将详述两种指令的特点。 3.1.1 机器语言指令与汇编语言指令 单片机作为现代计算机发展的一个分支,与现代计算机同属于冯·诺依曼体系计算机。 因此,单片机的指令和所处理的数据均用二进制码表示。 机器语言指令用二进制码表示,又称为机器码指令或机器指令,能够直接被计算机硬件 识别和执行,是唯一一种可以被计算机硬件直接识别和执行的计算机语言。 例如,执行累加器A 内容加1操作的MCS-51单片机指令对应的二进制代码为 0000 0100B 为了书写和阅读方便,常把它写成十六进制形式,十六进制表示的机器码为04H。 机器语言是计算机自身固有的二进制形式的语言,可以被计算机直接识别并加以分析 和执行,是计算机发展初期人们使用的编程语言。由于数字形式的指令很难与其功能联系 起来,因此二进制形式的机器语言指令即便用十六进制去书写与记忆也是极其不方便且困 难的。为 了克服机器语言指令难记、不易书写、难以阅读和调试、容易出错且不易查找错误、程 序可维护性差等缺点,计算机制造厂家对指令系统的每一条机器语言指令都给出了助记符。 助记符是用英文缩写来描述相应机器语言指令的功能,它不但便于记忆,也便于理解和分 类。这种用指令助记符来表示的机器语言指令称为汇编语言指令。显然,汇编语言指令实 际上是机器语言指令的符号化表示,故又称为符号语言。 ·50· 例如上述指令:执行累加器A 内容加1操作,机器码为04H,汇编语言指令为 INC A 其中,助记符INC是英文单词增加的缩写,在此表示加1的意思。 由于汇编语言指令是机器语言指令的符号化表示,所以它与机器语言指令有着一一对 应关系。与机器语言指令相比,汇编语言的特点是直观、易学习、易于记忆理解,编程方便; 但用汇编语言编写的程序已不能被计算机识别和理解,须将其转换为对应的计算机唯一可 以识别和执行的机器语言指令程序。将汇编语言源程序转换为机器语言程序的过程称为 汇编。可 见,一条指令可以用机器语言和汇编语言两种语言形式表示。为了对指令有进一步 理解,接下来详细分析指令的结构与格式。 3.1.2 指令格式 1.机器语言指令格式 一条指令通常是由操作码和操作数两部分组成。操作码用来指明该指令所完成的操 作,如传送、加法、减法、移位或转移等;通常,其位数反映了机器的操作种类;操作码的长度 可以是固定的也可以是变化的。操作数用来指明操作码操作的对象;操作数可以是一个具 体的数据,也可以是存储数据的地址或寄存器。指令的基本格式如图3-1所示。 图3-1 指令的基本格式 MCS-51单片机作为一种典型的8位微控制器,指令的操作码长度为8位。8位长度的 操作码在理论上最多能提供28=256种具体操作。在MCS-51单片机中,设置了255种具 体操作,其中A5H 编码未定义。在MCS-51单片机指令中,操作码可以带有0~3B的操作 数。带0B的操作数即没有操作数的指令通常是没有意义的。在MCS-51单片机指令中,没 有操作数的指令只有一条空操作指令,绝大多数指令的操作码通常带有1~3B的操作数。 需要说明的是,有些特殊形式的操作数(如数据位于寄存器时)是可以隐含在操作码中的,即 不单独占用存储空间。指令的长度(字节数)等于操作码长度(字节数)与操作数长度(字节 数)之和。MCS-51单片机指令长度最长为3B。 MCS-51单片机指令按指令字节长度分,可分为单字节指令、双字节指令和三字节指令 3种。MCS-51单片机作为一种8位机,其操作数绝大多数为单字节操作数。 (1)单字节指令。指令长度只有一字节,除空操作指令外,操作数可以有1或2个,但 都隐含在操作码中。例如指令 INC A MOV @R0,A (2)双字节指令。一字节的操作码,可以有1或2个操作数。例如指令 ADD A,#22H ·51· 其中,操作码为24H,操作数为22H,目的操作数A 隐含在操作码中,这种指令在内存中 占2B。 (3)三字节指令。一字节操作码,可以有2或3个操作数。例如指令 MOV 5EH,4FH 该指令执行时把4FH 地址单元的内容送到5EH 地址单元中,操作码为85H,操作数分别为 源操作数4FH 和目的操作数5EH,它在内存中占3B。 图3-2给出了机器码指令的3种形式在内存中的数据安排。 图3-2 机器码指令格式 2.汇编语言指令格式 通常,MCS-51单片机典型汇编语言指令的格式如下: [标号: ]操作码助记符[目的操作数][,源操作数][;注释] 每一部分构成汇编指令的一个字段,各字段之间用空格或规定的标点符号隔开。方括 号内的字段可以省略。 各字段的含义如下。 (1)标号:指令的符号地址。它通常代表一条程序语句(助记符指令)的机器代码所在 存储单元的地址。也就是说,在将汇编语言指令转换(即汇编)为机器代码时,它将被赋予该 语句指令代码(首字节)存储单元的地址值。一条语句之前是否要冠以标号,根据程序的需 要而定,当某条语句可能被调用或作为转移的目的地址时,通常要给该语句赋予标号,一旦 某条语句被赋予标号,该标号就可作为其他语句的操作数使用。 标号书写时后面需要加冒号;标号可以单独占用一行;同一标号在同一程序中只能定义 一次,不能重复定义;标号通常由1~8个ASCII码字符组成,第一个字符必须是字母,且标 号名称不能是汇编语言保留字。 不同的机器对标号字段的长度和构成有不同的规定,使用时应注意。 (2)操作码助记符:表示指令进行何种操作,用助记符形式给出。助记符一般为英语 单词的缩写,是不可缺少的字段。MCS-51单片机汇编语言指令中共有42种助记符,代表 了33种不同的功能。 (3)操作数:指令操作的对象。常见的指令操作数通常可分为目的操作数(如上例中 累加器A)和源操作数(如上例中的5FH),任何指令的操作都是实现“从源操作数到目的操 作数”。因此,目的操作数和源操作数的书写顺序不能颠倒。操作数可以是数字(地址、数 据),也可以是标号或寄存器名等。也有些指令不需要指明操作数。 ·52· 注意:目的操作数不仅是操作码操作对象的数据来源之一,而且还要具有保存操作结 果的功能。 注释:对指令功能的说明,便于程序的阅读和维护,它不参与计算机的操作。 汇编指令各字段之间的标点符号应严格按照规定的格式书写。操作码助记符与目的操 作数之间用空格分隔开。 例如指令: START: MOV A,5FH ;(A)←(5FH) 该指令表示将地址为5FH 的内存单元的内容复制到累加器A 中。 为了加深对指令的理解,在本书中MCS-51单片机指令的介绍以汇编语言指令讲述与 分析为主、机器语言指令为辅,并将二者加以对照。 3.1.3 指令分类 指令一般有时间、空间和功能3种属性。时间属性是指一条指令执行所耗费的时间,一 般用机器周期表示;空间属性是指一条指令在程序存储器中所占用的字节数;功能属性是指 每条指令所实现的特定的功能。 MCS-51单片机汇编语言指令共有111条,包含有42种助记符,对应着255种具体的 操作。根据指令属性的不同,111条汇编指令有3种不同的分类方法。 (1)根据指令的时间属性不同,111条汇编指令可分为3种:单机器周期指令(64条)、 双机器周期指令(45条)、四机器周期指令(2条)。 (2)根据指令的空间属性不同,111条汇编指令可分为3种:单字节指令(49条)、双字 节指令(45条)、三字节指令(17条)。 (3)根据指令的功能属性不同,任何类型单片机的指令系统实现的基本功能至少应包 含数据传输类指令、运算类指令(包括算术运算、逻辑运算和位运算等)以及转移类指令等。 MCS-51单片机的111条汇编语言指令按照功能可以细分为5类。 (1)数据传输类指令(29条); (2)算术运算类指令(24条); (3)逻辑操作类指令(24条); (4)控制转移类指令(17条); (5)位操作类指令(17条)。 3.3节中将按照上述指令功能的分类分别加以详述。 3.2 寻址方式 寻址方式是指在一条指令执行过程中,指令中操作数地址(存放位置)的寻找方式。操 作数从内容上看可分为数据(地址)和指令地址两种类型,因此寻址方式可分为两类:一是 数据寻址;二是指令寻址(如转移指令、调用指令)。一般来说,指令系统中,大多数的指令的 寻址方式属于数据寻址,指令寻址仅仅限于部分转移类指令中。 在指令执行时,如果要对数据操作,就需要解决“数据在何处”的问题。这就涉及单片机 ·53· 的寻址方式。在单片机系统中,指令操作数的存放位置通常有几种方式:一是数据直接放 在指令中,这种寻址方式称为常数寻址,又称为立即寻址;二是数据存放在寄存器中,然后寄 存器出现在指令中,这种寻址方式称为寄存器寻址;三是数据存放在存储器单元中,存储器 单元的地址出现在指令中,这种寻址方式称为直接寻址;四是数据存放在存储器单元中,存 储器单元的地址再放在寄存器中,该寄存器出现在指令中,这种寻址方式称为寄存器间接寻 址或者二次寻址。寄存器间接寻址方式可以衍生出多种变形,如基址变址寻址等。在 MCS-51单片机中,数据寻址方式有立即寻址、寄存器寻址、直接寻址、寄存器间接寻址和变 址寻址5种。 指令寻址用在控制转移指令中,其功能是得到转移的目的位置的地址。在MCS-51单 片机中,根据目的位置提供方式的不同,指令寻址可分为3种:一是绝对寻址,仅用在AJMP 指令和ACALL指令中;二是长寻址,仅用在LJMP指令和LCALL指令中;三是相对寻址。前 两种方式比较简单,将在学习相关指令时详细介绍,第3种寻址方式在本节中介绍。 MCS-51单片机还包含有一个1位机,通常称为布尔处理器,其位操作数的存放形式称 为位寻址方式。 在本节中,将详细介绍MCS-51单片机指令系统的立即寻址、寄存器寻址、直接寻址、寄 存器间接寻址、变址寻址、相对寻址以及位寻址7种寻址方式,其中前6种为MCS-51单片 机8位机的寻址方式,最后一种为布尔处理器的寻址方式。 3.2.1 立即寻址 立即寻址方式是指操作数直接出现在指令中。操作数可以是8位或16位(该数称为立 即数)。立即数前面加符号#,以区别于操作数地址。例如: MOV DPTR,#2345H; (DPTR)←2345H 的含义是把16 位数2345H 送入数据指针寄存器DPTR 中,用符号表示为(DPTR)← 2345H。又如: MOV A,#41H; (A)←41H MOV A,41H; (A)←(41H) 其中,第一条指令的含义是将立即数41H送累加器A中,第二条指令的含义是将片内RAM 地址 为41H单元中的内容送累加器A。可见,数41H之前有无#符号,其含义是不同的。 3.2.2 寄存器寻址 寄存器寻址是指以通用寄存器的内容作为操作数。在指令的助记符中直接以寄存器的 名字来表示操作数的地址。在MCS-51单片机的CPU 中,并没有专门的硬件通用寄存器, 而是把片内数据RAM 中的一部分(00H~1FH)作为工作寄存器来使用,每次都可以使用 其中的任意一组,并以R0~R7来命名。至于具体使用哪一组,可在寄存器寻址指令前,通 过PSW 中的RS1和RS0来设定。例如: MOV A,R0 ADD A,R0 ·54· 这两条指令都属于寄存器寻址。前一条指令是将R0寄存器的内容传送到累加器A, 后一条则是对A 和R0的内容做加法运算。 在MCS-51单片机中,用于寄存器寻址方式的寄存器有Rn(n=0,1,2,…,7)、A、B、 DPTR和C(位累加器)。 3.2.3 直接寻址 在指令中,直接给出操作数地址的寻址方式称为直接寻址,此时,指令的操作数部分就 是操作数地址。例如: MOV A,3AH; 其中,源操作数3AH 表示直接地址,即片内RAM 的3AH 单元。指令的功能是把片内 RAM3AH 单元的内容传送到累加器A,并可表示为(A)←(3AH)。 适用于直接寻址方式访问的存储单元有以下几种。 (1)内部数据RAM 的低128B。例如: MOV A,78H ORL A,77H 其中,77H 和78H 都是片内RAM 单元的地址。 (2)特殊功能寄存器。例如: MOV TCON,A 其中,TCON 属于特殊功能寄存器,为符号地址,它所代表的直接地址是88H。 特殊功能寄存器的访问只能采用直接寻址方式。 (3)特殊功能寄存器中可位寻址的位地址空间。例如: SETB EA 其中,EA 是IE寄存器的第7位,它相应的直接地址为0AFH。 (4)内部数据RAM 地址空间子集的128位(位地址空间)。例如: MOV C,7EH; SETB 20H 在单片机的指令系统中,直接寻址方式很有用,尤其是按位的直接寻址可使程序设计变 得简单、灵活。 在实际使用中,还应注意区别如下两点:第一,要注意直接寻址与寄存器寻址的区别。 例如,指令INCA 和指令INCACC并不相同。在指令INCA 中,A 属于寄存器寻址,A 对 应的机器码是04H。而在指令INCACC中,ACC代表累加器A 的直接地址E0H,属于直 接寻址,所产生的机器码是05E0H。但两条指令的功能是一致的,都是将累加器A 的内容 加1。第二,在直接寻址中,要注意字节地址与位地址的区别。试比较 ·55· MOV A,20H 与 MOV C,20H 在前一条指令中,20H 是字节地址,因为目的操作数在A 中,是8位数据;后一条指令 的20H 是位地址(代表24H 单元的D0位),因为目的操作数在进位位C中,是一位的数据。 由此可见,区分的方法在于指令的形式。 3.2.4 寄存器间接寻址 寄存器间接寻址是指指令中一个寄存器的内容是操作数的地址。此类指令执行时,先取 得该寄存器的内容作地址,然后再到该地址对应的存储单元取得操作数。这是一种二次寻址 方式,故称为间接寻址。指定的寄存器前用@标识(在寄存器前加@表示寄存器间接寻址)。 可用于间接寻址的寄存器有以下几种。 (1)R0或R1,用Ri 表示。可寻址内部低128B 的RAM 单元、增强型51单片机高 128B内部RAM 和外部RAM 的256个单元。 格式: MOV A,@Ri 其中,Ri 为R0或R1。 例如: MOV R0,#80H MOV R1,#0BBH MOV A,@R0 MOV A,@R1 (2)DPTR 可访问外部RAM64KB空间。 格式: MOVX A,@DPTR 例如: MOV DPTR,#1234H MOVX A, @DPTR 顺便指出,在执行PUSH(压栈)和POP(出栈)指令时,需采用堆栈指针SP作寄存器间 接寻址。 3.2.5 变址寻址 变址寻址是以某个寄存器的内容为基本地址,然后在这个基本地址基础上加上地址偏 ·56· 移量才是真正的操作数地址。在MCS-51系统中没有专门的变址寄存器,而是采用数据指 针DPTR或程序计数器PC的内容作为基本地址,地址偏移量则是累加器A 的内容,并以 DPTR或者PC的内容与A 的内容之和作为实际的操作数地址。因此,这种寻址方式有两 类:第一类用PC作为基地址加变址寄存器A 的内容形成操作数地址。例如指令: MOVC A,@A+PC ;(PC)←(PC)+1,(A)←((A)+(PC)) 其中,指令操作码助记符号MOVC表示从程序存储器取数据。CPU 在读取本指令时,PC 已执行加1操作,指向下一条指令的首字节,所以作为基地址的已不是原来的PC值,而是 PC+1值。A 中存放偏移量。偏移量加基地址就构成了所要读取的数据的地址。下面一 段程序有助于对问题的说明: 地址 机器代码 源程序 0100H 7402 MOV A,#02H 0102H 83 MOVC A,@A+PC 0103H 00 NOP 0104H 00 NOP 0105H 32 DB 32H 当执行到“MOVCA,@A+PC”时,(A)=02H,(PC)=0103H,因此@A+PC所指的地 址应为0103H+02H=0105H。该指令执行的结果是把0105H 单元的内容32H 送到A中。 第二类变址寻址是用DPTR作为基地址,A 作为变址寄存器,由@A+DPTR形成操作 数的地址。例如: MOV A,#01H MOV DPTR,#TABLE MOVC A,@A+DPTR TABLE: DB 41H DB 42H 在该段程序中,表的首地址TABLE送到DPTR 中作基地址,偏移量01H 送到A 中, 因此@A+DPTR形成操作数的地址为TABLE+01H。执行该指令的结果是将数据42H 送到A 中。这两类变址寻址的方法,特别适用于对固定在程序存储器中的常数表格进行查 表操作,因此上述两类指令又常称为查表指令。 必须指出,由于这两类查表指令各自的基址寄存器不同,其查表范围也不同。第一类查 表指令的基址寄存器是程序计数器PC。由于PC的内容是不能随意变更的,故查表范围只 能由累加器A 的内容来决定,所以使用本指令的表格只能存放在以PC当前值为起始地址 的256B范围内。显然,这使表格的地址空间分配受到严格限制。以DPTR 为基址寄存器 的第二类查表指令,由于可以给DPTR赋予任意值,所以查表范围可达全部64KB的程序存 储器空间。在每次查表前,只需对DPTR 设置表首地址即可。如果DPTR 已有他用,则在 对DPTR装入新值前必须先保存其原值。 3.2.6 相对寻址 相对寻址是以PC的当前值为基准,加上指令中给出的相对偏移量rel形成有效的转移 ·57· 地址。这里所讲的当前PC值是指执行相对转移指令时PC的值。一般将相对转移指令所 在的地址称为源地址,转移后的地址称为目的地址,故有 目的地址= 源地址+ 转移指令字节数+rel 其中,rel是一个带符号的8位二进制数,常以补码的形式出现,因此程序的转移范围是以 PC的当前值为起始地址,相对偏移范围为-128~127B。例如执行指令: SJMP rel 的机器码是80H、rel共2B。设指令所在地址为2000H,rel的值为54H,则转移地址为 2000H+02H+54H=2056H,故指令执行后,PC的值变为2056H。 顺便指出一点,在MCS-51系统中,指令助记符号中的rel值和指令机器码中的rel值 是相同的,不像某些系统中,这两者之间相差一个指令字节数。 3.2.7 位寻址 为了更好地面向控制,MCS-51单片机内部专门设置了一个独立的位处理器———布尔 处理器。它设有独立的位处理指令系统(共17条)。位处理指令采用位寻址方式来获得操 作数,因此其操作数就是8位二进制数中的某一位。在指令系统中,位地址用bit表示。 在MCS-51系统的内部数据RAM 有两个可以按位寻址的区域。其一是20H~2FH 共16个单元中的每一位,共128位(对应的位地址是00H~7FH),都可以单独作为操作数; 其二是某些特殊功能寄存器。凡是单元地址能被8整除的特殊功能寄存器都可以进行位寻 址,其位寻址是80H~FFH 中的一部分。 在MCS-51系统中,位地址的表示可以采用以下4种方式。 (1)直接使用00H~FFH 范围内的某一位的位地址来表示。 (2)采用第几单元第几位的表示方法。例如,25H.5表示25H 单元的D5位。这种表 示方法可以避免查表或计算,比较方便。 (3)对于特殊功能寄存器,可直接用寄存器名加位数的表示法,例如TCON.3、P1.0等。 (4)位名称方式,例如PSW 中的D7位:CY。 3.3 MCS-51单片机指令集 按照指令的功能,可以把MCS-51单片机指令系统的111条指令分为5类。 (1)数据传送类指令(29条)。 (2)算术运算类指令(24条)。 (3)逻辑操作类指令(24条)。 (4)控制转移类指令(17条)。 (5)位操作类指令(17条)。 在介绍指令之前,先对指令中的操作数约定符号进行简单介绍。 Rn,n=0,1,…,7:当前被选定寄存器组的8个工作寄存器R0~R7。 Ri,i=0,1:当前被选定寄存器组的两个工作寄存器R0和R1。 direct:为8位内部数据存储器单元的地址,它可以是内部RAM(00H~7FH)某个单 ·58· 元,或是一个特殊功能寄存器(SFR)的地址。 #data:为指令中的8位立即数。 #data16:为指令中的16位立即数。 addr16:表示16位目标地址,用于LCALL和LJMP指令,能调用或转移到64KB程序 存储器地址空间的任何地方。 addr11:为11位目标地址,用于ACALL和AJMP指令。 rel:带符号的8位偏移地址,用于SJMP指令和所有条件转移指令中。偏移量从下一 条指令的第一个字节单元开始计算,偏移量的取值范围为-128~127。 bit:表示位地址。 @:为寄存器间接寻址符号,如@Ri 表示用寄存器Ri 间接寻址。 /:为位操作的前缀,表示对该位操作数取反,如/bit。 (X):表示X单元中的内容。 ((X)):表示以X单元中的内容为地址的单元中的内容。 ←:表示左边的内容被右边的内容代替。 .:表示数据交换。 $:表示当前指令的地址。 3.3.1 数据传送类指令 1.概述 数据传送操作是单片机系统中最频繁、最基本的操作,因此单片机指令系统中的数据传 送类指令通常是最多的一类指令,也是编程时使用最多的一类指令。同样,MCS-51指令系 统中的数据传送指令也最多,有29条。 数据传送指令一般是把源操作数传送到目的操作数,指令执行后,源操作数内容不变, 目的操作数单元的内容被源操作数内容取代。数据传送指令不影响标志位C、AC、OV(写 PSW 除外)。这类指令的汇编语言格式如下: 操作码助记符 目的操作数[,源操作数] 数据传送类指令的操作码助记符共有8种,按照功能可将其分为5类。 (1)访问片内RAM 指令助记符:MOV。 (2)访问片外RAM 指令助记符:MOVX。 (3)访问片内外程序存储器指令助记符:MOVC。 (4)访问堆栈指令助记符:PUSH 和POP。 (5)数据交换类指令助记符:XCH、XCHD和SWAP。 数据传送类指令操作码助记符只有8种,为何其指令却有29条,原因就在于其操作数 因其具有的多种寻址方式而带来的多样性。由3.2节可知,MCS-51单片机之8位机指令操 作数的寻址方式中,除仅用于转移类指令的指令寻址外,其他类指令的操作数均为数据寻 址,即立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址5种,其中,变址寻址可 以看作是寄存器间接寻址的一种变形。因此,绝大多数指令操作数的寻址方式可以归为立 即寻址、寄存器寻址、直接寻址和寄存器间接寻址4类。 ·59· 在 MCS-51单片机中,寄存器只有A、B、DPTR 、Rn 这4种,而寄存器B仅用于乘、除两 条指令中;可以用于间接寻址的寄存器有Ri、DPTR两种。根据由操作数寻址方式得到的 操作数的具体形式,结合源操作数和目的操作数的特点,可以分析出,作为源操作数的具体 形式有累加器A,工作寄存器Rn,直接地址direct,间接寻址寄存器@DPTR/@Ri 和立即 寻址#data8/#data16这5种;可以作为目的操作数的具体形式有累加器A、工作寄存器 Rn、直接地址direct、间接寻址寄存器@DPTR/@Ri 和DPTR这5种。 MCS-51单片机汇编语言指令系统将42种操作码助记符结合上述操作数寻址方式的 具体形式构造出了MCS-51单片机的5类功能指令共计111条。理解并熟记42种操作码 助记符以及各种操作数的具体形式,同时注意分析不同功能指令的组合特点,可以帮助人们 准确快速地记忆理解这111条汇编指令。在MCS-51单片机指令中,目的操作数与源操作 数不允许出现完全相同的操作数形式,如同为累加器A;若一方操作数为Rn,@Ri 中任何 一种形式的工作寄存器时,则另一方操作数不允许使用任何形式的工作寄存器,如源操作数 为R7,则目的操作数不能再使用工作寄存器Rn,以及@R0或@R1 。 根据数据传送类指令操作码助记符的不同功能分类,29条指令可以分为5类。 (1)片内RAM数据传送指令(16条)。 (2)片外RAM数据传送指令(4条)。 (3)片内外程序存储器访问指令(2条)。 (4)堆栈操作指令(2条)。 (5)数据交换指令(5条)。 2.指令详解 (1)片内RAM数据传送指令(16条) 。 根据目的操作数的不同,又可分为以下5类 。 ①以累加器A为目的操作数的指令(4条),如表3-1所示。 表3- 1 以累加器 A 为目的操作数的指令 汇编语言格式机器码格式十六进制机器码格式操作 MOV A,Rn 11101r E8H~EFH (A)←(Rn),n=0~7 MOV A,direct 11100101 direct E5H direct (A)←(direct) MOV A,@Ri 1110011i E6H~E7H (A)←((Ri)),i=0,1 MOV A,#data 01110100 #data 74H #data (A)←#data 上述指令的注释中,符号()←()表示左边的内容被右边的内容代替;如(A)←(Rn),表 示累加器A中的内容被Rn 的内容取代,即Rn 的内容送累加器A中。其余注释类推,以下 同。第一条机器码指令中的 r 为工作寄存器地址,=000~111,对应工作寄存器R0 ~R7 。Ri= i 为间接寻址寄存器,0或1,即Ri 为R0或(r ) R1 。如上所述,在给出机器码指令 时,多字节指令的机器码在存储器中的存放顺序按以下规则说明: 每条指令的第一字节操作码放在第一行,第二字节操作数放在第二行,第三字节放在第 三行;如双字节指令“MOVA,direct,(”) 该指令的第一字节是E5H,第二行的direct为其第二 ·60· 字节。以下机器码指令描述类同。 【例3-1】 已知(R1)=30H,(R6)=18H,(30H)=78H,(60H)=12H,则执行下列 指令后,各指令累加器A 中的值是多少? 并写出各条指令的机器码。 MOV A,@R1 MOV A,60H MOV A,#56H MOV A,R6 解:指令执行结果如下。 第1行:(A)=78H ;机器码为E7H。 第2行:(A)=12H ;机器码为E560H。 第3行:(A)=56H ;机器码为7456H。 第4行:(A)=18H ;机器码为EEH。 ② 以工作寄存器Rn 为目的操作数的指令(3条),如表3-2所示。 表3-2 以工作寄存器Rn 为目的操作数的指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOV Rn,A 11111rrr F8H~FFH (Rn)←(A) MOV Rn,direct 10101rrr A8H~AFH direct direct (Rn)←(direct) MOV Rn,#data 01111rrr 78H~7FH #data #data (Rn)←#data 【例3-2】 已知(40H)=30H,求执行下面指令后,(R7)和(40H)的值。 MOV R7,40H 解:指令执行结果如下: (R7)=30H,(40H)=30H。 ③ 以直接地址direct为目的操作数的指令(5条),如表3-3所示。 表3-3 以直接地址direct为目的操作数的指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOV direct,A 11110101 F5H direct direct (direct)←(A) MOV direct,Rn 10001rrr 88H~8FH direct direct (direct)←(Rn) MOV direct1,direct2; 10000101 85H direct2 direct2 direct1 direct1 (direct1)←(direct2) ·61· 续表 汇编语言格式机器码格式十六进制机器码格式操 作 MOV direct,@Ri 1000011i 86H~87H direct direct (direct)←((Ri)) MOV direct,#data 01110101 75H direct direct #data #data (direct)←#data 上述最后一条指令是一条三字节指令,机器码在存储器中的存放顺序是,75H 操作码 为第一字节,direct为第二字节,立即数#data为第三字节。 【例3-3】 已知(A)=21H,(R0)=5AH,(5AH)=0B8H,(3FH)=19H,则执行下列 指令后,求目的操作数(68H)的值及相应指令的机器码。 MOV 68H,A; MOV 68H,@R0; MOV 68H,3FH; MOV 68H,#56H; MOV 68H,R0 ; 解:指令执行结果如下。 第1行:(68H)=21H;机器码为F568H。 第2行:(68H)=0B8H;机器码为8668H。 第3行:(68H)=19H;机器码为853F68H。 第4行:(68H)=56H;机器码为756856H。 第5行:(68H)=5AH;机器码为8868H。 ④ 以间接地址@Ri 为目的操作数的指令(3条),如表3-4所示。 表3-4 以间接地址@Ri 为目的操作数的指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOV @Ri,A 1111011i F6H~F7H ((Ri))←(A) MOV @Ri,direct 1010011i A6H~A7H direct direct (Ri))←(direct) MOV @Ri,#data 0111011i 76H~77H #data #data ((Ri))←#data 【例3-4】 已知(R1)= 32H,(32H)= 82H,(40H)= 90H,则执行指令后,(R1)、 (40H)、(32H)的值是多少? MOV @R1,40H 解:指令执行结果如下: (R1)=32H,(40H)=90H,(32H)=90H。 ·62· ⑤16位数据传送指令(1条),如表3-5所示。 表3-5 16位数据传送指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOV DPTR,#data16 10010000 90H 高位字节高位字节 低位字节低位字节 (DPTR)←#data16 这是8位MCS-51单片机指令中唯一的一条16位数据传送指令,其功能是把16位常 数送入DPTR。DPTR由DPH 和DPL组成。这条指令执行的结果是,将高8位立即数送 入DPH,低8位立即数送入DPL。在译成机器码时,也是高位字节在前,低位字节在后。 例如: MOV DPTR,#56A1H 的机器码是9056A1H。 【例3-5】 已知(30H)=40H,(40H)= 10H,(10H)=08H,(P1)= 0CAH 有如下程 序,则程序执行后(R1)、(A)、(B)、(P2)、(40H)、(30H)的值是多少? MOV R1,#30H MOV A,@R1 MOV R1,A MOV B,@R1 MOV @R1,P1 MOV P2,P1 MOV 10H,#20H MOV 30H,10H 解:指令执行结果如下: (A)=(R1)=40H,(B)=10H,(40H)=0CAH,(P2)=0CAH,(30H)=20H。 (2)片外RAM 数据传送指令(4条),如表3-6所示。 表3-6 片外RAM 数据传送指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOVX A,@DPTR 11100000 MOVX @DPTR,A 11110000 E0H (A)←((DPTR)) ((DPTR))←(A) MOVX A,@Ri 1110001i MOVX @Ri,A 1111001i E2H~E3H (A)←((Ri)) ((Ri))←(A) 访问片外数据存储器只能采用间接寻址方式,而且无论读写都需要借助于片内寄存器 A、间接寻址寄存器DPTR或Ri,且片外RAM 可读写,因此共有上述4条指令。 【例3-6】 编程把外部RAM 的0FAH 单元的内容传送到片内RAM 的30H 单元。 ·63· 方法1(用DPTR作为地址指针): MOV DPTR,#0FAH ;设置地址指针 MOVX A,@DPTR ;取出0FAH 单元的内容送累加器A 中 MOV 30H,A ;把A 中的内容即0FAH 单元的内容送30H 单元 方法2(用R0作为地址指针): MOV R0,#0FAH ;设置地址指针的低8 位 MOV P2,#00H ;送出源指针的高8 位 MOVX A,@R0 ;取出0FAH 单元的内容送累加器A 中 MOV 30H,A ;把A 中的内容即0FAH 单元的内容送30H 单元 (3)片内外程序存储器访问指令(2条)。片内外程序存储器访问指令又称为查表指 令,如表3-7所示。 表3-7 片内外程序存储器访问指令 汇编语言格式机器码格式十六进制机器码格式操 作 MOVC A,@A+DPTR 10010011 93H (A)←((A)+(DPTR)) MOVC A,@A+PC 10000011 83H (A)←((A)+(PC)) 助记符MOVC表示指令要访问的是程序存储区ROM。这两条指令均采用变址寻址 方式,以DPTR或本条指令执行完以后的PC值作基地址,累加器A 的内容作偏移量,它们 的和就是要访问的程序存储器单元的地址。 【例3-7】 在ROM 区从0800H 开始的15个单元中依次存放着1~15的平方数表,要 求查表求工作寄存器R1的内容(其值不超过15)的平方值,并回送给R1。 程序如下: MOV DPTR,#800H ;设置地址指针 MOV A,R1 MOVC A,@A+DPTR ;查表 MOV R1,A 需要指出的是,若用PC作基地址,PC是由指令在程序中的位置确定的,不可随意更 改,否则会影响程序的正常执行。 (4)堆栈操作指令(2条),如表3-8所示。 表3-8 堆栈操作指令 汇编语言格式机器码格式十六进制机器码格式操 作 PUSH direct 11000000 C0H (SP)←(SP)+1 direct direct ((SP))←(direct) POP direct 11010000 D0H (direct)←((SP)) direct direct (SP)←(SP)-1 注意:堆栈操作指令的操作数只采用直接寻址方式。 ·64· 【例3-8】 设(SP)=32H,内部RAM 的30H~32H 单元的内容分别为20H、23H、 01H。执行下列指令: POP DPH ;((SP))=(32H)=01H→(DPH),(SP)-1→(SP), ;即把32H 堆栈单元的内容01H 送DPH,SP 内容减1 ;当前值为(DPH)=01H,(SP)=31H POP DPL ;((SP))=(31H)=23H→(DPL),(SP)-1→(SP) ;即把31H 堆栈单元的内容23H 送DPL,SP 内容减1 ;当前值: (DPL)=23H,(SP)=30H POP SP ;(SP)-1→(SP),((SP))=(30H)=20H→(SP) ;先把SP 内容减1,后将原SP 内容20H 送SP 执行结果为(DPTR)=0123H,(SP)=20H。 (5)数据交换指令(5条)。 ① 字节交换指令(3条),如表3-9所示。 表3-9 字节交换指令 汇编语言格式机器码格式十六进制机器码格式操 作 XCH A,Rn 11001rrr C8H~CFH (A). (Rn) XCH A,direct 11000101 C5H direct direct (A).(direct) XCH A,@Ri 1100011i C6H~C7H (A).((Ri)) 这3条指令为累加器A 的内容与源操作数的内容互换。 ② 半字节交换指令(1条),如表3-10所示。 表3-10 半字节交换指令 汇编语言格式机器码格式十六进制机器码格式操 作 XCHD A,@Ri 1101011i D6H~D7H (A3~A0). ((Ri3~Ri0)) 本条指令是累加器A 内容的低4位与源操作数内容的低4位互换,高4位不变。 ③ 累加器A 的低4位与高4位互换指令(1条),如表3-11所示。 表3-11 累加器A 的低4位与高4位互换指令 汇编语言格式机器码格式十六进制机器码格式操 作 SWAP A 11000100 C4H (A3~A0). (A7~A4) 【例3-9】 编程将片外RAM 地址为1000H 单元的内容与片内RAM 地址为60H 单元 的内容互换。 程序如下: ·65· MOV DPTR,#1000H ;设置地址指针 MOVX A,@DPTR ;读取外部RAM 的1000H 单元的值 XCH A,60H ;交换 MOVX @DPTR,A ;60H 单元内容写回片外RAM 的1000H 单元 3.3.2 算术运算类指令 1.概述 算术运算类指令主要是用于实现对8位无符号数进行加、减、乘、除等算术运算;借助 OV 溢出标志位,可对有符号数进行补码运算;借助CY 进位标志位,可进行多精度(字节) 加、减运算;借助十进制调整指令可以对压缩BCD数进行运算。此外,还可以实现加1、减1 运算。算 术运算指令都会影响程序状态寄存器PSW 中的有关标志位,如进位标志位CY 位、 溢出标志位OV 位、辅助进位位AC位和奇偶校验位P等。 MCS-51单片机算术运算类指令共有24条,有8种操作码助记符(以下简称助记符), 根据功能不同可以将其分为6类。 (1)加法指令助记符:ADD、ADDC。 (2)减法指令助记符:SUBB。 (3)加1和减1指令助记符:INC、DEC。 (4)乘法指令助记符:MUL。 (5)除法指令助记符:DIV。 (6)十进制调整指令助记符:DA。 在MCS-51单片机的算术运算指令中,加、减、乘、除这4种指令的目的操作数有个共同 特征:目的操作数只有一种具体形式,即累加器A。 根据指令助记符的功能分类,24条算术运算指令可以分为6类。 (1)加法指令(8条)。 (2)减法指令(4条)。 (3)加1和减1指令(9条)。 (4)乘法指令(1条)。 (5)除法指令(1条)。 (6)十进制调整指令(1条)。 2.指令详解 (1)加法指令(8条)。加法指令分为不带进位加法指令和带进位加法指令两种。 ① 不带进位加法指令(4条),如表3-12所示。 表3-12 不带进位加法指令 汇编语言格式机器码格式十六进制机器码格式操 作 ADD A,Rn 00101rrr 28H~2FH (A)←(A)+(Rn) ADD A,direct 00100101 25H direct direct (A)←(A)+(direct) ·66· 续表 汇编语言格式机器码格式十六进制机器码格式操 作 ADD A,@Ri 0010011i 26H~27H (A)←(A)+((Ri)) ADD A,#data 00100100 24H #data #data (A)←(A)+#data 这4条指令使得累加器A 可以和内部RAM 的任何单元的内容进行相加,也可以和一 个8位立即数相加,相加结果存放在A 中。无论是哪一条加法指令,参加运算的都是两个 8位二进制数。对于指令的使用者来说,这些8位二进制数既可以看作无符号数(0~255), 也可看作带符号数,即补码数(-128~127),这完全由使用者事先设定。但计算机在进行加 法运算时,总是按以下规定进行:在求和时,总是把操作数直接相加,而无须进行任何变换。 例如,假设相加的结果为10111011,若认为是无符号数相加,则这个结果代表十进制数 187;若认为是带符号数相加,则它代表十进制数-69;在相加过程中,当D6到D7有进位,而 D7到CY无进位;或者D6到D7无进位,但D7到CY有进位时,均使溢出标志位OV=1。 假定使用者处理的是无符号数,那么8位二进制数表示的范围为00H~FFH(即0~ 255),超过此范围就溢出。在这种情况下,采用(CY)=1表示数据有溢出。如果使用者处 理的是带符号数,则数的D7位用作符号位,数的表示范围为-128~127。这种情况下,数 据溢出与否不能用CY表示,而要用OV 表示,而且以(OV)=1表示数据溢出。加法指令 还会影响辅助进位标志位AC和奇偶标志位P。在相加过程中,当D3位产生对D4的进位 时,(AC)=1。如果相加后A 中1的个数为偶数,则(P)=0,否则(P)=1。 【例3-10】 已知(A)=0C3H,(R0)=0AAH。则执行指令 ADD A,R0 后,A、CY、OV、AC和P的值是多少。 (A): 1100 0011 +)(R0): 1010 1010 1 0110 1101 结果为(A)=6DH,(CY)=1,(OV)=1,(AC)=0,(P)=1。 ② 带进位加法指令(4条),如表3-13所示。 表3-13 带进位加法指令 汇编语言格式机器码格式十六进制机器码格式操 作 ADDCA,Rn 00111rrr 38H~3FH (A)←(A)+(Rn)+(CY) ADDC A,direct 00110101 35H direct direct (A)←(A)+(direct)+(CY) ADDC A,@Ri 0011011i 36H~37H (A)←(A)+((Ri))+(CY) ADDC A,#data 00110100 34H #data #data (A)←(A)+#data+(CY) ·67· 这4条指令的操作,除了指令中所规定的两个操作数相加外,还要加上进位标志位CY 的值。带进位加法指令主要用于多字节加法。 【例3-11】 30H、31H 单元和40H、41H 单元各存放一双字节数(低位在前,高位在 后),编程实现这两个双字节数的相加,和保存在30H 和31H 单元中(设和仍为双字节数)。 程序如下: MOV A,30H ADD A,40H ;低字节求和 MOV 30H,A MOV A,31H ADDC A,41H ;高字节求和 MOV 31H,A (2)减法指令(4条)。MCS-51系统的减法指令只有带借位减,共有4条指令,如表3-14 所示。 表3-14 减法指令 汇编语言格式机器码格式十六进制机器码格式操 作 SUBBA,Rn 10011rrr 98H~9FH (A)←(A)-(CY)-(Rn) SUBBA,direct 10010101 95H direct direct (A)←(A)-(CY)-(direct) SUBBA,@Ri 1001011i 96H~97H (A)←(A)-(CY)-((Ri)) SUBBA,#data 10010100 94H #data #data (A)←(A)-(CY)-#data 因为在减法操作中必须减去CY,所以在不需要CY参与运算时应先把CY清“0”,指令 为CLRC,这条指令属于位操作指令,将在后续小节进行介绍。两数相减时,如果D7有借 位,则CY置“1”;否则清“0”。若D3位有借位,则AC置“1”;否则清“0”。两数看作带符号 数相减时,还要考查OV 标志。标志位OV 位的判断标准如下。 正数减正数或负数减负数都不可能溢出,故一定有OV=0。 若正数减负数,差值为负(符号位为1),则一定溢出,故OV=1。 若负数减正数,差值为正(符号位为0),也一定溢出,使OV=1。 【例3-12】 被减数存于40H、41H 单元,减数存于30H、31H 单元,编程实现两个数的 相减,要求差存于40H、41H 单元中(低位在前,高位在后)。 程序如下: CLR C MOV A,40H SUBB A,30H ; 低 字节求差 MOV 40H,A MOV A,41H ·68· SUBB A,31H ;高字节求差 MOV 41H,A (3)加1和减1指令(9条)。 ① 加1指令(5条),如表3-15所示。 表3-15 加1指令 汇编语言格式机器码格式十六进制机器码格式操 作 INC A 00000100 04H (A)←(A)+1 INC Rn 00001rrr 08H~0FH (Rn)←(Rn)+1 INC direct 00000101 05H direct direct (direct)←(direct)+1 INC @Ri 0000011i 06H~07H ((Ri))←((Ri))+1 INC DPTR 10100011 A3H (DPTR)←(DPTR)+1 这组指令的功能是将操作数所指定的单元内容加1,加法按无符号数二进制进行。除 INCA 指令会影响奇偶标志位P外,其余加1指令均不影响各个标志位。注意,当用本指 令使并行I/O 接口的内容加1时,原始值从I/O 接口的数据锁存器读入,而不是从I/O 接 口的引脚读入。 ② 减1指令(4条),如表3-16所示。 表3-16 减1指令 汇编语言格式机器码格式十六进制机器码格式操 作 DECA 00010100 14H (A)←(A)-1 DECRn 00011rrr 18H~1FH (Rn)←(Rn)-1 DECdirect 00010101 15H direct direct (direct)←(direct)-1 DEC @Ri 0001011i 16H~17H ((Ri))←((Ri))-1 这组指令的功能是将操作数所指定的单元内容减1,与加1指令一样,除DECA 指令 会影响奇偶标志位P外,其余减1指令均不影响各个标志位。注意,执行并行I/O 接口内 容的减1操作,是将该口的锁存器内容读出减1,再写入该锁存器,而不是对该I/O 接口引 脚上的内容进行减1操作。 (4)乘法指令(1条),如表3-17所示。 表3-17 乘法指令 汇编语言格式机器码格式十六进制机器码格式操 作 MUL AB 10100100 A4H (A)7~0 (B)15~8}←(A)×(B) ·69·