第3章 80C51单片机的寻址方式和指令系统_第1页
第3章 80C51单片机的寻址方式和指令系统_第2页
第3章 80C51单片机的寻址方式和指令系统_第3页
第3章 80C51单片机的寻址方式和指令系统_第4页
第3章 80C51单片机的寻址方式和指令系统_第5页
已阅读5页,还剩188页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章1第2章:80C51系列单片机基本结构及原理3.1汇编语言指令格式及其常用符

3.1.1汇编语言指令格式

3.1.2机器码的三种格式

3.1.3指令中常用符号说明3.280C51的寻址方式

3.2.1立即寻址

3.2.2直接寻址

3.2.3寄存器寻址

3.2.4寄存器间接寻址

3.2.5变址寻址

3.2.6相对寻址

3.2.7位寻址目录2第2章:80C51系列单片机基本结构及原理3.3数据传送类指令(29条)

3.3.1内部RAM数据传送指令

3.3.2访问外部RAM的数据传送指令MOVX3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令

3.3.5堆栈操作指令3.4算术运算类指令(24条)

3.4.1加法指令

3.4.2减法指令

3.4.3乘、除法指令3.5逻辑运算及移位类指令(24条)3.5.1逻辑与运算指令

3.5.2逻辑或运算指令目录3第2章:80C51系列单片机基本结构及原理

3.5.3逻辑异或运算指令

3.5.4累加器清零、取反指令

3.5.5循环移位指令3.6控制转移类指令(17条)

3.6.1无条件转移指令

3.6.2条件转移指令

3.6.3子程序调用及返回指令

3.6.4空操作指令3.7位操作类指令

3.7.1位变量传送指令

3.7.2位置位、清零指令

3.7.3位逻辑运算指令

3.7.4位控制转移指令目录4第3章80C51单片机的寻址方式和指令系统指令是规定计算机进行某种操作的命令。一台计算机所能执行的指令集合称为该计算机的指令系统。能被计算机直接识别、执行的指令是使用二进制编码表示的指令,这种指令被称为机器语言指令。机器语言难编写、难读懂、难查错和难交流。以助记符表示的指令被称为符号指令。汇编语言就是典型的符号指令。单片机常用的编程语言:汇编语言和C语言。5第3章80C51单片机的寻址方式和指令系统

80C51系列单片机汇编语言指令系统共有111条指令,按功能划分,可分为五大类:(1)数据传送类指令(29条);(2)算术运算类指令(24条);(3)逻辑运算及移位类指令(24条);(4)控制转移类指令(17条);(5)位操作类指令(17条)。6

本节内容3.1.1汇编语言指令格式3.1.2机器码的三种格式3.1.3指令中常用符号说明73.1.1汇编语言指令格式一条完整的汇编语言指令通常由标号、操作码、操作数(一般包括目的操作数和源操作数)及指令的注释构成。指令格式:

[标号:]<操作码>[操作数][,操作数][;注释]说明:在一条指令中,方括号中的内容可有可无,尖括号中的内容必须有。由指令格式可见,操作码是指令的核心,不可缺少。8标号—标号是该指令的起始地址,是一种符号地址。标号可以由1~8个字符组成,第一个字符必须是字母,其余字符可以是字母、数字或其他特定符号。标号后跟分界符“:”。操作码—指令的助记符。操作码规定了指令所能完成的操作功能,是指令的必需部分,是指令的核心,不可缺少。操作数—指出了指令的操作对象。操作数可以是一个具体的数据,也可以是存放数据的单元地址,还可以是符号常量或符号地址等。操作数可分为目的操作数和源操作数,多个操作数之间用逗号“,”分隔。注释—为了方便阅读而添加的解释说明性的文字,用“;”开头。举例:START:MOVA,#30H;将立即数30H传送至A中9

本节内容3.1.1汇编语言指令格式3.1.2机器码的三种格式3.1.3指令中常用符号说明103.1.2机器码的三种格式:汇编语言需要编译成用机器语言表达的机器码才能在ROM中存放。按所占字节分,分三种:(1)单字节指令49条(只有操作码,没有直接数字(只有寄存器名))(2)双字节指令45条(有一个字节“立即数”或一个字节“地址数”)(3)三字节指令17条(有两个字节“立即数”或两个字节“地址数”)按执行时间来分,分三种:(1)1个机器周期(12个时钟振荡周期)的指令64条;(2)2个机器周期指令45条;(3)4个机器周期--乘、除指令2条。11一、单字节指令(49条):两种编码格式:1.8位编码只表示一个操作码编码,其格式为:例如:INCA

该汇编指令的机器码为:00000100B

其十六进制数为04H,操作数(累加器A)隐含在操作码中。注意:在汇编语言指令中,“A”代表累加器,而用“ACC”代表累加器的地址E0H。122.8位编码中包含操作码和寄存器编码,其格式为:这类指令中高5位表示操作码,低3位rrr为存放操作数的寄存器编码Rn(n=0,…7)。例如:MOVA,R0该指令的编码为:11101000B

其十六进制表示为E8H,低三位000为R0的编码。13二、双字节指令(45条)双字节指令为16位编码,其格式为:

第一个字节表示操作码,第二个字节为参与操作的操作数data或数据所在地址direct。例如:MOVA,#30H该指令两个字节的编码为01110100B,00110000B

其十六进制表示为:74H,30H,其中74H存放在指令码的第一字节,data这个具体的数据存放在第二字节。14三、三字节指令(17条):三字节指令为24位编码,其格式为:第一个字节表示操作码,后两个字节为参与操作的操作数data或数据所在地址direct。例如:MOV20H,#50H该指令的3个字节编码为01110101B,00100000B,01010000B。

其十六进制表示为75H,20H,50H。第一个字节存放75H这个操作码,第二个字节存放目的地址20H,第三个字节存放源操作数50H。15

