第2章MCS-51单片机应用教程.ppt

上传人:本田雅阁 文档编号:2908659 上传时间:2019-06-04 格式:PPT 页数:135 大小:471.52KB
返回 下载 相关 举报
第2章MCS-51单片机应用教程.ppt_第1页
第1页 / 共135页
第2章MCS-51单片机应用教程.ppt_第2页
第2页 / 共135页
第2章MCS-51单片机应用教程.ppt_第3页
第3页 / 共135页
第2章MCS-51单片机应用教程.ppt_第4页
第4页 / 共135页
第2章MCS-51单片机应用教程.ppt_第5页
第5页 / 共135页
点击查看更多>>
资源描述

《第2章MCS-51单片机应用教程.ppt》由会员分享,可在线阅读,更多相关《第2章MCS-51单片机应用教程.ppt(135页珍藏版)》请在三一文库上搜索。

1、第2章 单片机的指令系统,2.1 指令系统概述 2.2 寻址方式 2.3 指令功能介绍 2.4 小结 习题,通过对本章的学习,读者应具备以下能力: 熟练掌握不同寻址方式以及汇编指令的用法 掌握伪指令的使用以及汇编语言程序的完整格式 掌握算术运算类指令对PSW各标志位的影响 理解汇编语言程序的执行过程,本章学习目标,一种计算机所有指令的集合,称为该计算机的指令系统。它是表征计算机性能的重要标志。各类计算机都有专用的指令系统。,2.1 指令系统概述,MCS-51单片机共有111条指令,有几种不同的分类方法。 (1) 按指令功能分类,如图2-1所示。,2.1.1 指令分类,图2-1 按指令功能分类图

2、,(2) 按指令字长分类,如图2-2所示。 图2-2按指令字长分类图,(3) 按指令执行时间分类,如图2-3所示。 图2-3 按指令执行时间分类图,用MCS-51单片机汇编语言表示的指令格式如下: 标号: 操作码目的操作数,源操作数; 注释 一条汇编语句是由标号、操作码、操作数和注释部分组成的,其中方括号中的部分是可选项。 例如: AA: ADD A, #10H ;执行加法操作 AA: 为标号,ADD为操作码,A与10H为操作数,“;”后面为注释部分。,2.1.2 指令格式,用汇编语言编写程序时,应注意以下几个问题: (1) 标号 标号是语句地址的标志符号。有关标号的规定如下: 标号由18个字

3、母或数字组成,可以使用一个下划线符号“_”。 第一个字符必须是字母。 指令助记符或系统中保留使用的字符串不能作为标号。 标号后面必须跟一个冒号。 一条语句可以有标号,也可以没有标号。标号的有无取决于本程序中其他语句是否需要访问这条语句。,以下是合法的标号 以下是不合法的标号 LOOP1: 5LOOP: (第一个字符是 数字) START: A*5: (“*”不能在标号中出 现) Q4_: ADD: (指令助记符) SSS: START(无冒号) L123: L12345678: (超过8个字符),(2) 操作码 规定语句执行的操作。操作码是以指令助记符或伪指令助记符表示的。操作码是汇编指令中惟

4、一不能空缺的部分。,(3) 操作数 用于给指令的操作提供数据或地址。在一条指令中,操作数可以为1项、2项或3项,各操作数之间用逗号隔开,操作数也可能空缺。 例如: LOOP: INC A ;1项操作数 ADD A,#50H ;2项操作数 CJNE A,#5,LOOP ;3项操作数 RET ;无操作数,(4) 注释 注释不属于语句的功能部分,它只对语句进行解释说明。在程序汇编时注释字段不被汇编,可有可无,只起说明作用。注释内容以“;”开头。 (5) 分隔符 分隔符用于分割语句的各个部分,以便于区分。冒号“: ”用于标号之后;空格用于操作码和操作数之间;逗号“,”用于操作数之间;分号“;”用于注释

5、之前。,为节省存储空间,MCS-51单片机采用变字长指令方式。按8位二进制数为一个字节,指令字长有单字节、双字节和三字节3种,在存储单元中分别占13个单元。 指令周期是指执行一条指令所需要的时间。指令字节数越多,所占存储单元则越多,但指令周期并不与指令所占字节数成比例。,2.1.3 指令字长和指令周期,寻址方式是指CPU寻找操作数或操作数地址的方式。计算机执行程序的过程是不断地寻找操作数并进行操作的过程。MCS-51单片机共有7种寻址方式,分述如下。,2.2 寻址方式,1. 寻址范围 指令中直接给出操作数所在的单元地址,它的寻址范围为单片机内部RAM。 (1) 内部RAM低128单元。在指令中

