1、高等职业教育高等职业教育计算机类课程规划教材计算机类课程规划教材大连理工大学出版社大连理工大学出版社 第第3 3章章 MCS-51 MCS-51 单片机的指令系统单片机的指令系统3.1 3.1 指令格式及分类指令格式及分类3.2 3.2 寻址方式寻址方式3.3 3.3 数据传送指令数据传送指令3.4 3.4 算术运算指令算术运算指令3.5 3.5 逻辑操作指令逻辑操作指令3.6 3.6 控制转移指令控制转移指令3.7 3.7 位处理指令位处理指令l 3.1.1 3.1.1 指令格式指令格式l MCS-51MCS-51系列单片机指令有两种标识方式系列单片机指令有两种标识方式:机器语言方式和汇编语
2、言方式。l 机器语言方式由二进制代码组成(通常用十六进制表示),被称为机器指令。用机器指令编写的程序称为机器语言源程序,它是机器所能理解和执行的,但人们记忆和读写都很困难。l 汇编语言方式由方便人们记忆的“助记符”和数字符号组成,被称为符号指令。用符号指令编写的程序称为汇编语言源程序,它必须通过汇编程序汇编成机器语言程序后,机器才能理解和执行。l 汇编过程也可以手工完成,即手工汇编。3.1 3.1 指令格式及分类指令格式及分类l 1.1.汇编语言指令格式汇编语言指令格式l 汇编语言指令的一般格式如下:l 标号:操作码第一操作数,第二操作数,第三操作数;注释l 说明说明:l (1)带方括号的部分
3、为可选项。l (2)标号是用符号表示的一个地址常量。l 它表示该指令在程序存储器中的起始地址。l 标号的命名规则是:必须以字母开头,长度不超过6个字符,并以“:”结束。l (3)操作码表示指令的操作功能。每条指令都有操作码。l (4)操作数表示的是参与操作的数据来源和操作之后结果数据的存放位置,可以是常数、地址或寄存器符号。l 指令的操作数可能有1个、2个或3个,有些指令可能没有操作数。l 操作数与操作数之间用“,”分隔,操作码与操作数之间用空格分隔。l (5)注释字段是编程人员对该指令或该段程序的功能说明,是为了方便阅读程序的一种标注。l 注释以“;”开始,当汇编语言源程序被汇编成机器语言程
4、序时,该项被舍弃。l 2.2.机器语言指令格式机器语言指令格式l 机器语言指令是一种二进制代码,它包括两部分:操作码和操作数。l MCS-51指令系统中有单字节、双字节和三字节共3种指令。l 机器指令格式如下机器指令格式如下:l (1)单字节指令l 在单字节指令中,操作码和操作数共占一个字节,其中操作数通常为以隐含形式指定的常用寄存器。其指令格式如下:l 例如INC DPTR指令,其功能为DPTR(DPTR)+1。指令机器码为:l MCS-51系列单片机中,单字节的机器指令共有49条。l (2)双字节指令l 双字节指令的第一个字节为操作码,第二个字节为操作数或操作数的地址。这类指令的指令格式为
5、:操作码nn 1010 0011操作码操作数nn nn+1 l 例如MOV A,#00H指令,其功能为A00H。指令机器码为:l MCS-51系列单片机中,双字节的机器指令共有46条。l (3)三字节指令l 三字节指令的第一个字节为操作码,第二个字节和第三个字节都是操作数或操作数的地址。这类指令的指令格式为:l 例如MOV2FH,#00H指令,其功能为2FH00H。0111 01000000 0000操作码操作数操作码第一操作数nn nn+1 第二操作数nn+2 l 指令机器码为:l MCS-51系列单片机中,三字节的机器指令共有16条。l 3.1.2 3.1.2 指令分类指令分类l MCS-
6、51 系列单片机指令系统共有111条不同的指令。这些指令按每条指令的执行时间分类,有64条单周期指令,45条双周期指令和2条4周期指令;如果按字节数分类则有单字节的指令49条,双字节的指令46条,三字节的指令16条。l 这些指令按指令操作功能划分,有以下5类:l 数据传送指令(28条)l 算术运算指令(24条)0111 01010010 1111操作码第一操作数0000 0000第二操作数l 逻辑运算及移位指令(25条)l 控制转移指令(22条,含以位值为条件的转移指令5条)l 位操作指令(17条,含以位值为条件的转移指令5条)l 3.1.3 3.1.3 指令系统符号约定指令系统符号约定l 指
7、令的一个重要组成部分是操作数,为了表示指令中同一种类型的操作数,MCS-51单片机指令系统采用了如下符号约定。l 1.Rn:n=07,表示当前工作寄存器区的8个工作寄存器R0R7。l 2.Ri:i=0,1。表示当前工作寄存器区的2个工作寄存器R0、R1。l 3.direct:表示8位内部数据存储单元的地址。l 4.#data:表示8位立即数。“#”表示后面的data为立即数。l 5.#data16:表示16位立即数。“#”意义同上。l 6.addr11:表示11位目的地址。l 7.addr16:表示16位目的地址。l 8.rel:表示带符号的8位偏移量,被用在SJMP和所有条件转移指令中。l
8、9.bit:表示8位内部数据存储空间或特殊功能寄存器区中可按位寻址区的8位位地址。l 10.bit:表示在位操作指令中,对该位(bit)先取反,再参与运算,但不改变位(bit)的原值。l 11.():表示某一寄存器、存储单元或表达式的内容。l 12.():表示某一寄存器、存储单元或表达式的内容的内容。l 13.:表示其后的寄存器或表达式的值为操作数的地址。l (1)Ri:表示寄存器Ri(i=0或1)中存放的是操作数的地址。l (2)DPTR:表示DPTR中存放的是操作数的地址,该地址位于外部数据存储空间,其取值范围为0000H0FFFFH。l 14.:表示将箭头右边的值赋给箭头左边的寄存器或存
9、储单元。l 15.:表示箭头两端的数据进行交换。l 16.(S):表示源操作数。l 17.(D):表示目的操作数。l 18.rrr:在指令编码中,rrr三位值由工作寄存器Rn确定,R0R7对应的rrr值分别为000111。l 19.:表示本指令的起始地址。3.2 3.2 寻址方式寻址方式l 3.2.1 3.2.1 寄存器寻址方式寄存器寻址方式l 寄存器寻址是指,在指令中直接以寄存器名表示操作数的地址。即寄存器的内容作为操作数。l 可以采用寄存器寻址的寄存器有 R0R7、累加器A、DPTR以及位累加器Cy。例如指令:l MOV A,R2l 源操作数和目的操作数都属于寄存器寻址。l 3.2.2 3
10、.2.2 直接寻址方式直接寻址方式l 直接寻址方式是指,在指令中以地址或符号形式直接给出操作数地址。用这种寻址方式可以访问内部数据存储器三种地址空间:l 1.内部数据存储器的128个字节单元。例如指令:l MOV A,50H ;指令中源操作数的寻址方式为直接寻址l 2.位地址空间。例如指令:l MOV C,00H ;指令中源操作数的寻址方式为直接寻址l 3.特殊功能寄存器地址空间。例如指令:l MOV Acc,P1 ;源操作数和目的操作数采用的都是直接寻址 l 3.2.3 3.2.3 立即寻址方式立即寻址方式l 立即寻址方式是指,指令操作数部分给出的就是参与运算的操作数本身,它可以是 8位二进
11、制数或16位二进制数。即操作数是以指令字节的形式存放于程序存储器中的。l 在MCS-51系统中是用在数值前加“#”形式表示的,如果立即数的最高位为 AF英文字符时,该字符前要加“0”,以便使之区别于标号。l 例如指令:l MOV A,#0A0H 或指令:l MOV DPTR,#2000Hl 两指令中的源操作数的寻址方式都是立即寻址。l 3.2.4 3.2.4 寄存器间接寻址方式寄存器间接寻址方式l 寄存器间接寻址是指,指令操作数部分所指定的寄存器中存放的是操作数的地址。l 在下面几种情况下,可以使用该寻址方式在下面几种情况下,可以使用该寻址方式:l (1)访问内部数据存储区的00H7FH单元l
12、 使用当前工作寄存器区的R0、R1作地址指针来间接寻址。l (2)堆栈操作指令PUSH和POPl 使用堆栈指针SP进行间接寻址。l (3)访问外部数据存储区的00H0FFH单元l 使用当前工作寄存器区的R0、R1作地址指针来间接寻址。l (4)访问整个外部数据存储区的0000H0FFFFH单元l 使用数据指针DPTR进行间接寻址。l 例如指令:l MOV R1,#30Hl MOV A,R1 ;源操作数为间接寻址,访问内部RAM30H单元 l 又例如指令:l MOV R1,#30Hl MOVX A,R1 ;源操作数为间接寻址,访问外部RAM30H单元l 3.2.5 3.2.5 变址寻址方式变址寻
13、址方式l 变址寻址是指以程序计数器 PC或数据指针DPTR作为基地址寄存器,以累加器A作为变址寄存器,把两者的内容相加形成16位的操作数的地址。这种寻址方式专用于访问程序存储器中的常数表,不能访问数据存储器。l 例如指令:l MOV A,#7FHl MOV DPTR,#2000Hl MOVC A,A+DPTR ;源操作数寻址方式为变址寻址 l 说明:l (1)变址寻址只能用在MOVC类指令中,该类指令用来从程序存储空间中读取数据。l (2)该程序段的功能是把程序存储器207FH单元的内容送入累加器A。l 3.2.6 3.2.6 相对寻址方式相对寻址方式l 相对寻址以程序计数器 PC的当前值作为
14、基地址,与指令中给定的相对偏移量rel进行相加,把得到的和作为程序的转移地址。这种寻址方式用于相对转移指令中。l 所谓相对转移,是指程序转移目标地址由相对于该指令当前地址的偏移量来决定。l 一般将相对转移指令所在的地址称为源地址,转移后的地址称为目标地址,则有:l 目标地址=源地址+转移指令字节数+偏移量l 在相对转移指令中,偏移量通常以目标地址的标号形式出现。l 例如指令:l JZ LOOP ;操作数为相对寻址 l 此时,计算偏移量的公式为:l 偏移量=目标地址-(源地址+2)l 如果偏移量为负数,那么这条指令执行后程序将转到该指令的前面(低地址方向);l 如果偏移量为正数,那么将转到该指令
15、的后面(高地址方向)。l 在MCS-51指令系统中,偏移量的取值范围是-128+127。l 3.2.7 3.2.7 寻址方式小结寻址方式小结l MCS-51指令系统的不同寻址方式对应不同的存储空间,也可以灵活使用不同的寻址方式访问同一个存储空间,使用时应多加注意。l 表3-1列出了不同寻址方式的作用空间。(见教材P47页)l 数据传送指令的功能是数据传送指令的功能是:把源操作数提供的数据传送给目的操作数所指定的单元,源操作数内容不变。l 它的另外一个功能是,将源操作数和目的操作数所指定的两个单元内容彼此进行交换。l 3.3.1 3.3.1 内部内部RAMRAM和和SFRSFR间的一般传送指令间
16、的一般传送指令l MCS-51系列单片机内部RAM和特殊功能寄存器SFR各存储单元之间的数据传送是通过MOV指令来实现的。l MOV指令在内部RAM和特殊功能寄存器 SFR之间(包含立即数)的数据传送路径如图3-1所示。l 其中,#data表示立即数;3.3 3.3 数据传送指令数据传送指令l Ri中Ri的值为内部数据存储单元的地址;l direct 指向内部数据存储单l 元或特殊功能寄存器;l Rn表示当前工作寄存器区的8l 个工作寄存器R0R7;l Acc代表累加器A。l 1.以累加器A为目的操作数的数据传送指令,见表3-2.(见教材P48页)l 2.以直接地址direct为目的操作数的数
17、据传送指令,见表3-3.(同上)l 3.以寄存器Rn为目的操作数的数据传送指令,见表3-4。(同上)l 4.以Ri为目的操作数的数据传送指令,见表3-5。(见教材P49页)l 5.16位数据传送指令,见表3-6。(同上)图图3-1 MOV3-1 MOV指令的操作功能指令的操作功能 l 说明说明:l (1)上述指令中的 rrr取值为000111,分别对应选定工作寄存器区的8个工作寄存器。l (2)上述指令中的i取值为0或1。分别对应工作寄存器R0和R1。l (3)直接地址到直接地址的数据传送允许把一个端口引脚的状态值读入到内部数据存储单元,或者把内部数据存储单元的内容输出到端口锁存器中,不需要通
18、过累加器或中间寄存器。l 例如:l MOV 20H,90H ;20H(P1)l 该指令的功能为把P1口引脚状态读入到内部RAM20H单元中。l 对于特殊功能寄存器来说,它的直接地址可以用其名称来代替。因此,上面指令也可以写成:l MOV 20H,P1 ;20H(P1)l (4)某些指令的功能是相同的,但指令机器码可能不同。例如:l MOV A,#01H ;A01H,指令为2字节,机器码为:74H,01Hl MOV Acc,01H;A01H,指令为3字节,机器码为:75H,0E0H,01H l 在第二条指令中的Acc表示累加器A的直接地址0E0H。l (5)上述数据传送指令中,以累加器 A为目的
19、操作数的数据传送指令会依据累加器A中“1”的个数的奇偶状态,对程序状态字寄存器 PSW的P标志位重新赋值,其余的都不影响标志位。l 3.3.2 3.3.2 数据交换指令数据交换指令l MCS-51系列单片机指令系统中交换指令共4条,其中字节交换指令3条,半字节交换指令1条。l 字节交换指令的功能是将累加器A与内部RAM中某一个单元的内容相互交换。l 半字节交换指令的功能是将累加器A的低4位与Ri所指出的内部存储单元的低4位相互交换,其指令格式见表3-7。(见教材P50页)l 3.3.3 3.3.3 累加器累加器A A与外部与外部RAMRAM(或外部接口)数据传送指令(或外部接口)数据传送指令l
20、 MCS-51 系列单片机指令系统中,CPU与外部数据存储器的数据传送指令操作码为MOVX,其中X为external(外部)的第二个字母。l 这组指令的功能是在外部数据存储器或扩展I/O口与累加器A之间进行数据传送。其指令格式见表3-8。(见教材P51页)l 说明说明:l (1)在以上4条指令中DPTR的取值范围是:0000H0FFFFH;Ri的取值范围是xx00HxxFFH。l (2)由于MOVX类指令是专访外部数据存储器和外部接口的指令,因此它的操作数地址(DPTR或Ri的值),即外部数据存储器16位地址是由P0口和P2口向外部地址总线发出的。l (3)当执行指令 MOVX A,DPTR和
21、 MOVXDPTR,A时,寄存器 DPH(DPTR的高8位)的内容自动写入 P2口,寄存器DPL(DPTR的低8位)的内容自动写入P0口并锁存。l (4)当执行指令 MOVX A,Ri和MOVXRi,A时,寄存器Ri的内容为操作数地址的低八位,将自动写入P0口并锁存,操作数地址的高八位必须事先通过MOV P2,#data指令写入P2口。l 3.3.4 3.3.4 累加器累加器A A与程序存储器传送指令与程序存储器传送指令l MCS-51 系列单片机指令系统提供了两条累加器A与程序存储器的数据传送指令,这两条指令又称查表指令,操作码采用MOVC形式,指令的功能是将程序存储器中的数据读入累加器A中
22、。l 其指令格式见表3-9。(见教材P51页)l 说明说明:l (1)在上面两条指令中,寄存器DPTR的值、DPTR与累加器A的值的和以及累加器A与PC值的和为程序存储器单元的16位地址。l (2)指令的执行结果是将该地址中的操作数取出来送入累加器A。l (3)前面已经提到,该指令又叫查表指令。l 所谓的查表是指,在程序存储空间中有一个常数表,在查表前将表头地址送入DPTR寄存器,累加器A中存放的是从操作数地址到表头地址的偏移量。l 则指令MOVC A,A+DPTR的执行过程如图3-2所示。l 我们假设从 1200H单元开始存有一个常数表,累加器 A中的内容为34H,DPTR的内容为1200H
23、,程序存储单元1234H单元的内容为 0AAH,则指令的执行结果是累加器A中的值变成0AAH。l (4)第二条指令的基址寄存器为程序计数器PC。l CPU在读取指令时,PC已执行了加1操作,指向下一条指令的第一个字节,所以作基址寄存器时值已经是原PC加1。图图3-2 MOVC A3-2 MOVC A,A+DPTRA+DPTR指令的执行功能指令的执行功能 l 3.3.5 3.3.5 堆栈操作指令堆栈操作指令l MCS-51系列单片机内部RAM中设定的一个遵循“先进后出,后进先出”原则的区域被称为堆栈,在SFR中有一个堆栈指针(8位寄存器),它指向堆栈的栈顶。堆栈技术在 CPU响应中断、调用子程序
24、、中断嵌套或子程序嵌套时用于保存断点和现场数据。l MCS-51系列单片机的堆栈是向上增长的,栈底固定,栈顶浮动。l 有入栈(PUSH指令)和出栈(POP指令)两种操作。l 入栈操作的过程是:先将堆栈指针自动加1,然后数据压入堆栈;l 出栈操作与此相反,先从堆栈中将数据弹出,送给direct单元,然后指针自动减1。l 无论是入栈操作还是出栈操作,其操作对象只能是用direct形式表示的内部数据存储空间地址(00H7FH)或某个特殊功能寄存器。l MCS-51系列单片机堆栈操作指令见表3-10。(见教材P53页)l 3.4.1 3.4.1 加法指令加法指令l 1.1.不带进位加法指令不带进位加法
25、指令l 这组指令完成两个8位二进制数的相加运算,结果存放在累加器A中。l 它们的操作数可以是有符号数也可以是无符号数。l 无符号的操作数以真值的绝对值形式给出,有符号的操作数以真值的补码形式给出。l 其指令格式见表3-11。(见教材P54页)l 说明说明:l (1)在运算过程中,两个操作数是无符号数还是有符号数,是由程序员事先约定的,计算机总是按照二进制补码的规则完成相应的运算。3.4 3.4 算术运算指令算术运算指令l (2)Cy的值反映的是将两操作数作为无符号数运算时有无进位。l (3)OV的值反映的是将两操作数作为有符号数运算时有无溢出。l (4)程序员应对操作数类型做到“心中有数”,并
26、随时查询标志位,以便获得正确的运算结果。l 2.2.带进位加法指令带进位加法指令l 这组指令除了完成两个 8位二进制数的相加运算,还要与进位标志位Cy的值相加,结果存放在累加器A中。l 若Cy=0,则这组指令同ADD指令。l 带进位加法指令主要用在多字节加法运算中,其指令格式见表3-12。l (见教材P55页)l 可以总结出两个字节数的加法运算步骤是:l 1.用加法指令进行低字节的加法运算;l 2.用带进位加法指令进行高字节的加法运算。l 3.4.2 3.4.2 减法指令减法指令l MCS-51系列单片机指令系统的减法只有一组带借位的减法指令,指令操作功能是将累加器 A中的内容减去源操作数中的
27、值或常数并减去进位标志Cy的值,运算结果存入累加器A中。l 其指令格式见表3-13。(见教材P55页)l 说明说明:l (1)减法指令影响Cy、AC、OV以及P标志位。l (2)两个无符号数相减时,Cy=1表示被减数小于减数,需要将累加器A中的值和借位一并考虑才是正确结果。l (3)两个带符号数相减时,OV=0表示没有发生溢出,结果正确;l 若OV=1,表明发生溢出,将导致不正确结果。l (4)在进行单字节或多字节减法的最低位相减时,因为减法指令都是带借位的,因此应先将Cy清零(使用CLR C指令完成)。l 3.4.3 3.4.3 十进制调整指令十进制调整指令l MCS-51系列单片机指令系统
28、中有一条专用于BCD码加法的指令,即十进制调整指令。l 该指令的功能是在两个压缩型 BCD码数据按二进制数相加存入累加器A后,根据 PSW中标志位AC、Cy的状态以及 A中的结果,将A的内容进行“加6调整”,使其转换为BCD码形式。l 指令具体操作过程是指令具体操作过程是:l 若累加器 A的低4位大于9或 AC等于1,则指令对累加器 A的低四位加6,产生低四位正确的 BCD码。在加6调整后,如果低四位向高四位产生进位,并且高四位均为1,则进位标志Cy=1;反之,它不能使Cy=0。l 若累加器 A的高4位大于9或 Cy等于1,则指令对累加器 A的高四位加6,产生高四位正确的 BCD码。在加6调整
29、后,如果最高位产生进位,则进位标志Cy=1;反之,它不能使Cy=0。l Cy=1表示两个BCD码数相加后,和大于或等于100,这对于多字节加法有用,但不影响OV位。l 其指令的格式见表3-14。(见教材P56页)l 说明说明:为了实现BCD码减法运算,用 8位二进制数10011010(9AH)来表示十进制数100(因为9AH经过十进制调整后为00H,Cy=1即100)。l BCD码的模数为9AH,模数减去减数,可以得到减数的补码,所以十进制无符号数的减法运算变为:l 被减数+(9AH-减数)l 源程序:l CLR C ;Cy=0l MOV A,#9AHl SUBB A,31H ;求减数的补码l
30、 ADD A,30Hl DA A ;十进制调整l MOV 32H,A ;差存入32H单元l 3.4.4 3.4.4 加加1 1、减、减1 1指令指令l 加 1指令的功能是把操作数指定单元的内容加1,减1指令的功能是将操作数指定单元的内容减 1。l 除奇偶标志外,两类指令操作结果不影响PSW中的标志位。l 两类指令的格式见表3-15。(见教材P57页)l 3.4.5 3.4.5 乘法指令乘法指令l MCS-51指令系统的乘法指令格式见表3-16。l 乘法指令的功能是将累加器A和寄存器B中的两个8位无符号整数相乘,16位乘积的低8位存入累加器A,高8位存入寄存器B。l 当B的值不等于0时,OV=1
31、,否则OV=0;Cy位的值自动清零;奇偶标志位P的值依据累加器A中“1”的个数决定。l 3.4.6 3.4.6 除法指令除法指令l MCS-51指令系统的除法指令格式见表3-17。(见教材P58页)l 除法指令的功能是将累加器A和寄存器 B中的两个8位无符号整数相除,得到的8位商(整数)存入累加器A,8位余数存入寄存器B。l 当除数 B的值不等于0时,OV位、Cy位的值自动清零;奇偶标志位P的值依据累加器A中“1”的个数决定。l 当除数 B的值等于 0时,OV=1;Cy位的值自动清零,商和余数则无法确定。3.5 3.5 逻辑或操作指令逻辑或操作指令l 3.5.1 3.5.1 逻辑或操作指令逻辑
32、或操作指令l 这组指令的功能是将两个8位二进制数操作数按位进行逻辑“或”运算,结果存放在累加器A中。l 其指令格式见表3-18。(见教材P59页)l 说明说明:l (1)除前4条指令依据累加器A中“1”的个数影响奇偶标志位P的值外,所有指令不影响任何标志。l (2)任意逻辑量(0或1)和1相或,结果为1;和0相或,结果为不变。l 利用这一特点,逻辑或指令常用来组合数据位。即使累加器、内部RAM或特殊功能寄存器的指定位置为1。置位控制字可以是指令中的常数或运行时累加器里的值。l (3)当第2条指令中的直接地址为P0P3端口时,进行的是读操作。即将引脚上的数据读入到CPU内部数据总线。l (4)当
33、第 5、6条指令中的直接地址为 P0P3端口时,进行的是读-修改-写操作。即从锁存器中读取数据经修改后重新写入锁存器,同时又送出引脚。l 3.5.2 3.5.2 逻辑与操作指令逻辑与操作指令l 这组指令的功能是将两个8位二进制数操作数按位进行逻辑“与”运算,结果存放在累加器A中。l 其指令格式见表3-19。(见教材P59页)l 说明说明:l (1)除前4条指令依据累加器A中“1”的个数影响奇偶标志位P的值外,所有指令不影响任何标志。l (2)任意逻辑量(0或1)和 0相与,结果为0,和1相与,结果为不变,利用这一特点,逻辑与指令常用来完成将若干数据位清零(屏蔽这些位),而其余位不变的操作。l
34、(3)与逻辑或指令相同,该类指令也可以对P0P3端口进行的“读操作”或进行“读-修改-写操作”。l 3.5.3 3.5.3 逻辑异或操作指令逻辑异或操作指令l 这组指令的功能是将两个8位二进制数操作数按位进行逻辑“异或”运算,结果存放在累加器A中。其指令格式为见表3-20。(见教材P60页)l 说明说明:l (1)除前4条指令依据累加器A中“1”的个数影响奇偶标志位P的值外,所有指令不影响任何标志。l (2)任意逻辑量(0或1)和1相异或,结果取反,和0相异或,结果为不变,利用这一特点,逻辑异或指令常用来完成将若干数据位取反,而其余位不变的操作。l (3)相同逻辑量(0或1)相异或,结果为0,
35、不同逻辑量相异或,结果为1,利用这一特点可以判断两数是否相等。l (4)与逻辑或指令相同,该类指令也可以对 P0P3端口进行的“读操作”或进行“读-修改-写操作”。l 3.5.4 3.5.4 累加器累加器A A的逻辑操作指令的逻辑操作指令l 这组指令是针对累加器A的单操作数指令,包括对累加器A的清零、取反、循环移位以及半字节交换等操作。l 其指令格式见表3-21。(见教材P61页)l 说明说明:l (1)带进位位循环指令影响 Cy和P标志位;CLR指令影响P标志位;其他指令不影响任何标志。l (2)利用累加器A求反指令,可进行求补操作。l (3)指令 RL A和RR A的功能是将累加器 A的内
36、容循环左移或右移1位;指令RLC A和RRC A 的功能是将累加器 A的内容连同 Cy位循环左移或右移1位。l (4)指令 RLC A可以将累加器 A中的内容扩大 2倍,但扩大之后不能超过255。l (5)指令 RRC A可以将累加器 A中的内容除以2。l (6)SWAP 指令主要用于有关 BCD码数的转换操作中。3.6 3.6 控制转移指令控制转移指令l 3.6.1 3.6.1 无条件转移指令无条件转移指令l 无条件转移指令的功能是无条件转移指令的功能是:当程序执行该指令时将无条件的转移到该指令所提供的地址。l 这类指令分为这类指令分为:绝对转移指令AJMP、长转移指令LJMP、相对转移指令
37、SJMP和间接转移指令JMP。l 最后一条又称为散转指令。所有无条件转移指令均不影响标志位。l 无条件转移指令的格式见表3-22。(见教材P62页)l 1.1.绝对无条件转移指令绝对无条件转移指令l 绝对转移指令AJMP中提供11位地址,在使用绝对转移类指令时,要求转移的目标地址必须和AJMP指令的下一条指令的首字节在同一个2K字节存储区内,即PC+2后的值与目标地址的高 5位a15a11 应该相同(PC为AJMP指令首字节单元的指针)。l 2.2.长转移指令长转移指令l 长转移指令的功能是把指令给出的16位字地址直接送给程序计数器PC。程序可以转到程序存储器 0000H0FFFFH范围的任何
38、一个单元。在汇编源程序中,目标操作数addr16一般以目标地址的标号形式给出。长转移指令是三字节指令。l 3.3.相对转移指令相对转移指令l 相对转移指令给出的 rel为转移偏移量,它是一个以补码形式表示的有符号数。指令转移目的地址为当前指令的下一条指令的地址与偏移量rel的和。即:l 转移目的地址 PC=PC 当前值+2+rell 说明说明:l (1)该指令的转移范围是:以PC+2为基准,向前128字节,向后127字节范围。l (2)SJMP指令中也可以直接给出转移地址(4位16进制数)或给出标号地址。例如指令 SJMP ADR。此类指令在进行手工汇编时需算出rel值。l 偏移量=目标地址-
39、(源地址+2)l (3)MCS-51系列指令系统中没有暂停指令,可以使用SJMP指令实现动态停机。例如:l HERE:SJMP HEREl 或写成:SJMP ;表示本指令首字节所在单元的地址。l 4.4.间接转移指令间接转移指令l 间接转移指令的目标地址,是由数据指针 DPTR的内容加上累加器A的内容形成的,A和DPTR的内容均为无符号数。l 本指令可以在程序运行过程中动态决定转移的目标地址,是一条极其有用的多分支选择转移指令,又被称为散转指令。l 下面一段程序是 JMPA+DPTR 指令散转功能的应用举例。l CLR Cl RLC A ;累加器A的内容乘2l MOV DPTR,#JPTAB
40、;转移指令表的首地址送数据指针l l JMP A+DPTR ;根据累加器A的内容选择并l ;执行转移指令表中的转移指令l JPTAB:AJMP CCS0l AJMP CCS1l AJMP CCS2 l 说明说明:l 在此程序中,以标号JPTAB为首地址建立一张转移地址表。l 表中有3个绝对转移指令,它们的目标地址分别为CCS0、CCS1、CCS2。l JMPA+DPTR指令会依据程序执行前累加器A的内容实现散转功能。l 在程序开头对累加器进行乘2运算的原因是AJMP指令为双字节。l 3.6.2 3.6.2 空操作指令空操作指令l 空操作指令是一条只有操作码没有操作数的单字节指令,该指令执行后程
41、序计数器PC的值自动加1指向它的下一条指令。除此之外,NOP指令不进行任何其他操作,相当于跳过一个字节。l 空操作指令均不影响标志位,指令格式见表3-23。(见教材P64页)l NOP NOP指令的主要用途有指令的主要用途有:l (1)可以利用它来进行延时或等待。该指令每执行一次,就要花费一个机器周期的执行时间。l (2)可以利用它来调试程序,例如要删除某条指令,只需用 NOP指令取代即可。l (3)在程序中某些地方故意安排一些 NOP指令,为以后添加新指令预留存储空间。l 3.6.3 3.6.3 条件转移指令条件转移指令l 条件转移指令是指当条件满足时程序才转移,而条件不满足时程序继续执行下
42、一条指令。l 这类指令包括这类指令包括:判累加器判零条件转移指令、比较不等转移指令以及减1非零转移等。l 1.1.判零条件转移指令判零条件转移指令l 这类指令以累加器 A的内容是否为0作为指令转移的条件,累加器A的值由以前指令执行结果确定,指令转移范围为-128+127。l 该类指令格式见表3-24。(见教材P65页)l 说明说明:l (1)第一条指令的执行过程是该指令执行前累加器A的值为0,程序转移,否则程序顺序执行下一条指令。l (2)第二条指令的执行过程是该指令执行前累加器A的值不为0,程序转移,否则程序顺序执行下一条指令。l (3)指令中的偏移量通常以目标地址的标号形式出现。l 例如指
43、令:JZ LOOPl 表示当累加器A的值为0时程序转向LOOP地址,否则顺序执行程序。l 2.2.比较不等转移指令比较不等转移指令l 这是一类3个操作数、3个字节的指令,执行时首先对两个操作数进行比较,当两个数不相等时,跳转到偏移量指定的地址;若相等,则顺序执行下一条指令。执行指令后,标志位Cy还会依据操作数比较结果重新被赋值。l 该类指令的格式见表3-25。(见教材P65页)l 说明说明:l (1)利用这组指令可以比较两个无符号数大小。l (2)这组指令可以用作控制循环结束的条件。l (3)指令转移范围为-128+127。l 3.3.减减1 1非零转移指令非零转移指令l 这组指令除了附带转移
44、条件外,其他功能与SJMP指令基本相同。l 该类指令格式见表3-26。(见教材P66页)l 说明说明:l (1)该指令可用于循环次数已知的循环过程:指定一个工作寄存器或内部数据存储单元为循环计数器,对计数器赋初值后每完成一次循环,计数器减1,直到计数器减到0时循环结束。l (2)利用该指令可以进行软件延时。l 3.6.4 3.6.4 子程序调用和返回指令子程序调用和返回指令l MCS-51系列指令系统中子程序调用指令的功能是,一方面把程序转向子程序的起始指令,同时又把断点地址(它的下一条指令地址)压入堆栈进行保护。l 返回指令往往位于子程序的末尾,作用是从堆栈中弹出调用指令保存的断点地址送入指
45、令计数器PC,具体执行过程如图3-3所示。l 此类指令不影响标志位。l 这类指令的格式见表3-27。(见教材P67页)l 1.1.绝对调用指令绝对调用指令l 绝对调用指令 ACALL中提供11位地址,和绝对转移指令AJMP一样,要求子程序的起始地址必须和 ACALL指令的下一条指令的首字节(断点地址)在同一个2K字节存储区内。l 例如:指令LOOP:ACALL addr11。图图3-3 3-3 子程序的调用和子程序的调用和返回流程示意图返回流程示意图 l 如果addr11=00100000000,程序转向何处将取决于标号LOOP,若标号LOOP地址为1030H,则执行指令后将转至1100H处执
46、行子程序,压入堆栈的断点地址为1032H;若标号LOOP地址为07FEH,则执行指令后将转至0900H处执行子程序,压入堆栈的断点地址为0800H。l 2.2.长调用指令长调用指令l 长调用指令提供16位目标地址,子程序可以设置在64KB程序存储器的任何一个单元。l 3.3.子程序返回指令和中断返回指令子程序返回指令和中断返回指令l 这两条指令的功能基本相同,但不能混用。l RET 指令表明从子程序返回,执行指令的结果是从堆栈中弹出断点地址,装入程序计数器PC。l RETI为中断服务程序返回指令,除了可以返回断点地址外,还要清除中断响应时设置的优先级状态触发器,使其他中断申请能得到响应。l 具
47、体内容见中断系统1章。l 子程序的断点入栈示意图见图3-4。图图3-4 3-4 子程序的断点入栈示意图子程序的断点入栈示意图 3.7 3.7 位处理指令位处理指令l MCS-51 系列单片机内部的位处理器有自己的位运算器、位累加器(借进位标志Cy)和位存储器(位寻址区中的各位),使用它能完成丰富的以位变量为处理对象的位处理指令。l 位处理指令又称为布尔操作指令,包括逻辑操作、传送操作、状态控制以及控制转移等指令。l 位操作指令的操作对象是内部数据存储区的20H2FH单元中的连续128位(位地址为 00H7FH),以及特殊功能寄存器区可以按位寻址的各位。这些操作对象在指令中可以按以下方式指定:l
48、 直接位地址方式,例如3BH、0E0H。l 字节地址加后缀位序方式,例如21H.0、20H.7。l 位符号方式,例如C(Cy)、AC、RS0。l 以寄存器名加后缀位序方式,例如 PSW.0、Acc.2、P1.7,注意不能写成A.2。l 以宏代换方式,如SUB0bit RS1。其中 bit为伪指令,用来把标志位RS1更名为SUB0。伪指令将在下1章中介绍。l 3.7.1 3.7.1 位逻辑操作指令位逻辑操作指令l 位逻辑操作指令有逻辑“或”和逻辑“与”两种操作,以位累加器C和位地址为操作数,运算结果存入C中。l 除影响进位标志外,指令执行后对其他标志位无影响。l 其指令格式见表3-28。(见教材
49、P69页)l 说明说明:l (1)位逻辑运算指令中没有逻辑异或指令,但可以由若干条位操作指令来实现异或操作。l (2)指令中源操作数前的“/”表示将该位内容取反后再参与操作,但该位内容不变。l 3.7.2 3.7.2 位数据传送指令位数据传送指令l MCS-51指令系统不提供在可寻址位之间直接进行传送的指令。l 故位数据传送必须通过位累加器C进行,其中仅以位累加器C为目的操作数的指令影响C标志位。l 其指令格式见表3-29。(见教材P69页)l 3.7.3 3.7.3 位状态控制指令位状态控制指令l 位状态控制指令有置1、清零和取反三种操作,操作数可以是位累加器C或者是位单元地址,其中仅以位累加器C为操作数的指令影响C标志位。l 其指令格式见表3-30。(见教材P70页)l 3.7.4 3.7.4 位控制转移指令位控制转移指令l 位条件转移指令是根据某一位的值来决定是否转移的指令。l 其转移过程与SJMP指令基本相同,包括位值为1转移和位值为0转移两种指令形式。l 其指令格式见表3-31。(见教材P70页)l 说明说明:l (1)前两条指令常与CJNE指令一起使用,可以判断两数的大小,形成大于、等于、小于三个分支。l (2)指令转移范围为以当前地址为准,向前128字节,向后127字节。