本节内容3.1.1汇编语言指令格式3.1.2机器码的三种格式3.1.3指令中常用符号说明163.1.3指令中常用符号说明在描述80C51系列单片机指令系统的功能时,经常使用的符号及意义如下:Rn(n=O~7)

当前选中的工作寄存器中的寄存器R0~R7之一;Ri(i=0、1)

当前选中的工作寄存器可作为地址指针的寄存器R0、R1;#data8位立即数;#datal616位立即数;direct

片内部RAM的低128个单元地址,也可以是特殊功能寄存器SFR的单元地址或符号;

addrll

11位目的地址,只限于在ACALL和AJMP指令中使用;addrl616位目的地址,只限于在LCALL和LJMP指令中使用;rel

补码形式表示的8位地址偏移量,其值的范围:-128~+127;bit

片内RAM位寻址区或可位寻址的特殊功能寄存器的位地址;@

间接寻址或变址寻址的前缀标志;C

进位标志位,也称为位累加器;/加在位地址的前面,表示对该位先求反再参与操作,但不影响该位的值;(X)

由X指定的寄存器或地址单元中的内容;((X))

由X寄存器的内容作为地址的存储单元的内容;$

本条指令的起始地址;

指令操作流程,将箭头右边的内容送到箭头左边的单元中;

数据交换。17指令中常用符号说明:Rn当前选中的工作寄存器组中的寄存器R0-R7之一,

所以n=0-7。Ri当前选中的工作寄存器组中可作地址指针的寄存器R0、R1,所以i=0、1。#data8位立即数。#data1616位立即数。Direct内部RAM的8位地址。即可以是内部RAM的低128个单元地址,也可以是特殊功能寄存器的单元地址或符号。在指令中direct表示直接寻址方式。Addr1111位目的地址,只限于在ACALL和AJMP指令中使用。Addr1616位目的地址,只限于在LCALL和LJMP指令中使用。Rel补码形式表示的8位地址偏移量,在相对转移指令中使用。Bit表示片内RAM位寻址区或可位寻址的特殊功能寄存器的位地址;@间接寻址方式中间址寄存器的前缀标志;C进位标志位,它是布尔处理机的累加器,也称之为位累加器;/加在位地址的前面,表示对该位先求反再参与操作,但不影响该位的值;(x)由x指定的寄存器或地址单元中的内容;((x))由x所指寄存器的内容作为地址的存储单元的内容;$表示本条指令的起始地址;←表示指令操作流程,将箭头右边的内容送到箭头左边的单元中。18寻址就是寻找操作数的地址。寻址方式则指出寻找操作数地址的方式方法。一条指令可能含多种寻址方式,通常根据指令的源操作数来决定指令的寻址方式。寻址方式总体上分为两大类:一是操作数的寻址。二是跳转、调用等指令所涉及的跳转目标地址和调用程序的首地址的寻址。1980C51单片机的寻址方式有七种:立即数寻址直接寻址寄存器寻址寄存器间接寻址基址变址寻址相对寻址位寻址20

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址213.2.1立即寻址所谓立即寻址就是在指令中直接给出操作数。通常把出现在指令中的操作数称为立即数,为了与直接寻址指令中的直接地址相区别,指令中需要在直接给出的具体数据前面加“#”标志。22【例3-1】执行指令:MOVA,#30H后累加器A的值是多少?解:执行指令如图3-1所示,(A)=30H。汇编指令MOVA,#30H编译成机器码后为:74H,30H,其中30H就是立即数,该指令功能是将30H这个数本身送入累加器A中,执行完这条指令后累加器A中的值为30H,即(A)=30H。立即寻址所对应的存储空间为ROM空间。2324

本节内容3.2.1立即寻址3.2.2直接寻址

3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址253.2.2直接寻址

直接寻址方式就是在指令中直接给出操作数存放在内部RAM的地址,或直接给出特殊功能寄存器的地址或符号。直接寻址方式可访问以下存储空间:1)内部RAM低128个字节单元,在指令中直接地址以单元地址的形式给出;2)特殊功能寄存器。26【例3-2】已知内部RAM(30H)=58H,执行指令“MOVA,30H”后,(A)=?解:指令执行过程如图3-2所示,结果:(A)=58H。该指令在ROM中的机器码为:E5H、30H,其中30H表示直接地址,该指令功能是把内部RAM地址为30H单元中的操作数58H传送给累加器A,累加器原先的数值被覆盖。2728注意:1)对于特殊功能寄存器,其直接地址既可以写成特殊功能寄存器的直接地址形式。如指令:MOVA,90H说明:90H是特殊功能寄存器P1的直接地址形式。

2)更常采用特殊功能寄存器的符号名称来表示。如指令:MOVA,P1说明:P1是特殊功能寄存器的符号名称,也是符号地址,在指令中符号“P1”与地址“90H”是等同的。29

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址

3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址303.2.3寄存器寻址

寄存器寻址就是以寄存器的内容作为操作数。【例3-3】如(RO)=60H,则执行MOVA,R0指令后,(A)=?解:指令执行过程如图3-3,结果:(A)=60H。指令在ROM中的机器码为E8H,指令对应的机器码是:E8H=11101000B,二进制的后三位000就是隐含的R0寄存器的编码,如果是R7其编码为111。由于寄存器在CPU内部,所以采用寄存器寻址可以获得较高的运算速度。3132能实现这种寻址方式的寄存器有:(1)工作寄存器R0~R7

(4组工作寄存器均可)(2)累加器A

(注:使用A为寄存器寻址,使用ACC为直接寻址)(3)寄存器B

(注:以AB寄存器对的形式出现时为寄存器寻址,单独出现时为直接寻址)(4)数据指针DPTR

例如:MOVA,R0;将R0寄存器的内容送到累加器A中。