6、直接以单元地址形式给出,地址范围00H7FH; (2) 特殊功能寄存器SFR。直接寻址是SFR惟一的一种寻址方式。SFR可以以单元地址给出,也可以用寄存器符号形式给出(A、AB、DPTR除外)。,2.2.1 直接寻址,2. 使用注意事项 (1) 寻址特殊功能寄存器SFR时,可以用直接地址,也可以用寄存器名。 例如: MOV A, 0D0H ;A(D0H) MOV A, PSW ;A(PSW) 这两条指令汇编后机器码完全一样,均为E5D0H,其中D0H为程序状态字PSW寄存器的物理地址。物理地址D0前要加0(凡以字母AF开头的十六进制数均需加前导0)。,(2) 在MCS-51单片机指令系统中,累

7、加器A有三种不同的表达方式,即A、ACC和E0H,分属不同的寻址方式,但指令的执行结果完全相同。 例如: INC A ;寄存器寻址方式 INC ACC ;直接寻址方式 INC 0E0H ;直接寻址方式,操作数直接由指令给出,通常紧跟指令操作码之后的字节是操作数,该操作数被称为立即数。一般立即数可以是8位二进制数,也可以是16位二进制数。,2.2.2 立即寻址,例如: MOV A,#7AH MOV DPTR,#1234H 注意: 立即数前加“#”号,以区别直接地址。 例如: MOV A, #30H ; A 30H MOV A, 30H ; A(30H) 第一条指令是把立即数30H送累加器A,而第

8、二条指令把30H单元的内容送累加器A。,这种寻址方式中,操作数在寄存器中,确定了寄存器,就得到了操作数。可用于寄存器寻址的寄存器有: (1) 四组工作寄存器R0R7共32个工作寄存器。由程序状态字PSW中的RS1、RS0两位的状态进行当前工作寄存器组的选择。 (2) 部分特殊功能寄存器有A、AB、DPTR和Cy。 例如: MOV A, R3 ;当前R3中的内容送累加器A。,2.2.3 寄存器寻址,作为被寻找的操作数。用来存放操作数地址的寄存器称为指针。这种寻址方式称为寄存器间接寻址方式。 MCS-51单片机用于间接寻址的寄存器有R0、R1、堆栈指针SP以及数据指针DPTR。,2.2.4 寄存器

9、间接寻址,1. 寻址范围 (1) 内部RAM低128单元,地址范围00H7FH,用Ri(i = 0,1)作为间接寻址寄存器。 (2) 片外RAM的64KB,地址范围0000HFFFFH,用DPTR作为间接寻址寄存器。也可用Ri作为间接寻址寄存器,此时用P2口指示高8位地址,Ri指示低8位地址,可寻址片外RAM(I/O口)64KB区域。 例如: 设(R1)=60H,(60H)=50H MOV A, R1 ;执行结果(A)=50H,2. 使用注意事项 (1) 为区别寄存器寻址方式,间接寻址寄存器前加。 (2) 寄存器间接寻址方式不能用于对特殊功能寄存器SFR的寻址。 例如: MOV R0, #0F

10、0H MOV A, R0 以上指令不能执行,因为0F0H为特殊功能寄存器B的物理地址,而对于特殊功能寄存器,不能对其进行间接寻址,只能直接寻址。 (3) 栈操作指令也是间接寻址方式,它以堆栈指针SP作为间接寻址寄存器。,MCS-51单片机的变址寻址是以数据指针DPTR或程序计数器PC作为基址寄存器,以累加器A作为变址寄存器,并以两者内容相加形成新的16位地址作为操作数地址,再寻址该地址,读取数据。 例如: MOVC A, A+PC 设执行指令之前(A)= 50H,要取的操作数为37H,该指令所在地址为3F00H单元。,2.2.5 变址寻址,指令功能是把该指令当前地址PC值与A累加器内容相加形成

11、操作码地址3F51H,3F51H中的内容37H送A累加器。(当前地址为取指后的PC值,本例PC当前值为3F01H。)指令执行过程如图2-4所示。,图2-4 变址寻址示意图,对MCS-51单片机指令系统变址寻址方式的几点说明: (1) 变址寻址方式只能对程序存储器进行寻址,因此只能用于读取数据,而不能用于存放数据,它主要用于查表性质的访问。 (2) 变址寻址指令只有3条: MOVC A,A+PC MOVC A,A+DPTR JMP A+DPTR 前两条指令是在程序存储器中寻找操作数,指令执行完毕PC当前值不变。后一条指令是要获得程序的跳转地址,指令执行完毕PC值改变。,相对寻址用于访问程序存储器

