《单片机原理与实验教程》课件第3章_第1页
《单片机原理与实验教程》课件第3章_第2页
《单片机原理与实验教程》课件第3章_第3页
《单片机原理与实验教程》课件第3章_第4页
《单片机原理与实验教程》课件第3章_第5页
已阅读5页,还剩148页未读 继续免费阅读

下载本文档

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

文档简介

第3章CS-51指令系统

3.1概述3.2寻址方式3.3指令系统

3.4伪指令习题与思考题3.1概述

计算机是高度自动化的机器,它能自动进行运算和处理事务。整个自动操作过程是由CPU中的控制器完成的。控制器自动执行存放在存储器中的指令,而每一条指令规定计算机完成某种操作。计算机能直接识别的只能是0和1编码组成的指令,这种编码称为机器码或机器指令。由机器码编制的计算机能识别和执行的程序称为目标程序。每一条指令包含两个基本部分:操作码和操作数。操作码表明指令要执行的操作性质,操作数说明参数与操作的数据或数据所存放的地址。

MCS-51机器语言指令根据其指令编码的长短不同有单字节指令、双字节指令和三字节指令之分。

1.单字节指令

单字节指令格式由8位二进制编码表示,有两种形式:(1)8位编码全表示操作码。例如,空操作指令NOP,其机器码为

00000000(2)8位编码中包含操作码和寄存器编码,例如:

MOV

A,Rn这条指令的功能是把寄存器Rn(n=0,1,2,3,4,5,6,7)中的内容送到累加器A中去,其机器码为假设n=0,则寄存器编码为Rn=000(参见指令表),则指令MOVA,R0的机器码为E8H,其中操作码11101表示执行把寄存器中的数据传送到A中去的操作。000为R0寄存器的编码

2.双字节指令双字节指令格式中,指令的编码由两个字节组成,该指令存放在存储器时需要占用两个存储器单元。例如:

MOV

A,#DATA这条指令的功能是将立即数DATA送到累加器A中去。假设立即数DATA=85H,则其机器码为

3.三字节指令

三字节指令格式中第一字节为操作码,其后两字节为操作数。例如:

MOVdirect,#DATA这条指令的功能是把立即数DATA送到地址为direct的地址单元中去。假设direct=78H,DATA=80H,则指令MOV78H,#80H的机器码为用二进制编码表示的机器语言指令阅读困难,写起来费力,且难以记忆,因此在微机控制系统中采用汇编语言(用助记符和专门的语言规则表示指令的功能和特征)指令来编写程序。本章使用MCS-51的汇编语言来描述其指令功能。一条汇编语言指令中最多包含四个区段,如下所示:这四个区段之间要用分隔符分开:标号区段与操作码区段之间用冒号(:)隔开,操作码与操作数之间用空格隔开,操作数与注释区段之间用分号(;)分隔。如果操作数区段中有两个以上的操作数,则在操作数之间要用逗号(,)分隔开。例如,把立即数F0H送累加器的指令为标号区段是由用户定义的符号组成的,必须用英文大写字母开始。标号区段可有可无。若一条指令中有标号区段,则该标号代表该指令第一个字节所存放的存储器单元的地址,故标号又称符号地址,在汇编时,把该地址赋值给标号。操作码区段是指令的功能部分,不能缺省。它是便于记忆的助记符。例如,MOV是数据传送的助记符,ADD是加的助记符。操作数区段是指令要操作的数据信息。根据指令的不同功能,操作数可以有3个、2个、1个或没有操作数。上例中,操作数区段包含两个数——A和#0F0H,它们之间由逗号分隔。其中第二个操作数为立即数F0H,它是用十六进制数表示的以字母开头的数据。为区别于在操作区段出现的字符,故以字母开始的十六进制数据前都要加0,即把立即数F0H写成0F0H(这里的H表示此数为十六进制数,若为二进制数,则用B表示,十进制数用D表示或省略)。注释区段可有可无。加入注释的目的是为了便于阅读。程序设计者对指令或程序段做简要的功能说明,在阅读程序,尤其是在调试程序时会带来很大的方便。用汇编语言指令编写的程序,计算机不能直接识别,必须通过汇编程序把它翻译成机器码,这个翻译过程称为汇编。用人工查指令表的方法把汇编语言指令逐条翻译成对应的机器码,称为手工汇编,手工汇编对程序员来说,在某种场合经常用到。3.2寻址方式

在有操作数的指令中,操作数的数据可能在指令中或在寄存器中,也可能在存储器中或在I/O接口中。为正确地执行操作,就要对这些寄存器、存储器和I/O接口进行编号(也称地址号)。而在指令中要对这些设备内的数据进行操作就要指出地址。指令中所规定的寻找操作地址的方式称为寻址方式。每一种计算机都具有多种寻址方式。寻址方式的多少及寻址功能是反映指令系统优劣的主要指标之一。

MCS-51指令系统的寻址方式有以下几种:

·立即寻址;

·直接寻址;

·寄存器寻址;

·寄存器间接寻址;

·基址寄存器加变址寄存器寻址;

·相对寻址;下面逐一介绍各种寻址方式。