MOVR2,A;把累加器A中的内容传送到R2寄存器中。说明:采用寄存器寻址方式的指令都是一字节的指令,指令中以符号名称来表示寄存器;寄存器在CPU内部,故有较高的运算速度。33

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址343.2.4寄存器间接寻址所谓寄存器间接寻址就是以寄存器中的内容作为RAM地址,该地址中的内容才是操作数。寄存器名称前加“@”标志来表示寄存器间接寻址。【例3-4】(RO)=60H,(60H)=32H,则执行MOVA,@R0指令后,(A)=?,(RO)=?解:指令执行过程如图3-4,结果:(A)=32H,(RO)=60H。

35说明:

R0寄存器的内容60H是操作数地址,内部RAM60H的内容32H才是操作数,把该操作数复制到累加器A中,A中原来的数据被覆盖了,结果(A)=32H。若是寄存器寻址指令:MOVA,R0;则执行结果(A)=60H。361)80C51系列单片机规定只能用寄存器R0、R1、DPTR作为间接寻址的寄存器。2)间接寻址可以访问的存储空间为内部RAM和外部RAM。①内部RAM的低128个单元采用R0、R1作为间址寄存器,在指令中表现为@R0、@R1的形式;②外部RAM的寄存器间接寻址有两种形式:一是采用R0、R1作为间址寄存器,指令中表现为@R0、@R1的形式,可寻址外部RAM的低256个单元,即可访问地址范围为0000H~00FFH的单元;二是采用16位的DPTR作为间址寄存器,指令中表现为@DPTR的形式,可寻址外部RAM整个64KB个地址空间,地址范围为0000H~FFFFH的单元。37

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址383.2.5变址寻址

变址寻址是以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器(存放地址偏移量),并以两者内容相加形成的16位地址作为操作数地址,用于读ROM数据操作。在变址寻址中:操作数地址=基址+变址基址寄存器:16位的地址指针寄存器DPTR或16位的PC寄存器变址寄存器:累加器A两者中的“内容”之和形成一个16位的“地址”,该“地址”所指的存储单元中的内容才是操作数。39变址寻址用于两种情况:(1)用于对ROM(包含内外ROM)的数据进行寻址例如:MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))第一条指令的功能将A的内容与DPTR的内容之和作为操作数地址,把该地址中的内容送入累加器A中;第二条指令的功能将A的内容与PC的内容之和作为操作数地址,把该地址中的内容送入累加器A中。40变址寻址用于两种情况:(2)用于跳转指令例如:JMP@A+DPTR跳转指令的功能是将累加器A的内容与数据指针DPTR的内容相加形成指令跳转的目标地址,从而使程序转移到该地址运行。注意:变址寻址所找到的地址是ROM空间的地址,指令中表现为@A+DPTR,@A+PC的形式。41【例3-5】若(A)=03H,(DPH)=20H,(DPL)=00H,即(DPTR)=2000H,ROM的(2003H)=66H。执行指令MOVCA,@A+DPTR后,(A)=?解:指令执行过程如图3-5,结果:(A)=66H,(RO)=60H。该指令中累加器A的值和DPTR的值相加所得2003H为操作数所在ROM单元的地址,该地址中的数据66H才是要找的操作数,该指令将66H覆盖累加器A原来的值。4243

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址

3.2.7位寻址443.2.6相对寻址

相对寻址,用于相对转移指令,将程序计数器PC的当前值与指令中给出的偏移量rel相加,其结果作为转移地址送入PC中。说明:相对寻址能修改PC的值,故可用来实现程序的分支转移;PC当前值是指正在执行指令的下一条指令的地址;rel是一个带符号的8位二进制数,取值范围-128~+127。45【例3-6】设指令SJMP54H存放在ROM内以2000H起始的单元,求执行本指令后程序将跳转到何处执行?解:这是无条件相对转移指令,是双字节指令,指令代码为80H、54H,其中80H是该指令的操作码,54H是偏移量。

转移地址为2000H+02H+54H=2056H。故指令执行后,PC的值变为2056H,程序的执行顺序发生了转移,指令执行过程如图3-6所示。在实际编程中,“rel”通常用标号代替。例:SJMPLOOP14647

本节内容3.2.1立即寻址3.2.2直接寻址3.2.3寄存器寻址3.2.4寄存器间接寻址3.2.5变址寻址3.2.6相对寻址3.2.7位寻址483.2.7位寻址

80C51系列单片机有位处理功能,位寻址方式是对内RAM和特殊功能寄存器中的可寻址位进行操作的寻址方式。

位寻址是在指令的操作数位置上直接给出位地址。例如:MOVC,07H将位地址07H(字节地址20H中最高位)中的数据传传送到位累加器CY中。提示:位地址里的数据只可能是一个0或1。再如:MOV30H,CCLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;CY←/(CY)49【例3-7】位地址为07H单元中的值为1,CY=0,执行MOVC,07H指令后,CY=?解:该指令的功能是把位地址07H中的值传送到位累加器CY中。5051系列单片机的内部RAM有两个区域可以位寻址:一个是位寻址区20H~2FH单元的128位;另一个是字节地址能被8整除的特殊功能寄存器的相应位。51在MCS-51系列单片机中,位地址有以下几种表示方式:(1)直接使用位地址。对于20H~2FH共16个单元的128位,其位地址编号是00H~7FH,例如,20H单元的0~7位的位地址为00H~07H。(2)用单元地址加位序号表示。如25H.5表示25H单元的D5位(位地址是2DH),而PSW中的D3可表示为D0H.3。这种表示方法可以避免查表或计算,比较方便。(3)用位名称表示。特殊功能寄存器中的可寻址位均有位名称,可以用位名称来表示该位。如可用RS0表示PSW中的D3位:D0H.3(4)对特殊功能寄存器可直接用寄存器符号加位序号表示。如PSW中的D3位,又可表示为PSW.3。5253

本节内容3.3.1内部RAM数据传送指令