12、,只出现在转移指令中。“寻址”不是寻找操作数的地址,而是寻找程序跳转地址,它以PC的当前值加上指令中给出的相对偏移量(rel)形成转移地址。相对偏移量(rel)是一个带符号的8位二进制数,以补码形式出现。所以程序的转移范围为以PC当前值为中心,介于-128+127之间。,2.2.6 相对寻址,例如: JC rel 设rel=85H,Cy=1,这是一条以Cy状态为条件的转移指令,因为该指令为两字节指令,CPU取出指令的第二个字节时,PC当前值为原PC值+2。由于Cy=1,因此程序转向(PC)+2+rel单元去执行。注意此时rel=85H为负数。 若转移指令放在2002H单元,取出指令后PC指向2

13、004H单元,新的转移地址(PC)+rel=2004H+85H=2004H+FF85H(16位二进制补码)=1F89H,经补码运算后,形成跳转地址1F89H。指令执行过程如图2-5所示。,图2-5 相对寻址(JC 85H)示意图,MCS-51单片机设有独立的位处理器,又称为布尔处理器,可对位地址空间的211个位地址进行运算和传送操作。,2.2.7 位寻址,位寻址范围 (1) 内部RAM的位寻址区,共16个单元的128位,单元地址为20H2FH,位地址为00H7FH,位地址的表示方法可以用直接位地址或单元地址加位的表示方法。 例如: MOV C, 7AH 或 MOV C, 2FH.2 此例中,7

14、AH与2FH.2表示的是同一个位地址(见表1-3,书9页)。,(2) 特殊功能寄存器SFR中可供位寻址的专用寄存器共11个,其中有83位可供位寻址,这些位地址在指令中有4种表达方式。 直接使用位地址: MOV C,0D6H 位名称表示法: MOV C,AC 单元地址加位的表示法: MOV C,0D0H.6 专用寄存器符号加位的表示法: MOV C,PSW.6,为了使读者更好地理解寻址方式,7种寻址方式作用范围见表2-1。(见书24页) 以上对于寻址方式举例中,多是针对源操作数的,实际上目的操作数也有寻址问题。 源操作数为间接寻址方式,目的操作数为直接寻址方式。但总的来说源操作数寻址方式多,目的

15、操作数寻址方式较少。源操作数有立即寻址、直接寻址、寄存器寻址、间接寻址、变址寻址和位寻址6种寻址方式。目的操作数有直接寻址、寄存器寻址、间接寻址和位寻址4种寻址方式。,2.2.8 寻址方式小结,综上所述,MCS-51单片机的编址方式有两个突出的特点: 一是内部数据存储器与内部I/O口统一编址;二是外部数据存储器与外部I/O口也是统一编址。这样对I/O口的操作就和对数据存储器的操作一样,对于内部数据存储器以直接寻址方式的一切操作,对内部I/O口同样适用。,在介绍指令功能之前,先把指令中使用的一些符号的意义做简要说明,见表2-2。(见书24页) 下面按指令功能分类介绍MCS-51单片机的指令。,2

16、.3 指令功能介绍,数据传送类指令是指令系统中使用最频繁的指令,主要用于数据的保存及交换等场合。按其操作方式又可分为数据传送、数据交换和栈操作。,2.3.1 数据传送类指令,1. 内部数据传送指令MOV 指令格式MOV, 这类指令的源操作数和目的操作数都在单片机内部。可以是片内RAM地址,也可以是特殊功能寄存器SFR的地址(立即数除外)。 指令功能是把源操作数指定的字节变量复制到目的操作数所指定的单元或寄存器中,源字节不变。,(1) 立即数传送指令指令功能是把源操作数送指定单元或寄存器,源操作数为立即数。 MOV A,#data ;A data MOV Rn,#data ;Rn data, n

17、=07 MOV Ri,#data ;(Ri) data,i=0,1 MOV direct,#data ;direct data MOV DPTR,#data16 ;DPTR data16,(2) 内部数据存储器(Rn、内部RAM、SFR)与累加器A之间传送数据。 MOV A,Rn ;A(Rn), n=07 MOV Rn,A ;Rn(A) MOV A,Ri ; A(Ri), i=01 MOV Ri,A ; (Ri)(A) MOV A,direct ;A(direct) MOV direct,A ;direct(A),(3) 内部RAM中Rn、SFR与片内RAM之间的数据传送。 MOV direc