1.立即寻址

立即寻址方式是操作数包含在指令字节中,指令操作码后面字节的内容就是操作数本身,其数值由程序员在编制程序时指定,以指令字节的形式存放在程序存储器中。例如:机器码助记符注释

7470 MOVA,#70 ;70H→A指令功能是将立即数70H送入累加器A,这条指令为双字节指令,操作数本身70H跟在操作数74H后面,以指令形式存放在程序存储器内。在MCS-51指令系统中还有一条立即数为双字节的指令:机器码助记符注释

908200

MOVDPTR,#8200H;82H→DPH,00H→DPL这条指令存放在程序存储器中,占三个存储单元。请注意,在MCS-51汇编语言指令表中,立即数通常用data表示,立即数前面必须有符号“#”,上述两例写成一般格式为

MOV

A,#data

MOV

DPTR,#data16这里,#data表示8位立即数,#data16表示16位立即数。

2.直接寻址

直接寻址是指在指令中含有操作数的直接地址,该地址指出了参与操作的数据所在的地址或位地址。直接寻址方式中操作数存储的空间有三种:

(1)内容数据存储器的低128个字节单元(00H~7FH)。 例如:

MOV

A,70H;(70H)→A此指令功能是把内部RAM的70H单元的内容送入累加器A。

(2)位地址空间。例如:

MOV

C,00H;直接将(00H)→进位标志位

(3)专用功能寄存器。专用功能寄存器只能用直接寻址方式进行访问,例如:

MOV

IE,#85H;立即数85H→中断允许寄存器IE

IE专用功能寄存器的字节地址为0A8H。

3.寄存器寻址

由指令指出某一个寄存器中的内容为操作数的寻址方式称为寄存器寻址方式。在这种寻址方式中,指令的操作码中包含了参加操作的寄存器的编号(指令操作码字节的低3位指明寻址的寄存器)。MCS-51指令系统中寄存器寻址的工作寄存器是R0~R7。例如:

INC

R0;(R0)+1→R0此指令的功能是对寄存器R0进行操作,使其内容加1。

4.寄存器间接寻址

由指令指出某一个寄存器的内容作为操作数的地址的寻址方式称为寄存器间接寻址方式。这里应注意,在寄存器间接寻址方式中,存放在寄存器中的内容不是操作数,而是操作数所在的存储器单元地址。寄存器间接寻址只能使用寄存器R0或R1,作为地址指针来寻址内部RAM(00H~FFH)中的数据。寄存器间接寻址也适用于访问外部RAM,可使用R0、R1或DPTR作为地址指针。寄存器间接寻址用符号“@”表示。例如:

MOV

A,@R0[DW];((R0))→A此指令的功能是把R0所指向的内部RAM单元中的内容送累加器A。若R0内容为60H,而内部RAM的60H单元的内容是3BH,则指令MOVA,@R0的功能是将3BH这个数送到累加器A,如图3-1所示。图3-1寄存器间接寻址

5.基址寄存器加变址寄存器间接寻址

这种寻址方式用于访问程序存储器中的数据表格,它把基址寄存器(DPTR或PC)和变址寄存器(A)的内容作为无符号数相加形成16位的地址,访问程序存储器中的数据表格。例如:

MOVC

A,@A+DPTR;A+DPTR所指的程序存储器的内容→A

MOVC

A,@A+PC ;A+PC所指的程序存储器的内容→A

A中为无符号数,指令功能是把A的内容和DPTR或PC的内容相加得到程序存储器的有效地址,把该寄存器单元中的内容送到A。

6.相对寻址这类寻址方式是以PC的内容作为基地址,加上指令中给定的偏移量所得结果作为转移地址,它只适用于双字节转移指令。偏移量是带符号数,在-128~+127范围内,用2的补码表示。例如:

JCrel;C=1跳转第一字节为操作码,第二字节就是相对于程序计数器PC当前地址的偏移量rel。若转移指令操作码放在1000H单元,偏移量存放在1001H单元,则该指令执行后PC已为1002H。设偏移量rel为05H,则转移地址为1007H。当C=1时,将转去执行1007H单元中的指令。3.3指令系统

3.3.1指令分类

MCS-51指令系统有42种助记符,代表了33种操作功能,这是因为有的功能可以有几种助记符(例如数据传送的助记符有MOV、MOVC、MOVX)。指令功能助记符与操作数各种可能的寻址方式相结合,共构成111种指令。这111种指令中,如果按字节分类,单字节指令49条,双字节指令45条,三字节指令17条。若从指令执行的时间看,单机器周期(12个时钟周期)指令64条,双机器周期指令45条,4机器周期指令2条(乘、除)。在12MHz晶振的条件下,单机器周期指令、双机器周期指令、4机器周期指令的执行时间分别为1μs、2μs和4μs。由此可见,MCS-51指令系统具有存储空间效率高和执行速度快的特点。按指令的功能,MCS-51指令系统可分为下列五类:(1)数据传送类;(2)算术运算类;(3)逻辑操作类;(4)位操作类;(5)控制转移类;下面根据指令的功能特性分类介绍。在分类介绍之前,先把描述指令的一些符号做简单说明。