3.3.2访问外部RAM的数据传送指令MOVX3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令3.3.5堆栈操作指令

54数据传送类指令(29条)是最常用、最基本的一类指令,主要用于数据的传送、保存及交换等场合。数据传送类指令的一般功能是把源操作数传送到目的操作数,指令执行后,源操作数不变,目的操作数被源操作数代替。3.3.1内部RAM数据传送指令内部RAM的数据传送类指令共16条,包括累加器、寄存器、特殊功能寄存器、RAM单元之间的相互数据传送。55一、以累加器A为目的操作数的数据传送指令

MOVA,#data;A←dataMOVA,direct;A←(direct)MOVA,Rn

;A←(Rn)MOVA,@Ri

;A←((Ri))

这组指令的功能:将源操作数所指定的内容送入累加器A中。源操作数可以采用立即寻址、直接寻址、寄存器寻址和寄存器间接寻址4种寻址方式。

56【例3-8】若(RO)=20H,(20H)=66H,试分别求解每条指令执行后,(A)=?MOVA,#20H;A←20HMOVA,20H;A←(20H)MOVA,R0;A←(R0)MOVA,@RO;A←((RO))解:执行每条指令后:(A)=20H(A)=66H(A)=20H(A)=66H57二、以寄存器Rn为目的操作数的数据传送指令

MOVRn,A;Rn←(A)MOVRn,#data;Rn←dataMOVRn,direct;Rn←(direct)这组指令的功能:将源操作数所指定的内容送到当前工作寄存器组R0~R7中的某个寄存器中。源操作数可以采用累加器A(属于寄存器寻址)、立即寻址和直接寻址。注意:没有“MOVRn,Rn”指令,也没有“MOVRn,@Ri”指令。58【例3-9】已知(A)=50H,(R1)=10H,(R2)=20H,(R3)=30H,(30H)=4FH,求解每条指令的执行结果。①MOVR1,A;R1←(A)②MOVR2,30H;R2←(30H)③MOVR3,#85H;R3←85H解:执行后:①(R1)=50H;②(R2)=4FH;③(R3)=85H。第②条指令的执行过程见图3-8。5960三、以直接地址为目的操作数的数据传送指令

MOVdirect,A;direct←(A)MOVdirect,#data;direct←dataMOVdirect1,direct2;direct1←(direct2)MOVdirect,Rn

;direct←(Rn)MOVdirect,@Ri

;direct←((Ri))这组指令的功能:将源操作数所指出的内容送入由直接地址direct所指定的片内存储单元。源操作数可以采用寄存器寻址、立即寻址、直接寻址和寄存器间接寻址四种方式。61【例3-10】若(A)=36H,(50H)=22H,(R0)=60H,(60H)=72H,求解每条指令执行后,(40H)=?①MOV40H,A;40H←(A)②MOV40H,#50H;40H←50H③MOV40H,50H;40H←(50H)④MOV40H,R0;40H←(R0)⑤MOV40H,@R0;(40H)←((R0))解:每条指令的执行结果分别为:①(40H)=36H;②(40H)=50H;③(40H)=22H;④(40H)=60H;⑤(40H)=

72H。62⑤MOV40H,@R0;(40H)←((R0))第⑤条指令的执行过程如图3-9所示。63四、以间接地址@Ri为目的操作数的数据传送指令

MOV@Ri,A;(Ri)←(A)MOV@Ri,#data;(Ri)←dataMOV@Ri,direct;(Ri)←(direct)这组指令的功能:把源操作数所指定的内容送入以R0或R1为地址指针的片内RAM单元中。源操作数可以采用寄存器寻址、立即寻址和直接寻址3种方式。注意:没有“MOV@Ri,Rn”指令和“MOV@Ri,@Ri”指令。

64【例3-11】已知(R1)=60H,(A)=20H,(30H)=22H,试分别求解每条指令的执行结果。①MOV@R1,A;(R1)←(A)②MOV@R1,#26H;(R1)←26H③MOV@R1,30H;(R1)←(30H)解:本条指令用源操作数的值修改的寄存器的值作为地址单元中的内容,寄存器的值不变。第三条指令的执行过程如图3-10所示。①(R1)=60H,(60H)=20H;②(R1)=60H,(60H)=26H;③(R1)=60H,(60H)=22H。6566五、以DPTR为目的操作数的数据传送指令

MOVDPTR,#data16;DPTR←data16这是80C51系列单片机指令系统唯一的一条16位传送指令。功能:是将外部存储器(RAM或ROM)某单元地址作为立即数送到DPTR中,立即数的高8位送DPH,低8位送DPL。67在使用上述各类传送指令时,需注意以下几点:(1)要区分各种寻址方式的含义,正确传送数据。【例3-12】若(R0)=30H,(30H)=50H时,以下指令的执行结果:MOVA,RO;MOVA,@R0;MOVA,30H;MOVA,#30H;执行结果:(A)=30H(A)=(30H)=50H(A)=(30H)=50H(A)=30H68MCS-51单片机片内数据传送图

69在使用上述各类传送指令时,需注意以下几点:(2)所有传送指令都不影响标志位。这里所说的标志位是指CY、AC和OV,涉及累加器A的将影响奇偶标志位P。(3)估算指令的字节数。凡是指令中既不包含直接地址,又不包含8位立即数的指令均为一字节指令;若指令中包含一个直接地址或8位立即数,指令字节数为2,若包含两个这样的操作数,则指令字节数为3。如:MOVA,@R0;1字节

MOVA,direct;2字节

MOVdirect,#data;3字节

MOVDPTR,#datal16;3字节70

本节内容3.3.1内部RAM数据传送指令3.3.2访问外部RAM的数据传送指令MOVX

3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令3.3.5堆栈操作指令

713.3.2访问外部RAM的数据传送指令MOVX

单片机片经常会与外部RAM进行数据交换,以及对外部I/O口输出控制信号或读取外部I/O口的状态。