18、t,Rn ;direct(Rn) MOV Rn, direct ;Rn (direct ) MOV direct, Ri ;direct(Ri) MOV Ri, direct ;(Ri)(direct) MOV direct2,direct1 ;direct2(direct1),例2-1 设内部RAM中(30H)40H,(40H)10H,P1口作输入口,(P1)0CAH,程序及执行后的结果如下: MOV R0,#30H ;单元地址30H送R0中 MOV A,R0 ;R0间接寻址,将30H单元内容 送A MOV R1,A ;A送R1 MOV B,R1 ;R1间接寻址,将40H单元内容 送B MO

19、V R1,P 1 ;将P1内容送40H单元 MOV P2,P1 ;将P1内容送P2 执行结果: (R0)=30H,(R1)=40H,(A)=40H, (B)=10H,(P1)=0CAH, (40H)=0CAH,(P2)=0CAH,2. 外部数据存储器(或I/O口)的读写指令MOVX 这类指令用于访问片外RAM或扩展的I/O口。 (1) 用DPTR进行间址寻址的指令 MOVX A,DPTR ;A(DPTR) MOVX DPTR,A ;(DPTR)(A) DPTR为16位数据指针,该指令可寻址外部RAM 64KB范围(0000H0FFFH)。地址低8位由P0口输出,地址高8位由P2口输出,数据通过

20、P0口读/写。 (2) 用Ri进行间址寻址的指令 MOVX A,Ri ;A(Ri) MOVX Ri,A ;(Ri)(A),指令可寻址范围 若外部扩展RAM小于等于256个单元,则用Ri间接寻址进行数据传送,8位地址线足够使用。 若外部扩展较大的RAM区域,需用P2口输出高8位地址,则用Ri表示低8位地址,P0口分时作低8位地址线和数据线,P2口应事先预置。若设计循环程序,则Ri被加到0或减到0时必须考虑对P2口高8位地址进位或借位的关系。,例如,若外部RAM中,(20FFH)=30H,(2100H)=15H 执行: MOV DPTR,#20FFH INC DPTR MOV A,DPTR 结果:

21、 外部RAM中2100H单元内容送A,(A)=15H,执行: MOV P2,#20H MOV R0,#0FFH INC R0 MOVX A, R0 结果: 外部RAM中2000H单元内容送A,而不是2100H单元内容送A。,例2-2 把片外RAM的70H单元中的一个数X,送到片外RAM的1010H单元。 程序如下: MOV P2,00H MOV R0,70H MOVX A,R0 MOV DPTR,1010H MOVX DPTR,A 注意: 外部RAM之间不能直接传送数据,必须通过累加器A传送。,3. 程序存储器读指令MOVC MOVC A,A+DPTR ;A(A)+ (DPTR) MOVC A

22、,A+PC ;A(A)+ (PC) 指令功能: 把累加器A作为变址寄存器,将其中的内容与基址寄存器(DPTR、PC)的内容相加,得到程序存储器某单元的地址,再把该地址单元中的内容送累加器A。指令执行后,不改变基址寄存器内容。,这两条指令主要用于查表,即完成从程序存储器读取数据的功能。但由于两者使用的基址寄存器不同,因此适用范围也不同。 (1) 第一条指令以DPTR作为基址寄存器,查表时DPTR用于存放表格的起始地址。由于用户可以很方便地通过16位数据传送指令给DPTR赋值,因此该指令适用范围较为广泛,表格常数可以设置在64KB程序存储器中的任何位置。 (2) 第二条指令以PC作为基址寄存器,由

23、于A为8位无符号数,这就使得该指令查表范围为以PC当前值开始后的256个地址范围。,例2-3 已知累加器A中有一个09范围内的数,用以上查表指令编出能查出该数平方值的程序。设平方表表头地址为2000H。 (1) 采用DPTR作为基址寄存器 MOV DPTR,#2000H MOVC A,A+DPTR 2000H DB 0,1,4,9,16 DB 25,36,49,64,81 若原(A)2,查表得4并存于A中。,(2) 采用PC作为基址寄存器 ORG 1FFBH 1FFBH ADD A, #data ;加修正量 1FFDH MOVC A,A+PC ;查表 1FFEH SJMP ;停机 2000H