·Rn:现行选定的寄存器区中的8个寄存器R7~R0(n=0~7)。

·direct:8位内部数据存储单元地址。它可以是一个内部数据RAM单元(0~127)或一个专用寄存器地址(即I/O口、控制寄存器、状态寄存器等(128~255))。

·@Ri:通过寄存器R1或R0间接寻址的8位内部数据RAM单元(0~255),i=0,1。

·#data:指令中的8位立即数。

·#data16:指令中的16位立即数。

·Addr16:16位目标地址,用于LCALL和LJMP指令,可指向64KB程序存储器地址空间的任何地方。

·Addr11:11位目标地址,用于ACALL和AJMP指令,转向至下一条指令第一字节所在的同一个2KB程序存储器地址空间内。

·rel:带符号(2的补码)的8位偏移量字节。用于SJMP和所有条件转移指令中。偏移字节是相对于下一条指令的第一字节计算的,在-128~+127范围内取值。

·bit:内部数据RAM或专用功能寄存器里的直接寻址位。

·DPTR:数据指针,可用作16位地址寄存器。

·A:累加器。

·B:专用寄存器,用于乘(MUL)和除(DIV)指令中。

·C:进位标志或进位位。

·/bit:表示对该位操作数取反。

·(X):X中的内容。

·((X)):由X所指出的单元中的内容。3.3.2数据传送类指令数据传送指令一般的操作是把源操作数传送到指令所指定的目标地址,指令执行后,源操作数不变,目的操作数为源操作数所代替。数据传送是一种最基本、最主要的操作,它是编制程序时使用最频繁的一类指令,数据传送的速度对整个程序的执行效率有很大的影响。在MCS-51指令系统中,数据传送指令非常灵活,它可以把数据方便地传送到数据存储器和I/O口。数据传送类指令用到的助记符有:MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP。数据传送类指令源操作数和目的操作数的寻址方式及传送路径如图3-2所示。数据传送类指令见表3-1。图3-2

MCS-51传送指令示意图表3-1数据传送类指令

数据传送类指令比较简单,由图3-2和表3-1很容易理解各种指令的功能,故不做详细叙述,下面仅做一些必要的说明。

1.以直接地址为目标操作数和源操作数的传送指令助记符机器码

MOVdirect1,direct2

10000101+直接地址(目标)

+直接地址(源)这是一条三字节指令,指令的第一字节为操作码,第二字节为源操作数的地址,第三字节为目标操作数的地址。源操作数和目标操作数的地址都以直接地址形式表示,它们可以是内部RAM存储器或专用寄存器。指令的功能很强,能实现内部RAM之间、专用寄存器之间或专用寄存器与内部RAM之间的直接数据传送。例如:

MOV

E0H,78H其中,目标操作数地址E0H为累加器的字节地址,源操作数地址78H为内部RAM单元地址,指令的功能是把内部RAM的78H单元的数据传送到累加器ACC中去。指令的机器码为85H、78H和E0H。

2.累加器与外部数据存储器之间的数据传送指令

该类指令有下面两组。

1)由DPTR指出外部数据的存储地址

(1)外部数据存储器内容送累加器。助记符机器码功能

MOVX

A,@DPTR11100000A←((DPTR))执行这条指令时,P3.7引脚上输出RD[TX-有效信号,用作外部数据存储器的读选通信号。DPTR所含的16位地址信息由P0口(低8位)和P2口(高8位)输出。选中单元的数据由P0口输入到累加器,P0口做分时复用的总线。

(2)累加器内容送外部数据存储器。助记符机器码功能

MOVX

@DPTR,A111100000(DPTR)←A执行这条指令时,P3.6引脚上输出WR[TX-有效信号,用作外部数据存储器的写选通信号。DPTR所含的16位地址信息由P0口(低8位)和P2口(高8位)输出。累加器的内容由P0口输出,P0口做分时复用总线。

2)由Ri指出外部数据的存储器地址

(1)外部数据存储器内容送累加器。助记符机器码功能

MOVXA,@Ri1110001i(i取值0或1,以下同)

A←((Ri))+((P2))执行该指令时,在P3.7引脚上输出有效信号,用作外部数据存储器的读选通信号。Ri所包含的低8位地址由P0口输出,而高8位地址由P2口输出。选中单元的数据由P0口输入到累加器。【例3-1】设外部数据存储器2097H单元中的内容为80H,则在执行下列指令后,A中的内容为80H。

MOV

P2,#20H

MOV

R0,#97H

MOVX

A,@R0

(2)累加器内容送外部数据存储器。助记符机器码功能

MOVX@Ri,A1111001i(Ri)+(P2)←(A)执行该指令时,在P3.6引脚上输出有效信号,用作外部数据存储器的写选通信号。P0口上分时输出由Ri指定的低8位地址及输入外部数据存储器单元的内容。高8位地址由P2口输出。

3.程序存储器内容送累加器的传送指令

这类指令有两条,常用于查表。

(1)助记符机器码功能MOVCA,@A+PC10000011PC←(PC)+1,A←((A)+PC))这条指令的功能是以PC作为基址寄存器,A的内容作为无符号数和PC内容(下一条指令第一字节地址)相加后得到一个16位的地址,把该地址指出的程序存储器单元的内容送到累加器A。