80C51单片机与外部RAM或I/O口进行数据传送没有专门的指令,都用MOVX指令,且必须采用寄存器间接寻址的方法,并通过累加器A来传送。72一、单片机读取片外RAM或I/O口指令

MOVXA,@DPTR;A←((DPTR))MOVXA,@Ri

;A←((Ri))二、单片机写片外RAM或I/O口指令

MOVX@DPTR,A;(DPTR)←(A)MOVX@Ri,A;(Ri)←(A)该组指令的功能:在DPTR或R0、R1所指定的外部RAM单元与累加器A之间传送数据。注意:片外扩展的I/O接口进行数据的读、写没有专门的指令,只能与外部RAM共用这四条指令。73一、单片机读取片外RAM或I/O口指令

MOVXA,@DPTR;A←((DPTR))MOVXA,@Ri

;A←((Ri))二、单片机写片外RAM或I/O口指令

MOVX@DPTR,A;(DPTR)←(A)MOVX@Ri,A;(Ri)←(A)前两条指令是以DPTR作为间址寄存器,DPTR是16位,其寻址范围可达片外RAM64KB空间。后两条指令是以R0或R1作为间址寄存器,R0或R1是8位,其寻址范围仅限于外部RAM256个字节单元。74【例3-13】试编程,将片外RAM的2000H单元内容送入片外RAM的20H单元中。解:片外RAM与片外RAM之间不能直接传送,需通过累加器A;另外,当片外RAM地址值大于0FFH时,不能用R0和R1作为间址寄存器,需用DPTR作为间址寄存器。编程如下:MOVDPTR,#2000H;源数据地址送DPTRMOVXA,@DPTR;从外部RAM中取数送AMOVRO,#20H;目的地址送DPTRMOVX@R0,A;A中内容送外部RAM75

本节内容3.3.1内部RAM数据传送指令3.3.2访问外部RAM的数据传送指令MOVX3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令3.3.5堆栈操作指令

763.3.3读取ROM中常数表的查表指令MOVC

通常ROM中是用来存放供单片机CPU执行的程序代码的,但其内部也可以用来存放固定不变的数据,如:表格数据。读取ROM中常数表的查表指令MOVC,能够将程序存储器表格中的数据或字段代码送到累加器A中。

MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))77

MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))指令的功能是从程序存储器中读取源操作数送入累加器A中。这两条指令特别适合于读取在ROM中建立的数据表格,故称做查表指令。源操作数均为变址寻址方式。两条指令都是一字节指令。78二者在使用中有一点差异:第一条指令采用DPTR作为基址寄存器。表格数据可存放在64KBROM的任意位置,使用前需将表格首地址送入DPTR中,因此这条指令称为远程查表指令。第二条指令是以PC作为基址寄存器。表格长度不能超过256B,程序中PC值是确定的,为下一条指令的地址,不能送入表格首地址,使基址与实际要读取的表格数据首地址不一致,这样A+PC与实际要访问的单元地址就不一致,因此,使用该指令之前要用一条加法指令进行地址调整。由于PC的内容不能随意改变,所以只能借助于A来进行调整,即通过对累加器A加一个数,使得A+PC和所读ROM单元地址一样。79【例3-14】若在外部ROM中2000H单元开始存放(O~9)的平方值O,l,4,9,…,81,要求根据累加器A中的值(0~9),来查找所对应的平方值,并存入60H单元中。解:(1)用DPTR作为基址寄存器:在MOVC指令前先将表首地址送给DPTRMOVDPTR,#2000H;表格首地址送DPTRMOVCA,@A+DPTR;根据表格首地址及A确定地址,取数送AMOV60H,A;存结果2000H:DB0,1,4,9,16,25,36,…,81

这种情况,(A)+(DPTR)之和就是待求数的平方值在ROM表格中的存放地址。80(2)用PC作为基址寄存器:在MOVC指令前先用一条加法指令进行地址调整

ADDA,#data;(A)+data作为地址调整,本条指令占2字节

MOVCA,@A+PC;(A)+data+(PC)确定查表地址,取数送A,本条指令占1字节

MOV60H,A;存结果,本条指令占2字节

RET;本条指令占1字节2000H:DB0,1,4,9,16,25,36,…,81执行该指令时,PC当前值不是要查找的表格首地址2000H,已指向下一条指令地址,两者之间存在地址差,因此需进行地址调整,使其能指向表格首地址,由于PC的内容不能随意改变,所以只能借助于A来进行调整。加在A上的#data的值是由紧随MOVC指令的下一条指令的首地址与数据表格首地址之间其它指令所占的字节数之和来确定。本例中,查表指令与表格首地址之间只有两条指令,即:MOV60H,A和RET,两者共占3个字节,因此本题data=03H。

A中的内容为8位无符号数,该查表指令只能查找指令所在地址以后256B范围内的数据,故称之为近程查表指令。81

本节内容3.3.1内部RAM数据传送指令3.3.2访问外部RAM的数据传送指令MOVX3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令

3.3.5堆栈操作指令

823.3.4数据交换指令

数据交换指令共有5条,可完成累加器A和内部RAM单元之间的字节或半字节交换。一、整字节交换指令整字节交换指令有3条,完成累加器A与内部RAM单元内容的整字节(即8位二进制数据)全部交换。

XCHA,Rn

;(A)←→(Rn)XCHA,direct;(A)←→(direct)XCHA,@Ri

;(A)←→((Ri))83【例3-15】已知(A)=40H,(R0)=20H,(30H)=58H,(20H)=4FH,试分别求解下面3条各自独立指令的执行结果。①XCHA,R0;(A)←→(R0)②XCHA,30H;(A)←→(30H)③XCHA,@R0;(A)←→((R0))解:①(A)=20H,(R0)=40H;②(A)=58H,(30H)=40H;③(A)=4FH,(R0)=20H,(20H)=40H。84【例3-16】试编程,将外部RAM1000H单元中的数据与内部RAM6AH单元中的数据相互交换。解:数据交换指令只能完成累加器A和内部RAM单元之间的数据交换,要完成外部RAM与内部RAM之间的数据交换,需先把外部RAM中的数据取到A中,交换后再送回到外部RAM中。编程如下:

MOVDPTR,#1000H;外部RAM地址送DPTRMOVXA,@DPTR;从外部RAM中取数送AXCHA,6AH;A与6AH地址中的内容进行交换

MOVX@DPTR,A;交换结果送外部RAM85二、半字节交换指令

XCHDA,@Ri

;(A)3~0←→((Ri))3~0该指令功能:将累加器A中的低4位和Ri间接寻址找到的数据低4位交换,而各自的高4位内容都保持不变。【例3-17】已知(A)=40H,(R0)=26H,(26H)=3FH,试求解下面指令的执行结果。

XCHDA,@R0;(A)3~0

((R0))3~0

解:指令执行后:(A)=4FH,(R0)=26H,(26H)=30H。86三、累加器高低半字节交换指令

SWAPA;(A)7~4←→(A)3~0

由于十六进制数或BCD码都是以4位二进制数表示,因此SWAP指令主要用于实现十六进制数或BCD码的数位交换。【例3-18】已知(A)=40H,试求解下面指令的执行结果。

SWAPA;(A)7~4←→(A)3~0解:指令执行后(A)=04H。87

本节内容3.3.1内部RAM数据传送指令3.3.2访问外部RAM的数据传送指令MOVX3.3.3读取ROM中常数表的查表指令MOVC3.3.4数据交换指令3.3.5堆栈操作指令

883.3.5堆栈操作指令堆栈操作指令可以实现对现场数据或断点地址的保护。一、进栈指令

PUSHdirect;SP←(SP)+1,(SP)←(direct)进栈指令的功能:先将栈顶指针SP的内容加1,使栈区向上生长出一个栈顶空单元,然后将直接地址direct单元的内容送入栈顶空单元。89【例3-19】如图3-11(a)所示:(SP)=41H,(41H)=22H,设(A)=18H,试回答:①执行指令之前栈顶单元的地址是多少?②指令执行后栈顶单元的地址是多少?③执行指令后(SP)=?,(42H)=?PUSHACC;解:指令执行过程如图3-11(b)和3-11(c)。①指令执行前栈顶单元的地址就是SP的值即41H;②指令执行后栈顶单元的地址为42H;③(SP)=42H,(42H)=18H。

9091二、出栈指令

POPdirect;direct←((SP)),SP←(SP)-1出栈指令的功能:先将SP所指出的栈顶单元的内容送入direct直接地址单元,然后将堆栈指针SP的内容减1,使之指向新的栈顶单元。【例3-20】如图3-12(a)所示:(SP)=41H,(41H)=22H,试回答:①执行指令之前栈顶单元的地址是多少?②指令执行后栈顶单元的地址是多少?③执行指令后(SP)=?,(5FH)=?POP

5FH92解:指令执行过程如图3-12(b)和3-12(C)。①指令执行前栈顶单元的地址就是SP的值即41H;②指令执行后栈顶单元的地址为40H;③(SP)=40H,(5FH)=22H。93注意:无论是进栈还是出栈均是对栈顶单元进行的,且这两条指令的操作数只能采用直接寻址方式,不能用累加器A或工作寄存器Rn作为操作数。指令中如用到累加器A,必须写出符号地址ACC的形式或写出直接地址E0H,不能写成A的形式。

如:PUSHACC(ACC表示累加器A的直接地址)利用堆栈操作指令也可以完成数据的传送。94

本节内容3.4.1加法指令

3.4.2减法指令3.4.3乘、除法指令95

80C51系列单片机的算术运算类指令共有24条,可以完成加、减、乘、除等各种操作,全部指令都是8位数运算指令。算术运算类指令大多数要影响到程序状态字寄存器PSW中的溢出标志OV、进位(借位)标志CY、辅助进位标志AC和奇偶标志位P。如果需要做16位数的运算则需编写相应的程序来实现。算术运算的大部分指令均以累加器A作为源操作数之一,并且运算结果还存放在累加器A中。963.4.1加法指令一、不带进位加法指令

ADDA,#data;A←(A)+dataADDA,direct;A←(A)+(direct)ADDA,Rn

;A←(A)+(Rn)ADDA,@Ri

;A←(A)+((Ri))这组指令的功能:把源操作数所指出的内容与累加器A的内容相加,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。97该组指令对PSW中的各标志位影响情况如下:进位标志CY:如果D7位向上有进位,则CY=1;否则,CY=O。半进位标志AC:如果D3位向上有进位,则AC=1;否则,AC=0。溢出标志OV:如果D7、D6位只有一个向上有进位时,OV=1;如果D7、D6位同时有进位或同时无进位时,OV=0。奇偶标志P:当A中“1”的个数为奇数,P=1;为偶数,P=0。98【例3-21】设有两个无符号数分别存放于累加器A和内部RAM30H单元,其中(A)=94H,(30H)=8DH,试分析执行指令ADDA,30H后两个数的和及各标志位的情形?解:不带进位的加法指令操作如下:结果为:(A)=21H;(CY)=1,(AC)=1,(OV)=1,(P)=O。99【例3-22】设有两个带符号数分别存放于累加器A和内部RAM30H单元,其值分别为(A)=94H,(30H)=8DH,试分析执行指令ADDA,30H后的结果?解:运算过程及对标准位的影响与【例3-21】相同。注意:两个正数相加或两个负数相加时,可能发生溢出(结果超出补码的表达范围-128~+127),则和的符号位将与加数和被加数不同,所得结果错误,OV=1正好指出了这一类错误。100二、带进位加法指令