24、DB 0 2001H DB 1 2002H DB 4 2009H DB 81 END,查表指令所在单元为1FFDH,取指令后的PC当前值为1FFEH。若A不加修正量调整,将出现查表错误。修正量=表头首地址PC当前值=2000H1FFEH=02H。所以data=02H(SJMP指令2字节)。由于A为8位无符号数,因此查表指令和被查表格通常在同一页内(页内地址00HFFH)。,4. 堆栈操作指令(PUSH、POP) 堆栈操作指令共2条。压栈指令用于保护片内某个单元的内容,出栈指令用于恢复片内某个单元的内容。 PUSH direct ;SP(SP)+1,(SP)(direct) POP direct

25、 ;direct(SP),SP(SP)1,堆栈中的数据是“后进先出”的方式,由堆栈指针SP自动跟踪栈顶地址。单片机堆栈编址采用向上生成方式,即栈底占用较低地址,栈顶占用较高地址。第一条指令称为压栈指令,压栈过程是先执行(SP)+1 SP,使指针指向新的栈顶单元。然后把直接地址单元的内容压入SP所指示的单元中。压栈指令将改变堆栈区中的数据。第二条指令称为出栈指令,出栈过程是先将栈顶内容弹出到直接寻址单元,然后执行(SP)1SP,形成新的栈顶地址。出栈指令不会改变堆栈区中的数据。,例2-4 设(30H)=X,(40H)=Y,试用堆栈实现30H和40H单元中的数据交换。 解: 堆栈区是片内RAM的一

26、个数据区,进栈和出栈的数据符合“后进先出”的原则。 MOV SP,#50H ;设栈顶 PUSH 40H ;51H(40H),Y压入51H单元 PUSH 30H ;52H(30H),X压入52H单元 POP 40H ;40H(52H),X弹到40H POP 30H ;30H(51H),Y弹到30H 本例压栈过程如图2-6(a)所示,出栈过程如图2-6(b)所示。,图2-6 例2-4堆栈变化示意图,5. 数据交换指令 (1) 整字节交换指令 XCH A,Rn XCH A,Ri XCH A,direct 以上3条指令把A累加器内容与内部RAM及SFR中的内容互相交换,影响P标志。 例如,若(R0)=

27、20H,(A)=3FH,(20H)=75H,执行指令XCH A, R0 执行结果(A)=75H,(20H)=3FH,(R0)=20H,(2) 低半字节交换指令 XCHD A, Ri A累加器低4位与片内RAM某单元的低4位交换,高4位不变。 (3) 累加器高低半字节交换指令 SWAP A 将累加器A中的高4位与低4位内容互换,不影响标志位。,例2-5 已知外部RAM 2020H单元中有一个数X,内部RAM 20H单元有一个数Y,试编写X、Y交换存储地址的程序。 程序如下: MOV P2,#20H MOV R1,#20H MOVX A,R1 XCH A,R1 MOVX R1,A,例2-6 已知片

28、内50H单元中有一个09的数,试编程把它变为相应的ASCII码。因为09的ASCII码为3039H,因此程序编写如下: MOV R0,#50H MOV A,#30H XCHD A,R0 MOV R0,A,算术运算类指令可以完成加、减、乘、除四则运算以及增量、减量和二十进制调整操作。这类指令直接支持8位无符号数操作,借助溢出标志可对带符号数进行补码运算。算术运算指令执行结果将影响程序状态字PSW,具体影响见表2-3。(见书30页),2.3.2 算术运算类指令,1. 加法指令 (1) 不带进位的加法指令 ADD A, Rn ;A(A)+(Rn) ADD A, direct ;A(A)+(direc

29、t) ADD A,Ri ;A(A)+(Ri) ADD A,#data ;A(A)+data,上述指令,把源字节变量与累加器A的内容相加,结果保存在累加器A中。使用中应注意以下问题: 参加运算的两个操作数是8位二进制数,操作结果也是8位二进制数,且运算对PSW中所有标志位都产生影响。 用户可以根据需要把参加运算的两个操作数看成无符号数(0255),也可以把它们看作是带符号数。若看作带符号数,则通常采用补码形式(-128+127)。例如,若把二进制数10011010B看作无符号数,则该数的十进制值为154;若把它看作带符号数,则它的十进制值为-102。, 无符号数运算时,要判断运算结果是否超出范围

30、(0255),可以看进位标志位CY。若CY=1则表示运算结果大于255,若CY=0则表示运算结果小于等于255。带符号数运算时,要判断运算结果是否超出范围(-128+127),可以看溢出标志位OV。若OV=1表示溢出,OV=0则表示无溢出。OV=C7C6,其中C7为最高位进位位,C6为次高位进位位。注意: 只有带符号数运算才有溢出问题。,例2-7 试分析8051执行如下指令后,累加器A和PSW各标志位的变化状况。 MOV A,#0CFH ADD A,#0A5H 解答见书31页。 执行结果: (A)=74H,(PSW)=0C4H 若为无符号数运算,则Cy=1表示结果超出(0255)。若为带符号数