【例3-2】(A)=30H,执行下列指令:地址指令

1000H:MOVCA,@A+PC结果为:程序存储器中1031H单元的内容送入A。这条指令的优点是不改变专用功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点是表格只能存放在该条查表指令后面的256个单元之内,因此表格大小受到限制,而且表格只能被该段程序所使用。(2)助记符机器码功能

MOVCA,@A+DPTR

10010011A←((A)+(DPTR))

这条指令的功能是以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加,得到一个16位的地址,把该地址指出的程序存储器单元的内容送到累加器A。

【例3-3】[HT][ST](DPTR)=8100H,(A)=40H,执行下列指令:

MOVC

A,@A+DPTR结果为:程序存储器中8140H单元的内容送入累加器A。这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关,因此,表格大小和位置可在64KB程序存储器中任意安排,一个表格可被各个程序块公用。

4.栈操作指令在MCS-51内部RAM中可以设定一个后进先出的区域(LIFO),称为堆栈。在专用功能寄存器中有一个堆栈指针SP,它指出栈顶的位置。在指令系统中有下列两条用于数据传送的栈操作指令。

(1)进栈指令。

助记符机器码功能

PUSHdirect11000000+直接地址SP←(SP)+1,(SP)←(direct)

这条指令的功能是首先将栈指针SP的内容加1,然后把直接地址指出的单元内容传送到栈指针SP所指的内部RAM单元中。

【例3-4】

(SP)=60H,(ACC)=30H,(B)=70H,执行下列指令:

PUSHACC;SP←(SP)+1,即SP←61H,61H←(ACC)

PUSHB;SP←(SP)+1,即SP←62H,62H←(B)结果为:(61H)=30H,(62H)=70H,(SP)=62H。(2)出栈指令。助记符机器码功能

POPdirect

11010000+直接地址direct←((SP)),

SP←(SP)-1这条指令的功能是将栈指针SP所指的内部RAM单元的内容送入直接地址指出的字节单元中,栈指针SP的内容减1。【例3-5】(SP)=62H,(62H)=70H,(61H)=30H,执行下列指令:

POPDPH;DPH←((SP)),SP←(SP)-1

POPDPL;DPL←((SP)),SP←(SP)-1结果为:(DPTR)=7030H,(SP)=60H。执行指令POPdirect不影响标志,但当直接地址为PSW时,可以使一些标志改变。这也是通过指令强行修改标志的一种方法。

【例3-6】假设已把PSW的内容压入栈顶,用下列指令修改PSW内容,使F0、RS1、RS0均为1,最后用出栈指令把内容送回程序状态字PSW,实现对PSW内容的修改。MOVC

R0,SP;取栈指针

ORL

@R0,#38H;修改栈顶内容

POP

PSW;修改PSW

5.字节交换指令这组指令的功能是将累加器A的内容和源操作数内容相互交换。源操作数有寄存器寻址、直接寻址和寄存器间接寻址等寻址方式。助记符机器码功能

XCHA,Rn11001iii

(A)→(Rn)

XCHA,@Ri1100011i

(A)→((Ri))

XCHA,direct11000101+直接地址(A)(direct)

【例3-7】(A)=80H,(R7)=80H,执行下例指令:

XCHA,R7;(A)(R7)结果为:(A)=08H,(R7)=80H。

6.半字节交换指令半字节交换指令只有一条:助记符机器码功能

XCHDA,@Ri1101011i

(A3~A0)((R1)3~0)这条指令的功能是将A的低4位和R0或R1指出的RAM单元低4位相互交换,各自的高4位不变。3.3.3算术运算类指令

在MCS-51指令系统中,具有单字节的加、减、乘、除法指令(见表3-2),其运算功能比较强。算术运算指令执行的结果将影响进位(CY)、辅助进位(AC)和溢出标志位(OV)等,但是加1和减1指令不影响这些标志。对标志位有影响的所有指令列于表3-3中,其中包括一些非算术运算的指令在内。注意,对于特殊功能寄存器(专用寄存器)字节地址、D0H或位地址D0H~D7H进行操作也会影响标志。表3-2算术运算类指令

表3-3影响标志位的指令

注:“×”表示指令执行对标志位有影响(置位或复位)

算术运算类指令可分为8组。

1.加法指令助记符机器码

ADDA,Rn

001010iii

ADDA,direct00100101+直接地址

ADDA,@Ri0010011i

ADDA,#data00100100+立即数这组加法指令的功能是把指出的字节变量加到累加器A上,其结果放在累加器中。相加过程中如果位7(d7)有进位(即C7=1),则进位位CY置1,否则清0;如果位3(d3)有进位,则辅助进位位AC置1,否则清0;如果位6(d6)有进位输出(即C6=1)而位7没有或者位7有进位输出而位6没有,则溢出标志OV置1,否则清0。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。