ADDCA,#data;A←(A)+data+(CY)ADDCA,direct;A←(A)+(direct)+(CY)ADDCA,Rn

;A←(A)+(Rn)+(CY)ADDCA,@Ri

;A←(A)+((Ri))+(CY)这组指令的功能:把源操作数所指出的内容与累加器A的内容相加、再加上进位标志CY的值,其结果存放在A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。运算结果对PSW标志位的影响与ADD指令相同。所加的进位标志CY的值是在该指令执行之前的值。101【例3-23】设有两个无符号数分别存放于累加器A和内部寄存器R1单元,其中(A)=0AEH,(R1)=81H,(CY)=1,试求执行指令ADDCA,R1的结果?解:带进位的加指令操作如下:结果为:(A)=30H;(CY)=1,(OV)=1,(AC)=1,(P)=0。带进位加法指令主要用于多字节数据的加法运算。102【例3-24】设有两个无符号16位二进制数,分别存放在30H、31H单元和40H、41H单元中(低8位先存),写出两个16位数的加法程序,将和存入50H、51H单元(设和不超过16位)。解:由于80C51单片机不存在16位数的加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加的进位一起相加,编程如下:

MOVA,30H;取一个加数的低字节送A中

ADDA,40H;两个低字节数相加

MOV50H,A;结果送50H单元

MOVA,31H;取一个加数的高字节送A中

ADDCA,41H;高字节数相加,同时加低字节产生的进位

MOV51H,A;结果送51H单元。103三、加1指令

INCA;A←(A)+1INCdirect;direct←(direct)+1INCRn

;Rn←(Rn)+1INC@Ri

;(Ri)←((Ri))+1INCDPTR;DPTR←(DPTR)+1这组指令的功能:进行无符号数的运算,其将操作数所指定单元的内容加1。本组指令除“INCA”指令影响P标志外,其余指令均不影响PSW标志。加1指令常用来修改操作数的地址,以便于使用间接寻址方式。104【例3-25】若已知(A)=20H,(30H)=36H,(R7)=58H,(R0)=50H,(50H)=08H,(DPTR)=2000H,试计算下列指令的结果。INCA;A←(A)+1INC30H;30H←(30H)+1INCR7;R7←(R7)+1INC@R0;(R0)←((R0))+1INCDPTR;DPTR←(DPTR)+1解:指令执行后:①(A)=21H;②(30H)=37H;③(R7)=59H;④(R0)=50H;(50H)=09H;⑤(DPTR)=2001H。105四、十进制调整指令

DAA1)功能:对A中刚进行的两个BCD码的加法结果自动进行修正。2)该指令只影响进位标志CY。3)使用方法:在上述加法指令后面紧跟一条DAA指令。4)修正方法:若(A0~3)>9或(AC)=1,则(A0~3)+6H

(A0~3)。若(A4~7)>9或(CY)=1,则(A4~7)+6H

(A4~7)。5)相关内容:所谓BCD码就是采用四位二进制编码表示的十进制数。四位二进制数共有十六个编码,BCD码是取它前十个的编码0000~1001来代表十进制数的0~9,这种编码简称为BCD码。如果两个BCD码数相加,结果也是BCD码,则该加法运算称为BCD码加法。在单片机中没有专门的BCD码加法指令,要进行BCD码加法运算,也要使用加法指令ADD或ADDC。然而计算机在执行ADD或ADDC指令时,是按照二进制规则进行的,对于4位二进制数是按逢16进位,而BCD码是逢十进位的,二者存在进位差。106【例3-26】试分析单片机对下列三个BCD码给出的算式运算结果是否正确?解:在上述3组运算中,(a)的运算结果是正确的,因为8的BCD码就是1000;(b)的运算结果是错误的,因为13的BCD码应是00010011,但单片机给出的运算结果却是1101,BCD码中没有这个编码;(c)的运算结果也是错误的,因为17的BCD码应是00010111,而运算结果是00010001。107【例3-27】试编写程序,实现两位十进制数95+59的BCD码加法,并将结果存入30H、31H单元。

MOVA,#95H;95的BCD码数送A中

ADDA,#59H;两个BCD码相加,结果在A中

DAA;对相加结果进行十进制调整

MOV30H,A;十位个位的BCD码之和送30HMOVA,#00H;A清0ADDCA,#00H;加进位(百位的BCD码)

DAA;BCD码相加后,用调整指令

MOV31H,A;存进位第一次执行DAA指令的结果:A=54H,CY=1,最终结果:(31H)=01H,(30H)=54H。108

本节内容3.4.1加法指令3.4.2减法指令3.4.3乘、除法指令1093.4.2减法指令一、带借位减法指令

SUBBA,#data;A←(A)-data-(CY)SUBBA,direct;A←(A)-(direct)-(CY)SUBBA,Rn

;A←(A)-(Rn)-(CY)SUBBA,@Ri

;A←(A)-((Ri))-(CY)这组指令的功能:将累加器A中的数,减去源操作数所指出的数和上一次减法指令所产生的借位位CY,其结果存放在累加器A中。源操作数的寻址方式分别为立即寻址、直接寻址、寄存器寻址和寄存器间接寻址。110运算结果对程序状态字PSW中各标志位的影响情况如下:借位标志CY:如果D7位向上需借位,则CY=1;否则,CY=0。半借位标志AC:如果D3位向上需借位,则AC=1;否则,AC=0。溢出标志OV:如果D7、D6位只有一个向上需借位时,OV=1;如果D7、D6位同时需借位或同时无借位时,OV=0。奇偶标志P:当累加器A中“1”的个数为奇数时,P=1;为偶数时,P=0。说明:减法运算只有带借位减法指令,而没有不带借位的减法指令。若要进行不带借位的减法算,应该先用指令将CY清零,然后再执行SUBB指令。111【例3-28】设(A)=0DBH,(R4)=73H,(CY)=1,试分析执行指令SUBBA,R4后的差和各标志位的状态?结果(A)=67H,(CY)=O,(AC)=0,(OV)=1。在此例中,若DBH和73H是两个无符号数,则结果67H是正确的;反之,若为两个带符号数,则由于产生溢出(OV=1),使得结果是错误的,因为负数减正数其结果不可能是正数,OV=1,就指出了这一错误。112二、减1指令