31、运算,则(-49)+(-91)=-140超出(-128+127),OV=1溢出。,(2) 带进位加法指令带进位加法运算指令常用于多字节加法运算。 ADDC A,Rn ;A(A)+(Rn)+ Cy ADDC A,direct ;A(A)+(direct)+ Cy ADDC A, Ri ;A(A)+(Ri)+ Cy ADDC A, #data ;A(A)+data+Cy 这4条带进位的加法指令将累加器A的内容加当前Cy标志位内容,再加源操作数,将和存于累加器A中。运算结果将影响标志Cy、AC、OV、P。,例2-8 设(A)=0AAH,(R0)=55H,Cy=1 执行指令 ADDC A,R0 则使(

32、A)=00H(PSW)=0C0H。,2. 带借位减法指令 SUBB A, Rn ; A(A)(Rn) Cy SUBB A, direct ; A(A)( direct)Cy SUBB A, Ri ; A(A) (Ri)Cy SUBB A, #data ; A(A)data Cy 以上4条减法指令执行过程与带进位加法指令相似,只是把加操作改为减操作即可。,例2-9 (A)=76H,立即数为C5H,(Cy)=0,求二者相减结果。 程序为: SUBB A,#0C5H OV=C7C6=10=1,有溢出,运算结果为177 +127,(A)=0B1H,(PSW)=84H,3. 加1和减1指令 (1) 加1

33、指令加1指令又称增量指令。 INC A ;A(A)+1 INC Rn ;Rn(Rn)+1 INC direct ;direct(direct)+1 INC Ri ;(Ri)(Ri)+1 INC DPTR ;DPTR(DPTR)+1,(2) 减1指令 DEC A ;A(A)1 DEC Rn ;Rn(Rn)1 DEC Ri ;(Ri)(Ri)1 DEC direct ;direct(direct)1 除了INC A和DEC A指令影响PSW的P标志位外,其他几条指令不影响任何标志位。,4. 乘法指令 MUL AB 指令功能是把累加器A和寄存器B中两个8位无符号二进制数相乘,积的高8位存在B寄存器中

34、,积的低8位存在累加器A中。运算结果将对Cy、OV、P标志位产生如下影响: (1) 进位标志位Cy总是清“0”。 (2) P标志仍为A累加器的奇偶校验位。 (3) 当积大于255(B中的内容不为0)时,OV=1,否则OV=0。,5. 除法指令 DIV AB 该指令把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得商存在A中,余数存在B中。对标志位的影响如下: (1) 对Cy和P标志的影响与乘法时相同。 (2) 当除数为0时,除法没有意义,0V=1,否则OV=0。,6. 二-十进制调整指令 DA A ;若AC=1或A309,则A(A) +06H ;若Cy =1或A749,则A(A)

35、 +60H 该指令用于压缩BCD码加法运算的十进制调整。使用该指令时应注意以下几点: (1) 本指令使用时跟在ADD或ADDC指令之后。 (2) 不能用DA指令对BCD码减法操作进行直接调整。 (3) 本指令不影响溢出标志位OV。 (4) 借助标志位可实现多位BCD数加法结果的调整。,例2-10 编写完成78+93的BCD加法的程序,并对调整过程进行分析。 解: 二进制加法和十进制调整过程见书33页。 相应BCD加法程序为: ORG 3000H MOV A,#78H ;A 78H ADD A,#93H ;A 78H+93H=0BH DA A SJMP END 得出结果(A)=71H,考虑进位标

36、志(Cy)=1,操作结果为171。,例2-11 利用DA指令作十进制减法调整。将两个用压缩BCD码表示的十进制数相减,借位标志存入C累加器。设20H、21H、22H分别存放被减数、减数和差。 解: 由于DA指令不能直接用于减法操作的调整,因此采用对减数求补后再与被减数相加,然后再进行DA调整的方法实现。两位BCD码的模为102 ,其机器数表示为9AH。,ORG 2000H N1 DATA 20H CLR C ;(Cy) 0 MOV A,#9AH ;(A)两位BCD的模102 SUBB A,N1+1 ;(A)减数的补数 ADD A,N1 ;(A)被减数+减数的补数 DA ;进行调整 CPL C