【例3-8】[HT][ST](A)=85H,(R0)=20H,(20H)=0AFH,执行下列指令:

ADD

A,@R0运算过程如下:结果为:(A)=34H,CY=1,AC=1,OV=1。对于加法,溢出只能发生在两个加数符号相同的情况下。在进行带符号数的加法运算时,溢出标志OV是一个重要的编程标志,利用它可以判断两个带符号数相加时,和数是否溢出(即和大于+127或小于-128)。2.带进位加法指令

助记符机器码

ADDC

A,Rn00111iii

ADDC

A,direct00110101+直接地址

ADDC

A,@Ri0011011i

ADDC

A,#data00110100+立即数这组带进位加法指令的功能是把所指出的字节变量、进位标志与累加器A内容相加,结果留在累加器中,如果位7有进位,则进位位CY置1,否则清0。如果位3有进位,则辅助进位位AC置1,否则清0。如果位6有进位而位7没有或者位7有进位而位6没有,则溢出标志OV置位,否则清0。寻址方式和ADD指令相同。

【例3-9】[HT][ST]

(A)=85H,(20H)=0FFH,CY=1,执行下列指令:

ADDC

A,20H运算过程如下:结果为:(A)=85H,CY=1,AC=1,OV=0。

3.增量指令

助记符机器码

INCA00000100

INCRn00001iii

INCdirect00000101+直接地址

INC@Ri0000011i

INCDPTR10100011这组增量指令的功能是把所指出的变量加1,若原来为0FFH,将溢出为00H,不影响任何标志。操作数有寄存器寻址、直接寻址和寄存器间接寻址方式。注意:[HT]当用本指令修改输出口Pi(即指令中的direct为端口P0~P3,地址分别为80H,90H,A0H,B0H)时,其功能是修改输出口的内容。指令执行过程中,首先读入端口的内容,然后在CPU中加1,继而输出到端口。这里读入端口的内容来自端口的锁存器而不是端口的引脚。

【例3-10】[HT][ST](A)=0FFH,(R3)=0FH,(30H)=0F0H,(R0)=40H,(40H)=00H,执行下列指令:

INCA;A←(A)+1

INCR3;R3←(R3)+1

INC30H;30H←(30H)+1

INC@R0;(R0)←((R0))+1结果为:(A)=00H,(R3)=10H,(30H)=0F1H,(40H)=01H,不改变PSW状态。

4.十进制调整指令

助记符机器码

DAA

11010100这条指令对累加器参与的BCD码加法运算所获得的8位结果(在累加器中)进行十进制调整,使累加器中的内容调整为2位BCD码数。该指令执行的过程如图3-3所示。图3-3

DAA指令执行示意图

【例3-11(A)=56H,(R5)=67H,执行下列指令:ADDA,R5

DAA结果为:(A)=23H,CY=1。

5.带进位减法指令

助记符机器码

SUBB

A,Rn10011iii

SUBB

A,direct10010101+直接地址

SUBB

A,@Ri1001011i

SUBB

A,#data10010100+立即数这组带进位减法指令的功能是从累加器中减去指定的变量和进位标志,结果存放在累加器中。进位减法过程中如果位7需借位,则CY置1,否则CY清0;如果位3需借位,则AC置数,否则AC清0;如果位6需借位,而位7不需借位,或者位7需借位,而位6不需借位,则溢出标志位OV置1,否则清0。在带符号数运算时,只有当符号不相同的两数相减时才发生溢出。

6.减1指令

助记符机器码

DECA00010100

DECRn00011iii

DECdirect00010101+直接地址

DEC@Ri0001011i这组指令的功能是将指定的变量减1。若原来为00H,则减1后下溢为0FFH,不影响标志位。当指令中的直接地址direct为P0~P3端口(即80H,90H,A0H,B0H)时,指令可用来修改一个输出口的内容,即是一条具有读-修改-写功能的指令。指令执行时,首先读入端口的原始数据,在CPU中执行减1操作,然后再送到端口。注意:此时读入的数据来自端口的锁存器而不是引脚。