DECA;A←(A)-1DECdirect;direct←(direct)-1DECRn

;Rn←(Rn)-1DEC@Ri

;Ri←((Ri))–1这组指令的功能:将操作数所指定单元的内容减1。说明:除“DECA”指令影响P标志外,其余指令均不影响PSW标志。113【例3-29】若已知(A)=20H,(30H)=36H,(R7)=58H,(R0)=50H,(50H)=08H,试计算下列指令的结果。①DECA;A←(A)-1②DEC30H;30H←(30H)-1③DECR7;R7←(R7)-1④DEC@R0;(R0)←((R0))-1解:指令执行后:①(A)=1FH;②(30H)=35H;③(R7)=57H;④(R0)=50H;(50H)=07H。114三、BCD码的减法指令由于DAA指令只能用在加法指令的后面。如果要进行BCD码减法运算,也应该进行调整,但在80C51系列单片机中没有十进制减法调整指令。为了进行十进制减法运算,可用加减数的补数来进行。两位十进制数是对100取补的。例如:减法60-30=30,也可以改为补数相加为:60+(100-30)=130。丢掉进位后,就得到正确的结果。115在实际运算时,不可能用9位二进制数来表示十进制数100,因为CPU是8位的。为此,可用8位二进制数10011010(9AH)来代替。因为这个二进制数经过十进制调整后就是100000000。

因此,十进制无符号数的减法运算可按以下步骤进行:(1)求减数的补数,即9AH-减数;(2)被减数与减数的补数相加;(3)对第二步的和进行十进制调整,就得到所求的十进制减法运算结果。

这里用“补数”而没有用“补码”,这是为了和带有符号位的补码相区别。由于现在操作数都是正数,没有必要再加符号位,故称“补数”更为合适一些。116

【例3-30】编写程序实现十进制减法,计算87-38。117

本节内容3.4.1加法指令3.4.2减法指令3.4.3乘、除法指令1183.4.3乘、除法指令

80C51系列单片机有乘、除法指令各一条,它们都是一字节指令,执行需4个机器周期的时间。一、乘法指令

MULAB;BA←(A)×(B)这条指令的功能:把累加器A和寄存器B中的两个8位无符号数相乘,所得16位乘积的低8位放在A中,高8位放在B中。

119乘法指令执行后会影响3个标志:若乘积小于FFH(即B的内容为零),则OV=0,否则OV=1;CY总是被清零;奇偶标志P仍按累加器A中“1”的个数来确定,“1”的个数是奇数P=1,反之P=0。【例3-31】已知(A)=80H,(B)=32H,试求执行指令MULAB的结果?解:=00H,(B)=19H,OV=1,CY=0,P=O。((A)×(B)=1900H,计算结果大于FFH)120二、除法指令

DIVAB;A←(A)/(B)之商,B←(A)/(B)之余数这条指令的功能:对两个8位无符号数进行除法运算。其中被除数存放在累加器A中,除数存放在寄存器B中,指令执行后,商存于累加器A中,余数存于寄存器B中。除法指令执行后也影响3个标志:若除数为零(B=O)时,OV=1,表示除法没有意义;若除数不为零,则OV=O,表示除法正常进行;CY总是被清零;奇偶标志P仍按累加器A中“1”的个数来确定,“1”的个数是奇数P=1,反之P=0。

121【例3-32】已知(A)=87H(135D),(B)=0CH(12D),试求执行指令DIVAB后的结果?

解:(A)=OBH;(B)=03H;OV=O;CY=O;P=1。122其中:CY为1,表示无符号数进行加、减法运算发生了进位或借位。OV为1,表示带符号数进行加、减法运算,结果超出补码的表达范围:-128~+127;或无符号数进行乘法运算时积超出255;或进行除法运算时除数为0;AC为1,如果用BCD码进行十进制加法时,AC为1,表示在加法指令后需要加十进制调整指令。P为1,表示存在于累加器A中运算结果1的个数为奇数。

算术运算类指令大多数要影响到程序状态字寄存器PSW中的四个标志位,算术运算指令对标志位的影响详见表3-2。123

本节内容3.5.1逻辑与运算指令3.5.2逻辑或运算指令3.5.3逻辑异或运算指令3.5.4累加器清零、取反指令3.5.5循环移位指令124逻辑运算的特点是按位进行。逻辑运算包括与、或、异或三类,每类都有6条指令。此外还有移位指令及对累加器A清零和求反指令,逻辑运算及移位类指令共有24条。1253.5.1逻辑与运算指令

ANLA,#data;A←(A)∧data

ANLA,direct;A←(A)∧(direct)ANLA,Rn

;A←(A)∧(Rn)ANLA,@Ri

;A←(A)∧((Ri))

前4条指令是将累加器A的内容和源操作数所指出的内容按位相与,结果存放在A中;

ANLdirect,A;direct←(direct)∧(A)ANLdirect,#data;direct←(direct)∧data

后两条指令是将直接地址单元中的内容和源操作数所指出的内容按位相与,结果存入直接地址所指定的单元中。

指令应用:用于将某些位屏蔽(即使之为0)。方法是:将要屏蔽的位和“0”相与,保留不变的位同“1”相与。126

本节内容3.5.1逻辑与运算指令3.5.2逻辑或运算指令

3.5.3逻辑异或运算指令3.5.4累加器清零、取反指令3.5.5循环移位指令1273.5.2逻辑或运算指令

ORLA,#data;A←(A)∧data

ORLA,di

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论