37、;取借位标志 JNC L1 ;借位标志为0则转移 MOV N1+2, A ;存差的补数 MOV A,#9AH SUBB A, N1+2 ;求差的绝对值 L1:MOV N1+2,A ;存结果 SJMP ;停机,若被减数 减数,则差为正,借位标志为0;若被减数 减数,则差为负,借位标志为1。,逻辑运算类指令包括“与”、“或”、“异或”、清除、求反和左右移位等逻辑操作,这类指令除以累加器A为目的寄存器指令外,均不影响PSW中的标志位。,2.3.3 逻辑运算指令,1. 逻辑“与”、“或”、“异或”指令 逻辑“与”、“或”、“异或”3种操作各有6条指令,分别用助记符ANL、ORL、XRL代表“与”、“或

38、”、“异或”。 ANL(ORL、XRL) A,Rn ANL(ORL、XRL) A,Ri ANL(ORL、XRL) A,direct ANL(ORL、XRL) A,#data ANL(ORL、XRL) direct,A ANL(ORL、XRL) direct,#data 以上18条指令的功能是,把源操作数与目的操作数按位进行“与”(“或”、“异或”)操作,结果存于目的操作数单元或寄存器。,2. 移位指令 RL A ;累加器左环移 RLC A ;累加器通过Cy左环移 RR A ;累加器右环移 RRC A ;累加器通过Cy右环移 每条指令操作过程如图2-7所示。 累加器每左移一位相当于乘以2。同理,

39、累加器右移一位相当于除以2,读者可以举例验证。,图2-7 累加器移位指令示意图,3. 清零、取反指令 CLR A ;A0,累加器A清0,不影响标 志位 CPL A ;A(A),累加器A的内容按 位取反,不影响标志位,控制转移指令用于改变程序计数器PC值,以控制程序走向,作用区间为程序存储器空间。,2.3.4 控制转移类指令,1. 无条件转移指令 (1) 长转移指令 LJMP addr16 ;PCaddr16 长转移指令是把指令中16位目标地址装入PC,使程序执行下条指令时无条件转移到addr16处执行。因此,该指令是一条可以在64KB范围内转移的指令。,(2) 绝对转移指令 AJMP addr

40、11 指令中提供11位地址,与PC当前值的高5位共同组成16位目标地址,程序无条件转向目标地址。11位地址表示的存储空间为2KB,所以转移目标地址必须设置在包含AJMP指令后第一条指令的第一个字节的同一2KB范围内。,(3) 短转移指令 SJMP rel ;PC(PC)+ 2 ;PC(PC)+ rel rel为地址偏移量,带符号8位二进制数。程序转移范围为当前PC的前128或后127单元。 例如,1000H SJMP 89H 则转移地址 (PC)=1000H+2+89H=1002H+FF89H=0F8BH,(4) 间接转移指令 JMP A+DPTR ;PC(A)+ (DPTR) 本指令将累加器

41、A中的8位无符号数与16位数据指针相加,其和装入程序计数器PC,控制程序转向目标地址。这是一条很有用的分支选择转移指令,转移地址不是在编程时确定的,而是在程序运行时动态决定的,这是与前3条转移指令的主要区别。在DPTR中装入多分支程序的首地址,由累加器A的内容来动态选择其中的某一个分支进行分支转移。,例2-12 根据累加器的数值设计散转程序。 解: 程序如下: ORG 1000H STR: MOV DPTR,#TAB RL A ;A(A)*2 JMP A+DPTR TAB: AJMP KL0 AJMP KL1 AJMP KL2 当(A)=00H时,散转到KL0;(A)=02H时散转到KL2。由

42、于AJMP是双字节指令,所以A中内容要先进行乘2调整。,2. 条件转移指令 条件转移指令是依据某种特定条件而转移的指令。条件满足时程序转移,条件不满足时则按顺序执行下面的程序。转移指令中的相对偏移量rel为8位带符号数,表示条件转移目标地址在以下一条指令地址为中心的256字节范围内(128+127)。,(1) 累加器判零转移指令 JZ rel ;累加器为0转移 JNZ rel ;累加器不为0转移,(2) 比较转移指令 CJNE,rel 指令功能对目的字节和源字节两个操作数进行比较,若它们的值不相等则转移,相等则按顺序执行程序。若目的字节小于源字节,则Cy置1,否则Cy清0。本指令执行后不影响任