【例3-12】[HT][ST](A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行下列指令:

DECA;A←(A)-1

DECR7;R7←(R7)-1

DEC30H;30H←(30H)-1

DEC@R1;R1←((R1))-1结果为:(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,不影响标志。7.乘法指令助记符机器码

MULAB10100100这条指令的功能是将累加器A和寄存器B中的无符号8位整数相乘,其16位积的低位字节存在累加器A中,高位字节存在寄存器B中。如果积大于255(0FFH),则溢出标志位OV置位,否则OV清0。进位标志总是清0。

【例3-13】(A)=50H,(B)=0A0H,执行下列指令:MULAB结果为:(B)=32H,(A)=00H(即积为3200H),CY=0,OV=1。

8.除法指令

助记符机器码

DIVAB10100100这条指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得商的整数部分存放在累加器A中,余数部分存放在寄存器B中。进位位CY和溢出标志位OV清0。如果原来B中的内容为0(被零除),则结果A和B中内容不定,且溢出标志位OV置位。在任何情况下,都将CY

清0。

【例3-14】[HT][ST](A)=0FBH,(B)=12H,执行下列指令:

DIVAB结果为:(A)=0DH,(B)=11H,CY=0,OV=0。3.3.4逻辑操作类指令逻辑操作类指令见表3-4。表3-4逻辑操作类指令

1.简单逻辑操作指令

(1)累加器清0指令。助记符机器码

CLRA11100100这条指令的功能是将累加器A清0,不影响CY、AC、OV等标志。

(2)累加器内容按位取反指令。助记符机器码

CPLA11110100这条指令的功能是将累加器A的每一位逻辑取反,原来为1的位变0,原来为0的位变1,不影响标志。

【例3-15】[HT][ST]执行下列指令:

CPLA结果为:(A)=01010101B

(3)左循环移位指令。

·累加器内容循环左移:助记符机器码

RLA00100011这条指令的功能是把累加器ACC的内容向左循环移1位,位7循环移入位0,不影响标志,如下所示。

·累加器带进位左循环移位指令:助记符机器码

RLCA00110011这条指令的功能是将累加器ACC的内容和进位标志一起向左循环移1位,ACC的位7移入进位位CY,CY移入ACC的0位,不影响其他标志位,如下所示。

(4)右循环移位指令。

·累加器内容循环右移指令:助记符机器码

RRA00000011这条指令的功能是将累加器ACC的内容向右循环移1位,ACC的位0循环移入ACC的位7,不影响标志,如下所示。

·累加器带进位右循环移位指令。助记符机器码

RRCA00010011这条指令的功能是将累加器ACC的内容和进位标志CY一起向右循环移一位,ACC的位0移入CY,CY移入ACC的位7不影响其他标志位,如下所示。

(5)累加器半字节交换指令。助记符机器码

SWAPA11000100这条指令的功能是将累加器ACC的高半字节(ACC7~ACC4)和低字节(ACC3~ACC0)互换。

【例3-16】(A)=0C5H,执行下列指令:

SWAPA结果为:(A)=5CH。

2.逻辑与指令

助记符 机器码

ANLA,Rn010111iii

ANLA,direct01010101+直接地址

ANL@Ri

0101011i

ANLA,#data01010100+立即数

ANLdirect,A01010010+直接地址

ANLdirect,#data01010011+直接地址+立即数这组指令的功能是在指出的变量之间以位为基础进行逻辑与操作,将结果存放在目的变量中。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等寻址方式。当这条指令用于修改一个输出口时,作为原始口数据的值将从输出口数据锁存器(P0~P3)读入,而不是读引脚状态。

【例3-17】[HT][ST]已知有下列指令:

ANLA,R1;A←(A)∧(R1)

ANLA,70H;A←(A)∧(70H)

ANLA,@R0;A←(A)∧((R0))

ANLA,#07H;A←(A)∧07H

ANL70H,A;70H←(70H)∧(A)

ANLP1,#0F0H;P1←(P1)∧0F0H设(A)=07H,(R0)=0FDH,则执行指令

ANLA,R0后,结果为即(A)=05H。

3.逻辑或指令助记符机器码

ORLA,Rn01001iii

ORLA,direct01000101+直接地址

ORLA,@Ri0101011i

ORLA,#data01000100+立即数

ORLdirect,A01000010+直接地址

ORLdirect,#data01000011+直接地址+立即数这组指令的功能是在所指出的变量之间执行以位为基础的逻辑或操作,结果存到目的变量中。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。同ANL指令类似,ORL指令用于修改输出口数据时,原始数据值为口锁存器内容。

【例3-18】[HT][ST]已知有下列指令:

ORLA,R7;A←(A)∨(R7)

ORLA,70H;A←(A)∨(70H)

ORLA,@R1;A←(A)∨((R1))

ORLA,#03H;A←(A)∨03H

ORL70H,#7FH;70H←(70H)∨7FH

ORL78H,A;78H←(78H)∨(A)设(P1)=05H,(A)=33H,则执行指令:

ORLP1,A后,结果为即(P1)=37H。

4.逻辑异或指令

助记符机器码

XRLA,Rn01101iii

XRLA,direct01100101+直接地址

XRLA,@Ri0110011i

XRLA,#data01100100+立即数

XRLdirect,A01100010+直接地址

XRLdirect,#data01100011+直接地址+立即数这组指令的功能是在所指出的变量之间执行以位为基础的逻辑异或操作,结果存放到目的变量中去。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。对输出口Pi(i=0,1,2,3),与ANL指令一样是对口锁存器内容读出修改。

【例3-19】[HT][ST]已知有下列指令:

XRLA,R4;A←(A)(R4)

XRLA,50H;A←(A)(50H)

XRLA,@R0;A←(A)((R0))

XRLA,#00H;A←(A)00H

XRL30H,A;30H←(30H)(A)

XRL40H,#0FH;40H←(40H)0FH设(A)=90H,(R3)=73H,则执行指令

XRLA,R3后,结果为即(A)=0E3H。

3.3.5位操作类指令

MCS-51单片机内部有一个布尔处理机,因此对位地址空间具有丰富的位操作指令,如表3-5所示。表3-5位操作及控制转移类指令

1.数据位传送指令

助记符机器码

MOVC,bit10100010+位地址

MOVbit,C10010010+位地址这组指令的功能是把由源操作数指出的布尔变量送到目的操作数指定的位中去,其中一个操作数必须为进位标志,另一个可以是任何直接寻址位,不影响其他寄存器和标志位。例如:

MOV

C,60H;CY←(20H).6

MOV

P1.0,C;P1.0←CY

2.位变量修改指令

助记符 机器码

CLRC11000011

CLRbit11000010+位地址

CPLC10110011

CPLbit10110010+位地址

SETBC11010011

SETBbit11010010+位地址这组指令的功能是将操作数指出的位清0、取反、置1,不影响其他标志位。例如:

CLR

C;CY←0CLR

27H;(24H).7←0CPL

08H;(21H).0←SETB

P1.7;P1.7←1

3.位变量逻辑与指令

助记符 机器码

ANL

C,bit10000010+位地址

ANL

C,/bit10110000+位地址这组指令的功能是,如果源位的布尔值是逻辑0,则进位标志清0,否则进位标志保持不变。操作数前的斜线(/)表示用寻址位的逻辑非作源值,但不影响源位本身,不影响其他标志位。源操作数只有直接位寻址方式。【例3-20】设P1为输入口,P3.0做输出线,执行下列指令:MOV

C,P1.0;CY←(P1.0)ANL

C,P1.1;CY←(CY)∧(P1.1)ANL

C,/P1.2;CY←(CY)∧(

)MOV

P3.0,C;P3.0←CY

结果为:P3.0=(P1.0)∧(P1.1)∧(

)。4.位变量逻辑或指令

助记符 机器码

ORL

C,bit00100010+位地址

ORL

C,/bit10100000+位地址这组指令的功能是,如果源位的布尔值为1,则置位进位标志,否则进位标志CY保持原来状态。同样,斜线(/)表示逻辑非。

【例2-21】[HT][ST]

P1口为输出口,执行下列指令:

MOVC,00H;CY←(20H).0

ORLC,01H;CY←(CY)∨(20H).1

ORLC,02H;CY←(CY)∨(20H).2

ORLC,03H;CY←(CY)∨(20H).3

ORLC,04H;CY←(CY)∨(20H).4

ORLC,05H;CY←(CY)∨(20H).5

ORLC,06H;CY←(CY)∨(20H).6

ORLC,07H;CY←(CY)∨(20H).7

MOVP1.0,C;P1.0←CY

结果为:内部RAM的20H单元中只要有一位为1,则P1.0输出就为1。5.位变量条件转移指令

助记符 机器码转移条件

JCrel

01000000+相对地址rel

CY=1

JNCrel

01010000+相对地址rel

CY=0

JBbit,rel

00100000+位地址+相对地址rel

(bit)=1

JNBbit,rel00110000+位地址+相对地址rel

(bit)=0

JBCbit,rel00010000+位地址+相对地址rel

(bit)=1这一组指令的功能为

·JC:如果进位标志CY为1,则执行转移。

·JNC:如果进位标志CY为0,则执行转移。

·JB:如果直接寻址位的值为1,则执行转移。

·JNB:如果直接寻址位的值为0,则执行转移。

·JBC:如果直接寻址位的值为1,则执行转移,然后将直接寻址的位清0。

3.3.6控制转移类指令1.无条件转移指令

(1)绝对转移指令。助记符 机器码

AJMPaddr11

a10a9a800001a7a6a5a4a3a2a1a0

这条指令是2KB范围内的无条件跳转指令,功能是把程序的执行转移到指定的地址。该指令在运行时先将PC加2,然后通过把指令中的a10~a0→(PC10~PC0),得到跳转目的地址(即PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0),送入PC。目标地址必须与AJMP后面一条指令的第一个字节在同一个2KB区域的存储器区内。指令的操作码与转移目标地址所在的页号有关。

【例3-22】有如下指令:

KWR:AJMPaddr11

如果addr11=00100000000B,标号KWR的地址为1030H,则执行该条指令后,程序将转移到1100H。此时该指令的机器码为21H,00H(a10a9a8=001,故指令第一字节为21H)。

(2)相对转移(短跳转)指令。助记符 机器码

SJMPrel

10000000+相对地址rel这是条无条件跳转指令,执行时在PC加2后,把指令中带符号的位移值加到PC上,并计算出转向地址。因此,转向的目标地址可以在这条指令前128B到后127B之间。

【例3-23】[HT][ST]有如下指令:

KRD:SJMPPKRD如果标号KRD的值为0100H(即指令SJMP的机器码存放于0100H和0101H这两个单元中),标号PKRD的值为0123H,即跳转的目的地址为0123H,则指令的第二字节(相对偏移量)应为

rel=0123H-0102H=21H(3)长跳转指令。助记符 机器码

LJMPaddr16

00000010+a15…a8a7…a0

这条指令的功能是把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向地址。转移的目标地址可以在64KB程序存储器地址空间的任何地方,不影响任何标志位。

【例3-24】[HT][ST]执行指令

LJMP8100H不管这条长跳转指令存放在什么地方,执行时将使程序转移到8100H单元。这和AJMP、SJMP指令是有差别的。

(4)散转指令。助记符 机器码

JMP@A+DPTR

01110011这条指令的功能是把累加器中8位无符号数与数据指针DPTR中的16位数相加,将结果作为下条指令地址送入PC,不改变累加器和数据指针内容,也不影响标志位。利用这条指令能实现程序的散转。

【例3-25】如果累加器A中存放着待处理命令编号(0~7),程序存储器中存放着标号为PMTB的转移表首地址,则执行下面的程序后,将根据A中的命令编号转向相应的命令处理程序。

PM:MOV

R1,A;(A)*3→A

RLA

ADDA,R1MOVDPTR,#PMTB;转移表首地址→DPTR

JMP@A+DPTR;跳转到((A)+(DPTR))间接地址单元

PMTB:LJMPPM0;转向命令0处理入口

LJMPPM1;转向命令1处理入口

LJMPPM2;转向命令2处理入口

LJMPPM3;转向命令3处理入口

LJMPPM4;转向命令4处理入口

LJMPPM5;转向命令5处理入口

LJMPPM6;转向命令6处理入口

LJMPPM7;转向命令7处理入口

2.条件转移指令条件转移指令是依某种特定条件转移的指令,条件满足时转移(相当于一条相对转移指令),条件不满足时则顺序执行下面的指令。目的地址在下一条指令的起始地址为中心的256个字节范围中(-128~+127)。当条件满足时,先把PC加到指向下一条指令的第一个字节地址,再把有符号的相对偏移量加到PC上,计算出转移地址。助记符 机器码转移条件

JZrel01100000+相对地址rel(A)=0

JNZrel01110000+相对地址rel(A)≠0上述两条指令的功能是:·JZ:如果累加器ACC的内容为0,则执行转移。·JNZ:如果累加器ACC的内容不为0,则执行转移。

3.比较不相等转移指令助记符机器码

CJNEA,direct,rel10110101+直接地址+相对地址

CJNEA,#data,rel10110100+立即数+相对地址

CJNERn,#data,rel10111rrr+立即数+相对地址

CJNE@Ri,#data,rel1011011i+立即数+相对地址这组指令的功能是比较前面两个操作数的大小,如果它们的值不相等则转移。在PC加载下一条指令的起始地址后,通过把指令最后一个字节的有符号的相对偏移量加到PC上,并计算出转向地址。如果第一个操作数(无符号整数)小于第二个操作数,则进位标志CY置位,否则CY清0,不影响任何一个操作数的内容。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等寻址方式。

【例3-26】[HT][ST]根据A的内容大于60H、等于60H、小于60H三种情况作不同的处理程序。程序如下:

CJNEA,#60H,NEQ;(A)不等于60H转移

EQ:…;(A)=60H处理程序

NEQ:JCLOW;(A)<60H转移;(A)>60H处理程序

LOW:;(A)<60H处理程序

4.减1不为0转移指令

助记符机器码

DJNZRn,rel11011rrr+相对地址

DJNZdirect,rel11010101+直接地址+相对地址这组指令把源操作数减1,结果回送到源操作数中去,如果结果不为0则转移。源操作数有寄存器寻址和直接寻址两种寻址方式。通常程序把内容RAM单元用作程序循环计数器。

【例3-27】延时程序举例。

START:SETB

P1.1;P1.1←1

DL:MOV30H,#03H;30H←03H(置初值)DL0:MOV31H,#0F0H;31H←0F0H(置初值)

DL1:DJNZ31H,DL1;31H←(31H)-1,(31H)不为0重复执行

DJNZ30H,DL0;30H←(30H)-1,(30H)不为0转DL0

CPLP1.1;P1.1求反

SJMPDL;转DL这段程序的功能是通过延时,在P1.1输出一个方波,可以用改变30H和31H的初值的方法来改变延时时间,从而改变方波的频率。

5.调用及返回指令

在程序设计中,常常把具有一定功能的公用程序段编制成子程序。当主程序转至子程序时调用指令,而在子程序的最后安排一条返回指令,使执行完子程序后再返回到主程序。为保证正确返回,每次调用子程序时自动将下条指令地址保存到堆栈,返回时按先进后出原则再把地址弹出到PC中。调用及返回指令见表3-6。表3-6控制程序转移指令

注:如果第一操作数小于第二操作数,则CY置位,否则CY清0。

(1)绝对调用指令。助记符 机器码

ACALLaddr11a10a9a810001a7a6a5a4a3a2a1a0

这条指令无条件地调用位于指令所指地址的子程序。指令执行时PC加2,以获得下一条指令的地址,并把这16位地址压入堆栈,栈指针加2;然后把指令中的a10~a0值送入PC的PC10~PC0位,PC的PC15~PC11不变,获得子程序的起始地址(即PC15PC14PC13PC12PC11a10a9a8a7a6a5a4a3a2a1a0)后转向执行子程序。所用的子程序的起始地址必须与ACALL后面一条指令的第一个字节在同

温馨提示

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

评论

0/150

提交评论