1.13k likes | 1.24k Views
第 3 章 MCS - 51 单片机指令系统 本章要点: 指令格式、指令表示方法 指令种类以及寻址方式 数据传送类、算术运算类指令 控制转移类、位操作类指令. 3.1 MCS - 51 单片机指令格式和寻址方式. 3.1.1 指令系统概述
E N D
第3 章MCS-51单片机指令系统 • 本章要点: • 指令格式、指令表示方法 • 指令种类以及寻址方式 • 数据传送类、算术运算类指令 • 控制转移类、位操作类指令
3.1 MCS-51单片机指令格式和寻址方式 • 3.1.1 指令系统概述 • 通过第二章的学习,读者已经了解了单片机的内部结构,但是完善的计算机系统包括硬件系统和软件系统,因此要使用单片机还需要学习单片机的指令系统。指令是计算机执行某些操作的命令,CPU所能执行的全部指令的集合就构成了指令系统。通常我们设计的程序实际上就是为了某种具体应用而按一定顺序组织在一起的指令序列,所以指令系统是编程的基础,掌握指令的格式、功能和使用是非常重要的。 • 通常来说,微机的寻址方式和指令越丰富、指令执行速度越快、占用存储空间越小,该机型的性能就越强。所以指令系统是体现计算机功能的重要指标之一。
MCS-51单片机的指令系统具有占用存储空间小、指令运行时间短、指令类型丰富的特点。系统共有111条指令,其中单字节指令49条,双字节指令46条,三字节指令16条。按指令实现的功能来分,可分为数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令和布尔位操作类指令。在MCS-51系列单片机的指令系统中,64条指令的执行时间为1个机器周期,45条指令需要2个机器周期的执行时间,2条指令的执行时间需要4个机器周期。若单片机外接晶振频率为24MHZ时,64条指令的执行时间为0.5μs,45条指令的执行时间为1μs,2条指令的执行时间为2μs。
3.1.2 MCS-51单片机指令格式 MCS-51系列单片机的指令具有两种格式:机器语言指令格式和汇编语言指令格式(也称为助记符格式)。其中汇编语言指令格式是当前用户主要使用的格式,后面的章节将对其做详细介绍。用汇编语言指令编写完程序后,由汇编程序将汇编语言源程序汇编成由二进制代码构成的机器语言程序。 1.机器语言指令格式 MCS-51指令系统的机器语言指令是用计算机能够直接识别的二进制代码表示指令。有单字节指令、双字节指令和三字节指令三种表示形式,它们分别占用1~3个存储单元。在微型机中,一般不同的指令用不同的长度来表示,但每条指令都是字节的整数倍。
操作码 第一操作数 第二操作数 单字节指令 字节指令 三字节指令 指令由两部分组成:操作码和操作数 操作码 操作码 操作数
可见,单字节指令只有操作码部分,当指令操作的对象和内容明确时,无须另加操作数字节,此时操作码隐含了操作数的信息。例如,汇编语言指令INC DPTR的功能是使数据指针DPTR的内容加1,是一条一字节指令,它的机器语言指令格式为:10100011。 双字节指令的第一个字节为操作码,第二个字节为操作数本身或操作数的地址。例如,汇编语言指令ADD A,#06H就是一个双字节指令,它的功能是使累加器的内容与数据06H相加,结果再存入累加器A中。表示成机器语言指令格式则为: 11000110 操作码:指明了累加的意义 操作数:操作的对象06H 00000110
与双字节指令相同,三字节指令的第一个字节为操作码,表明指令的性质。其余两个字节为操作数或操作数的地址。例如,汇编语言指令MOV 30H,40H 就是一条三字节指令,它的功能是将40H单元的内容传送到30H单元中。用机器语言指令方法表示则为: 10000101 01000000 0011000操作码 第一操作数 第二操作数
2.汇编语言指令格式 所谓汇编语言指令表示法,就是用表示指令功能的助记符形式表示指令。与机器语言指令相同,也分为单字节指令、双字节指令和三字节指令三种表示形式。例如,实现上述运算的三条指令INC DPTR;ADD A,#06H;MOV 30H,40H都是汇编语言指令格式,分别为单字节、双字节和三字节指令。显然,用汇编语言格式表示指令更方便于用户的理解、使用、记忆和书写。 其具体的格式表示如下: [标号:] 操作码 [操作数1][,操作数2][ ,操作数3][;注释] 其中,方括号内为可选项。各部分之间必须用界定符隔开,即标号要以分号“;”结尾,操作码和操作数之间要有一个或多个空格,操作数和操作数之间用“,”分隔。注释开始之前要加“;”。 例如,LOOP: MOV A,#40H ;给累加器A赋值 标号: 操作码 操作数 注释
(1)标号 标号表示该指令位置的符号地址。在程序汇编时,汇编程序将把标号所指的指令语句目标码首字节的存储单元地址值赋给标号,因此标号可作为地址或数据在其他指令的操作数段引用。标号是可选项,只有在用到转移指令或子程序调用等程序需要的时候才设置。 标号是由英文字母开头的1~8个字母或数字组成的字符串。如果长度超出,汇编程序将截去超出部分。注意标号以分号“:”结尾,不能使用指令助记符、寄存器名等关键字作为标号。另外,标号不能重复定义。
2)操作码 同机器语言指令一样,操作码指出了指令操作的性质,在汇编语言指令中用能够表示指令功能的英文缩写表示。例如: MOV______move的缩写,表示传送 RL ____ __rotate left的缩写,表示左循环 ANL______and logic的缩写,表示与逻辑运算 XCH______exchange的缩写,表示交换
(3)操作数 操作数是操作码的操作对象。指令的操作数可以是1个、2个、3个或0个(即有些指令可以没有操作数)。操作数的形式与指令系统的寻址方式有关,可以是8位或16位的立即数、寄存器或地址。操作数信息的具体表示方法有多种,可以使用十六进制数(以H结尾,如30H)、二进制数(以B结尾,如11000010B)、十进制数(以D结尾或无字尾,如20与20D等价)、字符(如‘J’)、字符串(如“Hello”)、PC现行值($)、ASCII码(’’)、已赋值的符号名、指令的标号、表达式或寄存器名。另外为了区分字符串和数字,指令系统规定所有数字必须以0~9开头,因此对于十六进制数,在以A~F开头的数字前要冠以数字0。例如:MOV A,#0A1H。
(4)注释 注释是为了阅读和交流,对源程序所做的解释性文字。为了增加程序的可读性,一般要求对某些关键程序段或指令添加注释文字。注释以分号开头,一般放在指令的结尾部分,但注释也可以从一行的最前面开始。如果有多行注释,每行注释开头都要用“;”。良好的注释,是构成汇编语言程序的重要组成部分。 注释不是指令的主体部分。在汇编时,汇编程序将不对注释部分进行翻译,汇编后的程序清单将注释原样列出,以提高程序可读性。
实质上,机器码指令和汇编语言指令完全等价,只是表示形式不一样而已。但机器码是计算机直接识别和执行的指令而助记符表示的指令则是需经过汇编程序翻译成机器码后才能被识别和执行的。汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,通过指令表可查出相应的指令代码。例如实质上,机器码指令和汇编语言指令完全等价,只是表示形式不一样而已。但机器码是计算机直接识别和执行的指令而助记符表示的指令则是需经过汇编程序翻译成机器码后才能被识别和执行的。汇编语言指令中操作码和操作数是指令主体,称为指令可执行部分,通过指令表可查出相应的指令代码。例如 汇编语言格式: 相应的机器码 MOV A,R0 11101000 MOV R6,#30H 01111110 00110000 MOV 20H,#100H 01110101 00100000 1100100
3.1.3 MCS-51单片机寻址方式 从指令的构成可以看出,操作数是指令的重要组成部分,确定参与操作的数或数的地址是非常重要的。获得操作数或其所在的地址的方式,称为寻址方式。 寻址方式是反映计算机性能的重要指标之一,它直接影响指令的长度和执行的时间,因此寻址方式越多,编程的灵活性就越大。不同的微处理器由于硬件结构不同,其指令系统一般也不相同,但其寻址方式却是相似的。这一点对于初学者来说可起到触类旁通的作用。
MCS-51单片机的数据存储空间分为4部分:统一编址的内部数据RAM和特殊功能寄存器SFR,分开编址的外部数据RAM和程序存储器。寻址空间包括存储器的存储单元地址和位地址。对于内部数据RAM既可以以字节为单位寻址,又可以位为单位寻址。可位寻址的空间包括特殊功能寄存器SFR中能被8整除的寄存器地址和片内20H—2FH区间的数据存储器地址;对于外部数据存储器RAM和程序存储器以字节为单位寻址。MCS-51单片机的数据存储空间分为4部分:统一编址的内部数据RAM和特殊功能寄存器SFR,分开编址的外部数据RAM和程序存储器。寻址空间包括存储器的存储单元地址和位地址。对于内部数据RAM既可以以字节为单位寻址,又可以位为单位寻址。可位寻址的空间包括特殊功能寄存器SFR中能被8整除的寄存器地址和片内20H—2FH区间的数据存储器地址;对于外部数据存储器RAM和程序存储器以字节为单位寻址。 为了区分指令中操作数所处的地址空间,针对数据存储空间的不同,采用了不同的寻址方式。MCS-51系列单片机共有七种寻址方式,分别为:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和为寻址。下面分别介绍
1.立即寻址 在立即寻址中,由指令直接给出参与实际操作的数据(即立即数)。立即寻址一般用于为寄存器或存储器赋常数初值,由于操作数直接由指令给出,因此这种寻址方式的特点是速度快。 MCS-51系统中,立即寻址方式的指令一般为双字节指令,第一个字节为操作码,第二个字节为操作数。用“#”开头表示立即数,立即数一般为1个字节的8位二进制数。只有一条指令(MOV DPTR,#data 16)的立即数为两个字节的16位二进制数。这条指令的功能是将16位的立即数data16送入数据指针寄存器DPTR中,立即数采用顺序存放,即高8位送入高字节DPH,低8位送入低字节DPL中。该指令是一条三字节指令。
PC PC+1 90 20 01 74 20 A 20 例如: 8位立即数: MOV A,#20H ;(A) ← 20H 机器代码(十六进制):74 20 该指令的功能是将立即数20H送入累加器A中。 16位立即数: MOV DPTR,#2001H ;(DPTR) ← 2001H 机器代码(十六进制):90 20 01 该指令的功能是将立即数2001H送入数据指针DPTR中。 立即寻址的示意图如图3-2所示。 PC PC+1 PC+2 SFR 20 01 DPH DPL 图3-2 立即寻址示意图
程序存储器 片内RAM 20H 21H A 36 PC PC+1 E5 20 36 2A 2.直接寻址 在直接寻址方式中,由指令直接给出操作数的地址。即指令操作数为存储器单元的地址,真正的数据在存储器单元中。 例如: 指令 MOV A,20H ;(A) ←(20H) 机器代码(十六进制):E5 20 该例中,操作数的地址20H由指令直接给出,而实际参加操作的数存在地址为20H的单元中。设存储器单元20H存放的内容为36H,则执行上述指令后,36H被送到累加器A中。指令的执行过程如图3-3所示。 图3-3 直接寻址示意图
直接寻址方式对数据操作时,地址是一个固定值,而地址所指定的单元内容为变量形式。直接寻址指令中的操作数地址只能为8位数形式,因此直接寻址的寻址空间为:直接寻址方式对数据操作时,地址是一个固定值,而地址所指定的单元内容为变量形式。直接寻址指令中的操作数地址只能为8位数形式,因此直接寻址的寻址空间为: 特殊功能寄存器SFR 片内数据存储器RAM的低128个字节 位地址区 其中SFR和位地址区只能使用直接寻址方式访问,而片内RAM区除了直接寻址外,还可以使用寄存器间接寻址方式。 3.寄存器寻址 寄存器寻址是指令中指出寄存器名,以该寄存器的内容作为操作数的寻址方式。可以使用寄存器寻址的寄存器包括累加器A、B寄存器、数据指针DPTR、进位CY以及工作寄存器组中的R0~R7。 其中A、B、DPTR和CY在使用寄存器寻址时具体名称隐含在操作码中,而R0~R7则由操作码字节的低3位指明。
程序存储器 片内RAM 11101010 30 2A R2(09H) R1 A 30 PC 例如: 指令MOV A,R2 ;(A) ←( R2) 机器代码(十六进制):EA 该指令的功能为将R2寄存器的内容送入累加器A中。其操作码EAH二进制形式为11101010,低3位010表示寄存器为R2。设指令执行前 A=20H,R2=30H,PSW中的RS1、RS0的值分别为0、1,则工作寄存器R2为第一组的,地址为09H,指令执行后累加器A的内容变为30H,而R2的内容保持不变。寻址示意图如图3-4所示。
4.寄存器间接寻址 寄存器间接寻址时,指令操作数中指定的寄存器内容为操作数的地址,将该地址所对应的存储单元内容作为操作数。 能够用于寄存器间接寻址的寄存器包括数据指针DPTR、堆栈指针SP、R0和R1。其中R0或R1为工作寄存器组中的寄存器,主要用于访问内部RAM的00H~7FH的低128个字节单元;堆栈指针SP仅用于堆栈操作时进行寄存器间接寻址,如栈操作指令PUSH和POP。 该寻址方式主要用于访问外部RAM和内部RAM。由于内部RAM仅有128个字节,因此用R0或R1可寻址整个空间。而外部RAM可达64K字节,若要寻址整个空间仅用R0或R1无法实现,为此,MCS-51单片机指令系统中在访问外部RAM的256个单元(00H~FFH)时,采用R0或R1工作寄存器来间接寻址;在访问外部RAM的整个64K空间时采用16位的数据指针DPTR作寄存器间接寻址。
程序存储器 片内RAM 11100111 30 4F R1(08H) R2 30H PC A 4F 例如: 指令MOV A,@R1 ;(A) ←((R1)) 机器代码(十六进制):E7 该指令的功能为将R1寄存器的内容作为地址,再将该地址单元的内容送入累加器A中。设指令执行前 (A)=20H,(R1)=30H,(30H)=4FH,PSW中的RS1、RS0的值分别为0、1,则工作寄存器R1为第一组的,地址为08H,指令执行后累加器A的内容变为4FH,而R1的内容保持不变。寻址示意图如图3-5所示。 图3-5 寄存器间接寻址示意图
在MCS-51单片机系统中,采用不同的指令来访问数据存储器,即根据使用的指令来区别时内部RAM寻址还是外部RAM寻址。例如在数据传送时访问外部RAM使用MOVX指令,而访问片内RAM则使用MOV指令。在MCS-51单片机系统中,采用不同的指令来访问数据存储器,即根据使用的指令来区别时内部RAM寻址还是外部RAM寻址。例如在数据传送时访问外部RAM使用MOVX指令,而访问片内RAM则使用MOV指令。 5.变址寻址 变址寻址方式使用程序计数器PC或数据指针DPTR作为基址寄存器,累加器A为变址寄存器,将基址寄存器的内容与变址寄存器的内容之和作为操作数地址。操作数的有效地址可表示为: 操作数有效地址=PC或DPTR的内容+A的内容 变址寻址只能对程序存储器中的数据作寻址操作,通常用于查表操作中,使用指令符MOVC。当以DPTR存放16位基址时,可寻址64K字节存储空间;当以PC作为基址时,则可寻址以PC当前值为起始地址的256个字节空间。
例如: 指令MOVC A,@A+DPTR;(A)←((A)+(DPTR))机器代码(十六进制):93设指令执行前 (A)=07H,(DPTR)=2000H,该指令执行时将数据指针DPTR的内容2000H与累加器A的内容07H之和(2007H)作为地址,再将2007H存储单元的内容(例如4FH)送入累加器A中。寻址示意图如图3-6所示。 SFR 程序存储器 A 07 20 00 PC 2007H 10010011 4F … DPH DPL … … … 2000H+07H=2007H + 图3-6 变址寻址示意图
6.相对寻址相对寻址以当前程序计数器PC的值(源地址)为基址,与指令给出的偏移量rel(相对地址的机器码)相加形成下一条要执行指令的有效地址(又称为目的地址D)。相对寻址是用于寻找指令地址的寻址方式,仅用于相对转移指令中,指令中的偏移量为用补码表示的8位有符号数,取值为:-128~+127,所以程序的转移范围为相对于PC当前值的-128~+127个字节单元之间,在源程序中,相对地址一般用标号表示。相对寻址中,目的地址可表示为:目的地址D=偏移量rel+源地址(PC的当前值)+指令字节数aMCS-51指令系统中,相对转移指令多为2字节指令,此时a=2;若指令为3字节则a=3。例如: 指令 JC 12H;当CY=0时 ,(PC)←(PC)+2;当 CY≠0时,(PC) ← (PC)+2+rel机器代码(十六进制):40 10
设指令执行前源地址为1000H,由于该指令为2字节指令所以a=2,偏移量rel为指令的机器码10H,因此目的地址D=1000H+10H+2=1012H。指令执行时,若CY=0,则程序继续往下执行不实现转移;若CY≠0,则执行该指令后PC=1012H,程序转移到1012H单元处执行。寻址示意图如图3-7所示。设指令执行前源地址为1000H,由于该指令为2字节指令所以a=2,偏移量rel为指令的机器码10H,因此目的地址D=1000H+10H+2=1012H。指令执行时,若CY=0,则程序继续往下执行不实现转移;若CY≠0,则执行该指令后PC=1012H,程序转移到1012H单元处执行。寻址示意图如图3-7所示。 程序存储器 01000000 00010000 ×× PC 1000H 1001H 1002H PC 1012H PC 偏移量10H +2 + 1000H … … 1000H+10H+2=1012H 图3-7 相对寻址示意图
7.位寻址位寻址是指对内部RAM中的位寻址区(20H~2FH)和某些具有位寻址功能的特殊功能寄存器SFR进行位操作时的寻址方式。位操作指令可对位寻址区内的每个位进行逻辑运算、状态控制等操作。位寻址是一种直接寻址方式,由指令给出符号位地址或直接位地址。对于特殊功能寄存器通常使用C,RS1,RS0,EA,P1.0等符号位地址,对于内部RAM通常使用30H、15H等直接位地址。区别指令给出的是直接位地址还是直接字节地址要视指令的符号形式才能确定。例如,指令SETB 30H和MOV A,30H中,前者30H为位地址而后者则为字节地址。例如: 指令 MOV C,30H ;CY (位地址30H)机器代码(十六进制):A2 30该指令为位寻址方式。设指令执行前 CY=1,位地址30H存储器单元内容为0,则执行指令后,CY= 0,寻址示意图如图3-8所示。
程序存储器 PC PC+1 内部RAM位地址区26H单元 10100010 00110000 37 36 35 34 33 32 31 30 … 26H SFR 0 C AC F0 RS1 RS0 OV F1 P 0 图3-8 位寻址示意图
3.1.4 MCS—51单片机寻址方式小结 以上详细介绍了MCS-51单片机指令系统的七种寻址方式。现总结如表3-3所示。 表3-3寻址方式
3.2.1 指令格式中符号意义说明 如前所述,MCS-51的指令系统按功能可分为五类,其中数据传送类28条,算术运算类24条,逻辑操作类25条,控制转移类17条,布尔位操作类17条。在具体描述这些指令时通常使用下面的符号,它们的意义如下:1.#data表示八位立即数,#data16表示是十六位立即数。“#”表示后 面data是立即数。2.direct表示片内RAM和特殊功能寄存器的8位直接地址。其中特 殊功能寄存器还可直接使用名称符号来代替直接地址。3.Rn(n=0~7)表示当前选中的工作寄存器组R0~R7。选中工作寄存 器组的地址由PSW中的RS1和RS0确定,分别为组0:00H~07H, 组1:08H~0FH,组2:10H~17H,组3:18H~1FH。4.@Ri(i=0,1)表示对寄存器R0或R1间接寻址。其中@为寄存器 间接寻址符。5.@DPTR表示以数据指针DPTR的内容为地址,对片外RAM进行 间接寻址。其中@的意义同上。 3.2 MCS-51单片机指令分类介绍
6.addr11表示11位目的地址。用于AJMP和ACALL指令中,使转6.addr11表示11位目的地址。用于AJMP和ACALL指令中,使转 向的目的地址与下一条指令首字节位于同一个2K字节的程序存 储器地址空间。 7.addr16表示16位目的地址。用于LJMP和LCALL指令中,可使 转向的目的地址为64K程序存储器地址空间的任意单元。 8./bit表示对bit位先取反再参与运算,但不影响该位的原值。其中 “/”表示取反,bit表示位地址。 9.rel表示补码形式的8位偏移量。用于相对转移指令中,地址偏移 量的范围为-128~+127之间。在编写源程序时rel通常由标号代 替,其具体值由汇编程序自动计算确定。 10.(×)间接寻址时表示间接寄存器×指出的地址单元的内容; 直接寻址时表示直接地址×中的内容。如(30H)表示直接地 址30H存储单元的内容。 11.rrr表示在指令编码中rrr三位的值由当前工作寄存器Rn确定。 R0~R7对应的三位rrr值分别为000~111。如当前工作寄存器 为R0则指令编码中rrr的值应为000。
3.2.2 数据传送类指令 数据传送类指令是MCS-51指令系统中最基本、也是包含指令最多的一类指令。用于实现寄存器、存储器之间的数据传送,即把“源操作数”中的数据传送到目的操作数,而源操作数不变,目的操作数被传送后的源操作数所代替。 该类指令中的源操作数可以是立即数、累加器A、工作寄存器Rn或片内RAM单元,目的操作数可以是累加器A、工作寄存器Rn或片内RAM存储单元,但要注意立即数不能作为目的操作数。 为了便于学习、掌握和记忆,下面按指令的功能分别进行介绍。
1. 内部传送指令指令功能:实现片内RAM和特殊功能寄存器SFR各数据存储单元之间的数据传送。指令格式: MOV 目的操作数,源操作数 寻址方式:立即寻址、直接寻址、寄存器寻址、寄存器间接寻址 (1)以累加器A为目的操作数的指令(4条)MOV A,Rn ;(A)←(Rn),Rn=R0~R7 MOV A,direct ;(A)←(direct) MOV A,@Ri ;(A)←((Ri)),Ri=R0、R1 MOV A,#data ;(A)←data上述指令表示将源操作数所指定的工作寄存器Rn、片内RAM地址存储单元(direct表示直接地址)、SFR内容或立即数data送到目的操作数累加器A中。
例如,已知(R3)=20H,(A)=30H,(R0)=40H,(50H)=1EH,(40H)=5FH执行下列指令序列:例如,已知(R3)=20H,(A)=30H,(R0)=40H,(50H)=1EH,(40H)=5FH执行下列指令序列: MOV A,R3 ;(A)←(R3), (A)=20H MOV A, 50H ;(A)←(50H),(A)=1EH MOV A, @R0 ;(A)←((R0)),(A)=5FH MOV A,#34H ;(A)←34H,(A)=34H
(2)以寄存器Rn为目的操作数的指令 (3条) MOV Rn,A ; (Rn) ←(A) MOV Rn,direct; (Rn) ←(direct) MOV Rn,#data; (Rn) ←data 该组指令的功能是把源操作数所指定的累加器A、片内直接地址单元、SFR内容或立即数送入当前工作寄存器,源操作数不变。 例如,已知(A)=20H,(R2)=30H,(R3)=40H,(50H)=1EH顺序执行下列指令序列: MOV R2,A ;(R2)←(A),(R2)=20H MOV R3,50H ;(R3)←(50H),(R3)=1EH MOV R1,#20H;(R1)←20H,(R1)=20H 指令执行后 (A)=20H,(R2)=20H,(R3)=1EH,(R1)=20H。
(3)以直接地址为目的操作数的指令(5条) MOV direct,A ;(direct)←(A) MOV direct,Rn ;(direct)←(Rn) MOV direct1,direct2 ;(direct1)←(direct2) MOV direct,@Ri ;(direct)←((Ri)) MOV direct,#data ;(direct)←data 该组指令的功能是将源操作数指定的累加器A、工作寄存器Rn、立即数或片内RAM单元的内容传送到直接地址direct所指定的片内存储器单元中。
例如,已知(A)=30H,(R1)=40H,(R2)=50H,(40H)=1EH顺序执行下列指令序列:例如,已知(A)=30H,(R1)=40H,(R2)=50H,(40H)=1EH顺序执行下列指令序列: MOV 20H,A ;(20H)←(A),(20)=30H MOV 20H,R1 ;(20H)←(R1),(20H)=40H MOV 20H,40H ;20H←(40H) ,(20H)=1EH MOV 20H,@R1 ;(20H)←((R1)) ,(20H)=1EH MOV 20H,#54H ;(20H)←54H ,(20H)=54H
(4)以寄存器间接地址为目的操作数的指令(3条) MOV @Ri,A ;((Ri))←(A) MOV @Ri,direct ;((Ri))←(direct) MOV @Ri,#data ;((Ri))←data 该组指令的功能是将累加器A、片内RAM存储器单元的内容或立即数送入由Ri内容指定的片内存储单元中。 例如,已知(A)=10H,(R0)=30H,(R1)=40H,(20H)=50H顺序执行下列指令序列: MOV @R0,A ;((R0))←(A) , (30H)=10H MOV @R1,20H ;((R1))←(20H) ,(40)=50H MOV @R0,#54H ;((R0))←54H , (30H)=54H
(5)16位数据传送指令(1条) MOV DPTR,#data16 ;(DPH)←data8~15,(DPL)←data0~7 该指令是唯一的一条16位立即数传送指令,其功能是将一个16位的立即数送入数据指针DPTR中去。其中高位字节数据送入DPH,低位字节数据送入DPL。 例如 MOV DPTR,#1234H;(DPH)=12H,(DPL)=34H 上面这条指令等价于下面两条指令: MOV DPH,#12H ; (DPH)=12H MOV DPL,#34H ; (DPL)=34H
2. 外部传送指令 指令功能:实现累加器A与片外数据存储器之间的数据传送。 指令格式:MOVX 目的操作数,源操作数 寻址方式:片外数据存储器用寄存器间接寻址方式。 (1)读片外RAM单元指令 MOVX A,@Ri ;(A)←((Ri)) MOVX A,@DPTR;(A)←((DPTR)) (2)写片外RAM单元指令 MOVX @Ri,A ;((Ri))←(A) MOVX @DPTR,A ;((DPTR))←(A) CPU访问片外RAM单元只能使用寄存器间接寻址方式,其中使用16位数据指针DPTR作间接寻址,可寻址64KB片外RAM空间,寻址时其DPL(提供低8位地址)由P0口经锁存器输出;P2口输出DPH提供的高8位地址,P0口与P2口组成16位地址总线实现对片外RAM的存储单元寻址;使用8位工作寄存器Ri作间接寻址,可寻址片外RAM的00H~FFH共256个字节单元空间,寻址时Ri提供的8位地址由P0口输出实现对片外RAM的存储单元寻址,此时P2口仍可作为输入/输出口。
例如,片外RAM存储单元的内容如图3-9所示,实现将片外数据存储单元2000H数据20H传送到2100H单元中的指令序列如下:例如,片外RAM存储单元的内容如图3-9所示,实现将片外数据存储单元2000H数据20H传送到2100H单元中的指令序列如下: MOV DPTR,#2000H ; (DPTR)←2000H MOVX A,@DPTR ; (A)←20H MOV DPTR,#2100H ; (DPTR)←2100H MOVX @DPTR,A ;(2100H)←20H
练习: 1、将片外数据存储单元20H中的数据送到片外数据存储单元30H去。 MOV R0,#20H MOVX A,@R0 MOV R0,#30H MOVX @R0,A 2、将片外数据存储单元20H中的数据送到片内数据存储单元30H去。 法一: MOV R0,#20H MOVX A,@R0 MOV R0,#30H MOV @R0,A 法二: MOV R0,#20H MOVX A,@R0 MOV 30H,A
3. 交换指令 指令功能:实现片内数据存储器数据传送。 (1) 字节交换指令 XCH A,Rn ;(A) (Rn) XCH A,@Ri ;(A) ((Ri)) XCH A,direct ;(A) (direct) 该组指令实现累加器A与工作寄存器Rn、Ri内容指定的片内存储单元或片内RAM直接地址单元的内容的互相交换。 例如,设(A)= 2FH,(R0)=20H,片内RAM存储单元内容如图3-10所示。 执行指令XCH A,@R0后,执行结果为:(A)=46H,(20H)=2FH。
A 2FH 例如,设(A)= 2FH,(R0)=20H,片内RAM存储单元内容如图所示。 执行指令: XCH A,@R0 ; (A)=46H,(20H)=2FH
(2)半字节交换指令 XCHD A,@Ri ;(A.0~A.3) ((Ri.0~Ri.3)) SWAP A ;(A.4~A.7) (A.0~A.3) XCHD A,@Ri指令的功能是将累加器A的低4位内容与Ri间接寻址单元内容的低4位互换,它们的高4位保持不变。 例如,设(A)= 2FH,(R0)=20H,片内RAM存储单元内容如图3-10所示。 执行指令: XCHD A,@R0;(A)=26H,(20H)=4FH。 SWAP A指令的功能是将累加器A的高4位(A.4~A.7)与其低4位(A.0~A.3)互换。本指令也可作为4位循环移位指令。 例如,设(A)= 2FH,执行指令: SWAP A;(A)=F2H。
4.堆栈操作指令 PUSH direct ;(SP)←(SP)+1,((SP))←(direct) POP direct ;(direct)←((SP)),(SP)←(SP)-1 对堆栈操作有两种操作方式,其中PUSH为进栈指令,功能为将堆栈指针SP的内容加1,指向一个空单元,然后将直接寻址单元中的数据压入到SP所指的单元中;POP指令为出栈指令,其功能与出栈指令相反,首先将堆栈内容弹出到直接寻址单元中,然后将SP的内容减1,指向下一个单元,即新的栈顶。 用户在进行程序设计时,一般应设定SP的初值,即要根据系统需要留出适当的存储单元作堆栈区,不能将堆栈区空间设置过小或过大,如果堆栈区设置不当很可能引发数据重叠从而引起程序混乱。用堆栈指令可以实现内部RAM单元之间的数据传送和交换。堆栈操作通常被用于在子程序嵌套时保存断点以及在中断程序中保存现场和恢复现场等。
SP 例如,设(A)=40H,(B)=41H,执行下列指令序列,堆栈的变化如 图3-11所示: MOV SP,#30H;(SP)=30H PUSH A ; (SP)=31H, (31H)=40H PUSH B ; (SP)=32H, (32H)=41H POP B ; (B)=41H, (SP)=31H POP A; (A)=40H, (SP)=30H SP SP SP 执行指令前 执行PUSH A后 执行PUSH B后 执行POP B后
SP 执行 POP A后 请同学们自行完成执行POP A指令后的堆栈变化示意图。 分析可以得出指令序列执行后的结果与指令执行前相同即(SP)=30H,(B)=41H,(A)=40H,这体现了堆栈保护现场和恢复现场的功能。
请读者思考若将POP B和POP A两条指令执行次序互换是否还会得到同样的结果? 例如,设(A)=40H,(B)=41H,写出执行下列各指令后的结果 MOV SP,#30H ; PUSH A ; PUSH B ; POP A ; POP B ; (SP)=30H (SP)=31H, (31H)=40H (SP)=32H, (32H)=41H (A)=41H, (SP)=31H (B)=40H, (SP)=30H
5. 查表指令 指令功能:实现从程序存储器读取数据到累加器A中 寻址方式:只能使用变址间接寻址方式。 (1)以DPTR为基址寄存器 MOVC A,@A+DPTR ;(A)←((A)+(DPTR)) 该指令的功能为以DPTR为基址寄存器,与累加器A相加后获得一个16位地址,然后将该地址对应的程序存储器单元内容送到累加器A中。其中累加器A的内容为无符号数。 例如,设(DPTR)=2000H,(A)=10H,(2010H)=40H,执行指令: MOVC A,@A+DPTR ; (A)=40H 指令执行结果为将程序存储器2010H单元中的内容送入累加器A,即A←(2000H+10H)。由于该指令的执行结果仅与DPTR和累加器A的内容相关,与该指令在程序存储器中的存放地址无关,DPTR的初值可任意设定,因此其查表范围为 64KB 程序存储器的任意空间,又称为远程查表。该指令多用于查常数表程序,可直接求取常数表中的值。