43、何操作数。 CJNE A,#data,rel CJNE A,direct,rel CJNE Ri,#data,rel CJNE Rn,#data,rel,(3) 循环转移指令 DJNZ Rn,rel;Rn(Rn)1 ;若(Rn)=0,则PC(PC)+2 ;若(Rn)0,则PC(PC)+2+rel DJNZ direct,rel;direct(direct)-1 ;若(direct)=0,则PC(PC)+3 ;若(direct)0,则PC(PC)+3+rel 这是减1后与0比较指令,每执行一次该指令,第一操作数字节变量减1,结果送回第一操作数中,并判断字节变量是否为0,不为0则转移,否则顺序执行

44、。如果字节变量原值为00H,减1则下溢得0FFH,不影响任何标志位。,例2-13 设R0、R1、R2的内容分别为01H、0AH、20H,执行下列程序: DJNZ R0,L1 DJNZ R1,L2 DJNZ R2,L3 执行第一条DJNZ后(R0)=0,程序不转移。执行第二条DJNZ后(R1)=09H不为0,程序跳到L2去执行。第三条DJNZ指令暂时不会执行。,(4) 位控制转移指令位控制转移指令也属于条件转移指令,根据位累加器或某一位地址单元的状态,控制程序走向。 判断Cy转移指令 JC rel ;若Cy=1,则PC(PC)+2+rel ;若Cy=0,则PC(PC)+2 JNC rel ;若C

45、y=0,则PC(PC)+2+rel ;若Cy=1,则PC(PC)+2 上述两条指令以位累加器C的状态为转移条件。, 判断位直接寻址位转移指令 JB bit,rel ;若(bit)=1,则PC(PC)+3+rel ;若(bit)=0,则PC(PC)+3 JNB bit,rel;若(bit)=0,则PC(PC)+3+rel ;若(bit)=1,则PC(PC)+3 JBC bit,rel ;若(bit)=0,则PC(PC)+3 ;若(bit)=1,则PC(PC) +3+rel,(bit)0 上述3条指令中,bit为直接位地址。第3条指令具有清0功能。,3. 子程序调用和返回 调用指令和返回指令是成对

46、出现的。调用指令在调用程序中使用,而返回指令则是子程序中最后一条指令。,(1) 调用指令 长调用指令 LCALL addr16 ;PC(PC)+3 ;SP(SP)+1,(SP)(PC)70 ;SP(SP)+1,(SP)(PC)158 ;PCaddr16,长调用指令为三字节指令,为实现子程序调用,该指令共完成两项操作: 断点保护 断点保护是通过自动方式的堆栈操作来实现的,即把加了3以后的PC值自动送入堆栈区保护起来,待子程序返回时再送回PC。 构造目的地址 把指令中提供的16位子程序入口地址压入PC,长调用指令的调用范围是64KB。, 绝对调用指令 ACALL addr11 ;PC(PC)+2

47、;SP(SP)+1,(SP)(PC)70 ;SP(SP)+1,(SP)(PC)158 ;PC100 addr11 该指令提供11位目标地址,限在2KB地址范围内调用。目标地址的形成方法与绝对转移指令AJMP相同。,(2) 返回指令 RET ;子程序调用返回指令 RETI ;中断服务子程序返回指令 中断服务程序也是子程序,因此,中断返回和子程序调用返回具有相似的指令功能: PC158(SP),SP(SP)1 PC70(SP),SP(SP)1 保护断点时,先把PC低8位压栈,后把PC高8位压栈。返回时,先弹出PC高8位,后弹出PC低8位。RET和RETI都要用在子程序末尾。,4. 空操作指令 NO

48、P ;(PC)(PC)+1 空操作即控制CPU不作任何操作,只产生一个机器周期延迟。,位操作指令的操作数是字节中的某一位,每位取值只能是0或1,故又称之为布尔变量操作指令。布尔处理器的累加器Cy在指令中可简写成C。,2.3.5 位操作指令,1. 位传送指令 MOV C,bit ;C(bit) MOV bit,C ;bit(C) 上述两条指令把源操作数指定的位变量传送到目的操作数指令单元。,2. 位变量修改指令 这组指令分别完成位清0、置位及取反操作,执行结果不影响其他标志位。 CLR C ;C0 CLR bit ;bit0 SETB C ;C1 SETB bit ;bit1 CPL C ;C(C) CPL bit ;bit(bit),3. 位逻辑运算指令 这组指令将位累加器C与直接位地址进行逻辑与、逻辑或,操作结果再送回C。 ANL C,bit ;C(C)bit ANL C,/bit ;C(C)bit ORL C,bit ;C(C)bit ORL C,/bit ;C(C)bit,例2-14 设M、N和W代表位地址,求W=M N。 解: 由于MCS-51单片机中无位异或

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1