第3.1章-MCS-51单片机的指令系统_第1页
第3.1章-MCS-51单片机的指令系统_第2页
第3.1章-MCS-51单片机的指令系统_第3页
第3.1章-MCS-51单片机的指令系统_第4页
第3.1章-MCS-51单片机的指令系统_第5页
已阅读5页,还剩141页未读 继续免费阅读

下载本文档

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

文档简介

【主要内容】1.掌握单片机源操作数和目的操作数的寻址方式,指令格式操作码和操作数,数据传送指令、算术运算类指令、逻辑运算及位移指令、控制转移类指令等指令系统。2.熟悉指令描述符号,入栈和出栈操作。3.了解十进制调整指令和空操作指令。【重点与难点】1.重点:指令格式和指令系统2.难点:源操作数和目的操作数的寻址方式第3章MCS-51的指令系统和汇编语言程序设计2024/3/19嵌入式应用基础2

MCS-51的7种寻址方式.寻址方式,是学习指令的前提。 MCS-51有111条指令,其中49条单字节指令,45条双字节指令,17条三字节指令;按运算速度分类,有64条单周期指令,45条双周期指令,2条四周期指令。2024/3/19嵌入式应用基础3指令:是规定计算机进行操作的命令。指令系统:计算机能够执行的各种指令的集合。MCS-51指令系统是最普遍的。

机器指令与汇编语言指令

机器指令:以二进制代码表达,能直接被计算机所识别和执行。

指令由操作码和操作数两部分组成。3.1MCS-51单片机的指令系统2024/3/19嵌入式应用基础4机器指令难以被人们理解、记忆与使用

汇编语言指令:用便于记忆与理解的助记符和符号地址来表达的指令。指令格式:指令的表示形式。

两部分组成,即操作码和操作数。

操作码:规定指令进行什么操作

操作数:指令操作的对象2024/3/19嵌入式应用基础5

使P1.0清零的汇编语言指令如表中第2列第2行所示,其中助记符CLR(clear缩写)就是操作码,P1.0就是符号地址。

汇编语言指令与机器指令之间有一一对应的关系。2024/3/19嵌入式应用基础6

指令由操作码和操作数组成,操作数是可选项,还有源、目之分,指令格式举例:操作码[目的操作数],[源操作数]MOV

A, #30H

操作码:由MCS-51关键字表示的字符串,用来指示指令的操作功能。

操作码与操作数之间必须用空格分隔。2024/3/19嵌入式应用基础7

操作数:指示参加指令操作的数据或数据的地址,与操作码一起确定了指令所要执行的具体操作。 操作数如果有2个或多个,则操作数之间必须用逗号分隔。操作数可以是寄存器名、常数、标号名;还可是表达式,如ADDA,‘a’+1;也可用PC的当前值“$”,如SJMP$。2024/3/19嵌入式应用基础8指令系统中所用符号的说明1.Rn:工作寄存器n为0-72.#data:8位立即数,范围00H-FFH3.Direct:8位直接地址,也可以为SFR中的一个4.@Ri:表示寄存器间接寻址,i=0、15.#data16:16位立即数6.@DPTR:表示以DPTR为数据指针的间接寻址7.Bit:位寻址指令系统标识符98.addr11、addr16:11、16位目标地址9.Rel:8位带符号地址偏移量10.$:当前指令的地址

P84

2024/3/19嵌入式应用基础10指令的分类1.数据传送指令(28)

主要用于单片机片内RAM和特殊功能寄存器SFR之间的数据传送,也可在片内和片外的存储单元中传送,传送结束后源地址的操作数不被破坏,数值不变。2.算术运算指令(24)

用于对两个操作数进行加、减、乘、除等算术运算。结果放在A里面。2024/3/19嵌入式应用基础113.逻辑操作和环移指令(25)

逻辑操作结果也放在累加器A中,环移是对A中数进行操作,有左右和是否带进位(CF)之分。4.控制转移指令(17)

分为条件转移,无条件转移,调用和返回等。目的:改变程序执行的流向。实现方法:通过改变程序计数器PC中的值。2024/3/19嵌入式应用基础125.位操作指令(17)

布尔变量操作指令,分为位传送、位置位、位运算和位控制转移指令四类。 通过对字节当中的某一位来进行相应的操作。2024/3/19嵌入式应用基础13寻址方式

寻址方式:寻找操作数地址的方式。寻址方式越丰富,CPU的功能就越强,灵活性就越大。

MCS-51单片机的指令系统中,设有7种寻址方式,在同一条指令中的源、目操作数,可能有不同的寻址方式,下面以源操作数寻址方式为例来加以阐述。2024/3/19嵌入式应用基础14

立即寻址是指参加运算的操作数已经在指令中直接给出,这种形式的操作数称为立即数。立即数要前缀“#”,以区别直接地址。 立即寻址一般为双字节指令,如第1条指令,操作码74占一个字节,操作数30为8位立即数,也占一个字节。1立即寻址2024/3/19嵌入式应用基础15

设内部RAM中33H单元中内容为44H,34H单元中内容为0AFH,R0中内容为33H,R1中内容为00H,给出以下每一条指令执行后A中的值。 MOVA,#34H MOVA,34H MOVA,R1(将R1中的内容给A,(R1)(A)) MOVA,@R0(间接地址的内容给A,((R0

))(A))2024/3/19嵌入式应用基础16

直接寻址是指指令中直接给出操作数的地址,即给出了参加运算或传送的数据在内存单元的地址。 直接地址只能用来表示片内RAM、位地址空间以及SFR,位地址与SFR只能用直接寻址方式来访问。寻址范围:(1)内部RAM的128个单元 (2)特殊功能寄存器。除了以单元地址的形式外,还可用寄存器符号的形式给出。例如:

MOVA,80H

与MOVA,P0是等价的。2直接寻址2024/3/19嵌入式应用基础17

第1条指令是双字节指令,设分别放在ROM区30H和31H中。操作码E5指示CPU,按照下一字节单元中内容40为地址,把片内RAM单元40H中的内容送到累加器A中去,即A←(40H),寻址过程如图4.2(a)。2024/3/19嵌入式应用基础18

第2条指令设放在ROM区30H和31H单元中。操作码A2指示CPU,按照下一字节中的内容40为位地址,把40H位单元中的内容送到位累加器CY中,即CY←(40H),位直接寻址过程如图(b)。2024/3/19嵌入式应用基础19

第3条指令的寻址过程与第1条指令是类似的,是把SFR区中90H中的内容送累加器A,即A←(90H)。

按表2-7可知90H是P1口寄存器的直接地址,而P1是其符号地址,所以第3条指令也可以写成MOV

A,P1直接寻址,三点注意事项 1.指令含有SFR中的某一个,可用物理地址或者SFR的名称符号MOVA,SPMOVA,81H2024/3/19嵌入式应用基础20 2.累加器具有A,ACC,E0H三种表示形式,执行的效果是一样的INCAINCACCINC0E0H 3.指令系统中,字节地址和位地址是有区别的。MOVA,20HMOVC,20H

第一条指令将20H单元里面的数值传给A,第二条将20H位传送给Cy位。2024/3/19嵌入式应用基础21寄存器寻址

寄存器寻址是指存放操作数的寄存器直接写在指令中,寄存器包括选定的R0~R7、A、B、DPTR、CY、SP及其他SFR。MOVA,Rn;Rn→A,n=0~7

工作寄存器R0~R7由指令码的低3位000~111来编码,A、B、DPTR以及CY则隐含在指令码中,因此寄存器寻址也包含一种隐含寻址。2024/3/19嵌入式应用基础22

寄存器寻址举例,指令码的二进制为11100001,低3位的001正好为R1的编码,指令的含义是把R1中的内容送到累加器A中,即A←R1,寻址过程如图。2024/3/19嵌入式应用基础23寻址范围:

(1)4组通用工作寄存区共32个工作寄存器。

(2)部分特殊功能寄存器,例如A、B以及数据指针寄存器DPTR等。例如: 已知R0=70H,R7=25H,DPTR=0300H则MOV A,R0 ;A←R0INC DPTR ;DPTR←DPTR+1ADD R7,#20H ;R7←20H+R72024/3/19嵌入式应用基础24

寄存器间接寻址是指操作数所指定的寄存器中存放的不是操作数本身,而是操作数的地址。用作间址的寄存器为Ri和DPTR,指令助记符中在寄存器名前冠以“@”。

当访问片内RAM低128B,或片外RAM低256B时,用8位地址指针Ri,i=0或1

寄存器间接寻址2024/3/19嵌入式应用基础25

这条指令的机器码为11100110,最后位的0与1分别用来指定R0和R1,设R0=40H,(40H)=88H。

1、根据指令码的最后一位为0,先去访问R02、根据R0中的内容,最终把40H单元中的数88H送到A中去即A←(R0)。2024/3/19嵌入式应用基础26 当访问片外RAM时,用16位地址指针DPTR,举例:MOVXA,@DPTR。 这条指令的寻址过程同上一条指令类似,指令的执行结果是把DPTR中的内容为地址的外部RAM单元中的内容送到了累加器A中,即:A←(DPTR)。 注意:不能用寄存器间接寻址来访问特殊功能寄存器。2024/3/19嵌入式应用基础27

已知R0=40H,内RAM(40H)=50H,外RAM(40H)=60H,DPTR=0300H则 MOV A,@R0;A←内部RAM(R0) MOVX A,@R0 ;A←外部RAM(R0) MOVX @DPTR,A ;外部RAM(DPTR)←A 设内部RAM30H单元中内容为52H,请给出以下程序结果: MOVA,#30H; MOVA,30H MOVR0,#30H; MOVA,@R0 MOV30H,#30H;2024/3/19嵌入式应用基础28基址寄存器加变址寄存器间接寻址方式--变址寻址

变址寻址是指将基址寄存器与变址寄存器的内容相加,把相加结果作为操作数的地址。 指令中把DPTR或PC作为基址寄存器,累加器A作为变址寄存器。变址寻址主要用于查表操作。

变址寻址2024/3/19嵌入式应用基础29

对于第1条指令,设A=30H,DPTR=0100H。 CPU取出指令码93H后,就会把DPTR中的基本地址0100H与A中的偏移量相加,得到真正的目的地址为0130H;

然后再到0130H单元去访问,把此单元中的内容送到累加器A中。2024/3/19嵌入式应用基础30

对于第2条指令,偏移量还是放在A中,基本地址换为当前的PC值。

注意:变址寻址只能在64KB程序存储器的范围内寻址,但不能对数据存储器进行变址寻址。 虽然变址寻址的过程比较复杂,但变址寻址的指令机器码只有一个字节。2024/3/19嵌入式应用基础31三个特点: 1.指令操作码内隐含有作为基地址寄存器用的数据指针DPTR或程序寄存器PC,其中DPTR和PC中预先存放操作数的基地址。

2.指令操作码内隐含有累加器A,A中预先放有被寻址操作数地址对基地址的偏移量,00H-FFH. 3.执行过程中,先把基地址(DPTR、PC)和地址偏移量(A)相加,来形成操作数的物理地址。MOVCA,@A+PC MOVCA,@A+DPTR2024/3/19嵌入式应用基础32

例3.1已知片外ROM的0302H单元中有一个常数X,现欲把它取到累加器A,编写程序。基地址:0300偏移量:02HMOVDPTR,#0300HMOVA,#02HMOVC

A,@A+DPTR

例如:指令MOVCA,@A+DPTR

其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A。2024/3/19嵌入式应用基础33注意以下几点:

(1)本寻址方式是专门针对程序存储器的寻址方式,寻址范围可达到64KB。

(2)程序执行之前要做准备工作。

(3)本寻址方式的指令只有3条:

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR2024/3/19嵌入式应用基础34相对寻址

MCS-51的转移指令有长转移、短转移和相对转移之分,相对寻址是用在相对转移指令中的。 它将PC的当前值与指令操作数部分所给出的相对偏移量rel相加,其结果作为跳转指令的转移地址或称目的地址。2024/3/19嵌入式应用基础35

第1条指令SJMP38H,假设执行相对转移指令之前,PC指向指令的起址0030H,称其为(或用“$”表示)。

CPU从0030H单元取出指令码80H后,就会继续取出下一字节中的偏移量06H,这时PC已经指向了0032H,称其为;接着,CPU会将偏移量06H与基址

相加,得到跳转的目的地址为0038H,并跳转到0038H单元去访问。2024/3/19嵌入式应用基础36

从可看到,在计算目的地址时,人工算法与机器算法跳转的起点是不一样的。 CPU是在取出2字节指令码后,以为基址跳转到目的地址去的;2024/3/19嵌入式应用基础37

人工是从跳转指令的首址为跳转的起点,两者差了跳转指令本身所占的字节数Insbyt。(1)机器算法=+rel(2)人工算法=+Insbyt(跳转指令字节数)+rel2024/3/19嵌入式应用基础38

这里要特别指出,对于SJMPREL以一般形式表达的相对转移指令,对rel的理解在汇编指令和机器指令中是有很大区别的。

rel,无论是用16进制地址,还是用符号地址,都不是相对偏移量,而是对应指令转移的目的地址; 在机器指令中,rel是相对偏移量,是一个8位的补码,其值范围为-128~+127;值是正的,表示向地址增加方向跳转,值是负的,表示向地址减少方向跳转。2024/3/19嵌入式应用基础39

位寻址是指对位寻址空间按位进行寻址的操作。 在需要进行位处理时,借助于进位位CY作为位操作累加器,可对片内RAM位寻址区和11个可位寻址特殊功能寄存器的位寻址单元进行操作。位寻址

2024/3/19嵌入式应用基础40

第1条指令MOVC,40H中直接使用位寻址空间中的位地址40H,指令功能是将位寻址空间中位地址为40H中的内容送到进位标志中。位地址也可用符号地址来表示,如RS1、RS0。2024/3/19嵌入式应用基础41

可位寻址的SFR允许采用寄存器名加位数的形式来表示位地址。如可以分别用PSW.4和PSW.3来表示RS1和RS0,在单灯闪烁程序中用CLRP1.0和SETBP1.0,使P1口的第0位清零和置1的。

特殊功能寄存器中的可寻址位在指令中有4种表示方法: a.直接使用位地址。例如PSW.5的位地址为0D5H。P602024/3/19嵌入式应用基础42

b.位名称的表示方法。例如:PSW.5是F0标志位,可使用F0表示该位。 c.单元地址加位数的表示方法。例如:(0D0H).5。 d.特殊功能寄存器符号加位数的表示方法。例如:PSW.5。2024/3/19嵌入式应用基础43

例如:SETB10H;将10H位置1,其中10H是直接使用位地址。MOV22H.0,C;22H.0←进位位CP57 (其中22H.0是内部RAM22H单元的第0位)ORLC,PSW.0;C←C∨PSW.0ANLC,P;C←C∧P (其中P是PSW的第0位,是位符号地址)2024/3/19嵌入式应用基础44

注意:MCS-51指令系统的各类寻址方式对应不同的存储空间,在不同的存储区中应采用不同的寻址方式。 例:指出各指令中源、目操作数的寻址方式。2024/3/19嵌入式应用基础45

使用最频繁的一类指令,分为内部数据传送指令、外部数据传送指令、堆栈操作指令和数据交换指令四类。格式为:MOV<目的操作数>,<源操作数>

MOV<dest>,<src>

属“复制”,而不是“搬家”

,源操作数里面的数值不发生改变。3.1.5单片机指令功能

3.1.5.1数据传送指令2024/3/19嵌入式应用基础46

在29条数据传送类指令中,用到8种助记符MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP,可细分为片内RAM数据传送、访问程序存储器与片外RAM、堆栈操作、数据交换4类。

数据传送指令执行后,除了奇偶标志P会受到以累加器A

为目的操作数指令的影响,其他标志均不受到影响。2024/3/19嵌入式应用基础47

片内RAM存储空间,只有256B,仅用8位地址寻址,但却是数据传送最活跃的区域,使用的寻址方式也最多。下面以目的操作数的寻址方式分组介绍。1、内部存储器间传送(1)以累加器A为目的操作数指令一、片内RAM数据传送指令2024/3/19嵌入式应用基础48

表中指令均是8位数送A指令,第1组中的机器码E8~EF,分别对应于源为R0~R7的8条指令。

第3组中的机器码E6~E7,分别对应于源为@R0~@R1的2条指令。2024/3/19嵌入式应用基础49

第1、3两组指令的源操作数分别采用寄存器寻址和寄存器间址,所占字节数少,为1个字节。 第2、4两组指令的源操作数分别采用直接寻址和立即寻址,占2个字节数。

2024/3/19嵌入式应用基础50(2)以寄存器为目的操作数指令

以寄存器Rn为目的操作数的传送指令和要素如表。 前3组指令均是8位数送寄存器Rn指令,源只能采用直接寻址和立即寻址,不能采用寄存器寻址和寄存器间址。2024/3/19嵌入式应用基础51

MOVRn,Rn和MOVRn,@Ri形式指令是非法的,工作寄存器间数据传送可通过累加器A为中介来传送。 最后1条指令是MCS-51指令系统中唯一的一条16位数据传送指令,指令功能是将16位数据传送给16位寄存器DPTR,作为地址指针。2024/3/19嵌入式应用基础52

例如:MOV

DPTR,#1000H;

功能为DPTR←1000H

相当于执行两条8位数据传送指令:MOVDPH,#10H;DPH←10H,数的高8位送DPH,MOVDPL,#00H;DPL←00H,数的低8位送DPL。2024/3/19嵌入式应用基础53(3)以直接寻址direct为目的操作数指令以直接寻址为目的操作数的传送指令和要素如下。 指令功能均是8位数送片内RAM低128字节或SFR直接地址单元。2024/3/19嵌入式应用基础54

指令中的源、目地操作数dir1和dir2都为直接寻址,这就使得内部RAM之间的数据传送,不必通过累加器A为中介来间接传送,同时也说明访问SFR仅允许使用直接寻址,例如:MOV30H,31H;机器码853130,功能为30H←(31H)MOVPl,B;机器码为85F090,功能为P1←B

2024/3/19嵌入式应用基础55(4)以寄存器间址@Ri为目的操作数指令

指令功能均是把源操作数指定的内容传送到Ri所指向的片内RAM单元中。

Ri不是目的地址,Ri中存放的片内RAM单元的地址才是真正目的地址。Ri在机器码中是用最后一位来指定,0指定R0,1指定R1。2024/3/19嵌入式应用基础56例阅读下面汇编源程序,问程序运行后:(1)A,B,R0,R1和内RAM30H~31H内容各为多少?解:程序运行后各单元的内容为:

ORG0030HSTART:MOV30H, #0AAH MOV31H, #30H MOVR1, #31H MOVR0, 31H MOVB, @R0 MOVA,B

MOV@R1,A MOV

P1,@R1

ENDSTARTA=B=(30H)=(31H)=(P1)=AAH,R0=30H,R1=31H。课堂知识巩固2024/3/19嵌入式应用基础57 (2) 若R0=50H,R4=38H,内RAM(40H)=05H,内RAM(50H)=25H,A=12H,则解:程序运行后各单元的内容为:MOV

50H,#20H;MOV

55H,40H;MOV

5AH,A;MOV

60H,R4; MOV

68H,@R0;(50H)=20H(55H)=05H(5AH)=12H(60H)=38H(68H)=25H

(3)若R0=50H,R1=60H,内RAM(38H)=05H,A=10H,则 MOV @R0,#40H MOV @R1,38H MOV @R1,A内部数据传送指令的使用1)禁止非法指令:MOVRn,@Ri;MOV#DATA,A2)正确的给程序注释

Rn、A、B、DPTR等寄存器中的内容作为源操作数的时候不加括号,目标操作数的时候也不加。3)(Ri)--表示操作数地址在Ri中(DPTR)--表示操作数在外部的RAM/ROM中,地址放在DPTR中2024/3/19嵌入式应用基础592.访问片外RAM指令 访问片外RAM指令有4条,片外RAM单元与累加器A可以互相传送数据,都属于寄存器间接寻址方式。 第1~2两组指令采用8位地址指针Ri作间址寄存器,8位地址和数据均由P0口分时输出或输入,可寻址256B,此时,P2口仍可用做通用I/O口。2024/3/19嵌入式应用基础60

在MCS-51指令系统中,没有专门对外设的I/O指令,I/O与片外RAM是统一编址的,这4条指令也可以作为I/O指令。例

采用16位地址指针DPTR,把数存入片外RAM单元1000H中。 ORG0030HSTART:MOVA,#0AAH MOVDPTR,#1000H;先送地址

MOVX@DPTR,A;后存数

END STARTP93说明

请改用8位地址指针R0,编写相同功能的程序;ORG0030HSTART:MOVA,#0AAH

MOVP2,#10H ;高8位地址送P2 MOVR0,#00H ;低8位地址送R0

MOVX@R0,A ;存数

ENDSTART2024/3/19嵌入式应用基础623

.访问程序存储器ROM查表指令 指令功能均是读取程序存储器指令,属于变址寻址方式,但两者的基址寄存器不同,适用范围也不同。第1条指令以DPTR为基址寄存器,把表头地址送入DPTR后,就可以用它来方便地查找存放在程序存储器64KB范围内的远程表格数据。2024/3/19嵌入式应用基础63

指令MOVCA,@A+PC以PC为基址寄存器,CPU在读取指令时,PC已经加1,作为基址值的已不是,而是。

由于PC值已经确定,查表范围只能由累加器A内8位数值确定,这样,使用此指令的表格只能存放在以为起始地址的256B范围内,称这为本地表。2024/3/19嵌入式应用基础64例:0~4的平方表首址为SQTB,如图(a)。下面程序以DPTR为基址指针,设A=3,用查表法求其平方值。

ORG0030HSTART:MOV

A,#03H;所查数正好为离表首址偏移量

MOVDPTR,#SQTB

;送平方表首址

MOVCA,@A+DPTR

;查平方表SQTB:DB00H,01H,04H,09H,10H

;建立平方表区域

END

START2024/3/19嵌入式应用基础65(1)请改用PC为基址指针,编写相同功能的程序;解:(1)见图(b),具有相同功能,用PC为基址指针程序如下:

ORG 0030HSTART:MOVA,#03H

;所查数正好为离表首址偏移量

MOVCA,@A+PC

;查平方表SQTB:DB01H,04H,09H,10H;设置平方表区域

END

START2024/3/19嵌入式应用基础66

上面程序中本地表表头地址SQTB紧跟在查表指令之后,即正好指向SQTB,这时所查数(A=3)正好为离表首址偏移量; 如果与SQTB之间还隔有其它指令,则需要在查表指令前安排一条加法指令,使累加器A中的值等于所需的地址偏移量。 例:外部ROM从1000H中有一个0-9的平方表。利用查表指令来求X(0-9)的平方值.2024/3/19嵌入式应用基础67

例:外部ROM从1000H中有一个0-9的平方表。利用查表指令来求X(0-9)的平方值.ORG0100H

;程序首地址MOVA,#XMOVDPTR,#1000H

;表格首地址MOVCA,@A+DPTRORG1000HDB0,1,4,9,16,25,36,49,64,81END2024/3/19嵌入式应用基础68(1)字节交换指令(3条)

前三条指令功能是把累加器A中内容与片内RAM单元的内容进行交换,为全字节交换指令。4.

数据交换指令2024/3/19嵌入式应用基础69例如:

A=80H,R7=08H,(40H)=F0HR0=30H,(30H)=OFH执行下列指令(顺序执行):

XCHA,R7;A与R7互换

XCHA,40H;A与40H互换

XCHA,@R0;A与(R0)互换

结果:A=0FH,R7=80H,(40H)=08H,(30H)=F0H2024/3/19嵌入式应用基础70(2)半子节数据交换指令(2条) XCHDA,@Ri;将A中低4位与用@Ri间址单元的低4位进行交换,而各自的高4位保持不变;SWAPA;将累加器A本身中高4位与低4位进行交换。例如:R0=60H,(60H)=3EH,A=59H

执行完XCHDA,@RO

指令则A=5EH,(60H)=39H。例4.8试用数据交换指令编程,将存放在片内RAM单元30H中的两位BCD码分别转换为ASCII码,并存入31H和30H单元中,设(30H)=56H。解:从BCD码转换成ASCII码要将此BCD码加上30H,汇编源程序:

ORG 0030HSTART:MOV30H,#56H MOVA,#30H MOVR0,A XCHDA,@R0 XCH A,@R0;(A)=50H,(30H)=36H

INC R0

MOV31H, #03H

XCHDA,@R0 SWAPA XCH A,31H

;

(A)=00H,(31H)=35H

END

START2024/3/19嵌入式应用基础72

例:若A=30H,R0=40H,R3=50H,(38H)=61H,(40H)=58H,下列指令依次执行:XCHA,R3 XCHA,38HXCHA,@R0XCHDA,@R0SWAPA

2024/3/19嵌入式应用基础735.

堆栈操作指令 堆栈操作指令和指令要素,如表所示。2024/3/19嵌入式应用基础74 MCS-51内部RAM中可以设定一个后进先出(LIFO-LastInFirstOut)的区域称作堆栈.堆栈指针SP指出堆栈的栈顶位置。

堆栈操作总是按照SP所指向的栈顶单元进行数据的压入和弹出,栈顶一端会因此长高或压缩。 堆栈操作对象只能是用直接寻址方式表示的片内RAM低128B或SFR的内容。

2024/3/19嵌入式应用基础75(1)进栈指令PUSHdirect

功能是把direct所确定的片内RAM或SFR中内容压入栈顶单元。 执行过程是:“先加1,后压入”,先将栈指针SP←SP+1,然后把direct中的内容送到栈指针SP指示的内部RAM单元中。2024/3/19嵌入式应用基础76例如:当SP=60H,A=30H,B=70H时,执行:

PUSHACC

SP+1=61H→SP,A→(61H)

PUSHB ;

SP+1=62H→SP,B→(62H)结果:(61H)=30H,(62H)=70H,(SP)=62H2024/3/19嵌入式应用基础77(2)出栈指令

POPdirect

指令功能是把栈顶(内部RAM单元)内容送入direct所确定的片内RAM或SFR中。

执行过程是:“先弹出,后减1”,即先执行数据弹出,后执行SP←SP-1,使SP指向降低了的栈顶。例如:当SP=62H,(62H)=70H,(61H)=30H,

执行:POPDPH;(SP)→DPH,SP-1→SP

POPDPL;(SP)→DPL,SP-1→SP结果:DPTR=7030H,SP=60H

2024/3/19嵌入式应用基础78堆栈操作可用在子程序调用和返回时的现场保护和恢复。 注意PUSH和POP要成对使用,并且后进栈的数据应先弹出。;主程序调用前PUSH ACC ;保护现场,先压入ACCPUSH DPH ;再压入DPHPUSH DPL ;后压入DPL…… ;执行调用指令;返回主程序后POP DPL ;恢复现场,先弹出DPLPOP DPH ;再弹出DPHPOP ACC ;后弹出ACC

2024/3/19嵌入式应用基础79

例4.7下面程序是把片内RAM单元30H和31H中的内容交换。 (1)改用堆栈为中介,编写相同功能程序,设SP为复位后的值;

ORG0030HSTART:MOV30H,#55H MOV31H,#0AAH

MOVA, 30H MOV30H,31H MOV31H,A ENDSTART2024/3/19嵌入式应用基础80解:(1)具有相同功能,采用堆栈为中介的程序如下:

ORG0030HSTART:MOV30H, #55H MOV31H, #0AAH PUSH30H PUSH31H POP 30H POP 31H END

START2024/3/19嵌入式应用基础81

算术运算指令能对8位无符数进行加、减、乘、除运算; 借助溢出标志,可对有符数进行补码运算; 借助进位标志,可进行多字节加、减运算; 还可以对压缩BCD进行运算。 执行的结果对Cy、Ac、OV

三种标志位有影响。但增1和减1指令不影响上述标志。

3.1.5.2算术运算指令2024/3/19嵌入式应用基础82

在24条算术运算类指令中,用到8种助记符ADD、ADDC、SUBB、DA、INC、DEC、MUL和DIV。 算术运算指令执行后,运算结果保留在累加器A中。加减法指令1.加法指令加法指令和指令要素如表。2024/3/19嵌入式应用基础83

前4条指令是把累加器A中内容与源操作数所指定的内容相加,结果存放在A中,源操作数可用表中所示的4种寻址方式。2024/3/19嵌入式应用基础84

后4条指令是带进位的加法运算功能是除了累加器A中内容与源操作数所指定的内容相加外,还要与CY的值相加,结果存放在A中;带进位的加法指令主要用在多字节加法运算中。ADDC A,Rn ;A+Rn+C→A,n=0~7ADDC A,direct ;A+(direct)+C→AADDCA,@Ri ;A+(Ri)+C→A,i=0,1 ADDCA,#data;A+#data+C→A2024/3/19嵌入式应用基础85

加法运算的结果将影响CY、OV、AC和P。 (1)对于有符数加法,若OV=1,表示运算产生了溢出(-128~+127),是错误的;否则,OV=0表示结果正确。判断溢出方法OV=CY⊕CY’。 实际意义是:两负数相加,和为正数,产生了负溢出;两正数相加,和为负数,产生了正溢出。 (2)无符数加法,若A中位7有进位,则进位位CY=1,表示运算结果大于255,否则,CY=0。2024/3/19嵌入式应用基础86注意,溢出标志OV对判断无符数溢出是没有意义的。 将两数看作有符数,还是无符数,完全是由编程者事先设定的。(3)如果位3有进位,则半进位位AC=1,否则AC=0。(4)若A中结果有奇数个1,则P=1,否则P=0。2024/3/19嵌入式应用基础872.减法指令

4条指令功能是把累加器A中内容减去源操作数所指定的内容并减去进位位CY的值,结果存放在A中。 MCS-51中没有不带借位的减法指令,所以在需要时,必须先将CY清0。 减法运算的结果也将影响CY、OV、AC和P等标志,除了CY定义为位7的借位外,标志位的判断同加法指令一样。其中OV和CY也分别用于两有符数和无符数之差:

(1)两有符数相减,若OV=0,表示运算正确;若OV=1,表运算结果产生了溢出,结果是错误的。(2)两无符数相减,CY=0,表示“大减小,无借位”,结果,正确;若CY=1,表示“小减大,有借位”,将A中值连同借位一并考虑才正确。

2024/3/19MCS-51单片机原理与应用89

3.加1、减1指令前4条指令功能是源操作数所指定的单元内容按8位有符数加1,源操作数可用表中所示的4种寻址方式。第5条指令功能是用于对地址指针DPTR中内容加1,是MCS-51中唯一的一条16位加1指令。2024/3/19嵌入式应用基础90

指令功能是源操作数所指定的单元内容按8位有符数减1,源操作数可用表中所示的4种寻址方式。例

A=0FH,R7=19H,(30H)=00H,R1=40H,(40H)=0FFH,执行指令

DEC A ;A-1→A DEC R7 ;R7-1→R7 DEC 30H ;(30H)-1→30H DEC @R1 ;(R1)-1→(R1)结果为

A=0EH,R7=18H,(30H)=0FFH,(40H)=0FEH加1、减1指令主要用于修改计数器的内容及修改地址指针,以便与寄存器间址指令配合使用。2024/3/19嵌入式应用基础92

4.十进制调整指令

十进制调整指令又称BCD码调整指令,指令功能是对A中的压缩BCD码的加法结果进行十进制调整。 所谓压缩BCD码,是指在一个字节中存放两位BCD码。 累加器A进行二一十进制调整的条件,也可以用CY和AC标志来表示:(1)若AC=1或低4位AL>9,则A←A+06H;(2)若CY=1或高4位AH>9,A←A+60H。 十进制调整指令只影响CY。BCD码相加后,若CY=1,表示BCD码和已大于或等于十进制数100。注意:(1)DAA指令必须跟在ADD或ADDC指令后,对BCD码和进行二-十进制调整,但不能把A中的二进制数按4位一组转换成BCD码。(2)DAA指令不能用于十进制减法调整。为了使两个BCD数相减结果也是BCD数,可用补码运算来化减为加,然后进行BCD调整。2024/3/19嵌入式应用基础94

5.乘除法指令及其指令要素如表。

乘除法指令2024/3/19嵌入式应用基础95 第1条指令是把累加器A和寄存器B中两个8位无符整数相乘,并把积的低8位存放到累加器A中,高8位存放到寄存器B中,指令执行后将影响OV、CY和P标志. 若乘积大于255,即B≠0,则OV=1,否则OV=0;CY总为0;P标志由A中1的个数的奇偶性确定。2024/3/19嵌入式应用基础96 DIVAB指令功能是把A和B中两个8位无符整数相除,并把商的整数部分存放到A中,余数存放到B中。 指令执行后将影响OV、CY和P标志,对CY和P标志影响同乘法指令。当B=0时,则OV=1,表示除法无意义,否则OV=0。2024/3/19嵌入式应用基础97

逻辑运算指令都是字节操作指令,不是以累加器A为目的寄存器的指令不影响PSW中的标志位。3.1.5.3逻辑运算指令2024/3/19嵌入式应用基础981、逻辑与指令

ANL A,Rn;A∧Rn→A,n=0~7 ANL A,direct;A∧(direct)→A ANL A,#data;A∧#data→AANL A,@Ri;A∧(Ri)→A,i=0~1 功能是把累加器A中内容与源操作数所指定的内容进行按位逻辑与操作,结果存放在A中,源操作数可用表中所示的4种寻址方式。 例A=07H,R0=0FDH,执行指令:ANLA,R0

结果:A=05H2024/3/19嵌入式应用基础99ANLdirect,A;(direct)∧A→(direct)ANL direct,#data;(direct)∧#data→(direct)

使某些位屏蔽:与0相与;使某些位不变:与1相与。

2024/3/19嵌入式应用基础1002.逻辑或指令

前4条指令功能是把A中内容与源操作数所指定的内容进行按位逻辑或操作。2024/3/19嵌入式应用基础101ORLdirect,A

;(direct)∨A→directORLdirect,#data;(direct)∨#data→direct 指令是把dir指定内部RAM单元的内容与累加器内容或立即数进行按位逻辑或操作,结果存放在dir指定内部RAM单元。使某些位置1:与1相或;使某些位不变:与0相或。作用:可以使信号合并。2024/3/19嵌入式应用基础102例P1=05H,A=33H,执行指令ORLP1,A

结果:P1=37H 例试编程,将存放在片内RAM单元31H和30H单元中的ASCII码转换为压缩BCD码,并存入30H中。 解:本例的算法是:用与指令将这两个单元的高4位屏蔽掉,得到相应的BCD码;用或指令将两个BCD码合并在一个字节中。2024/3/19嵌入式应用基础103

ORG0030HSTART:MOV31H,#35H

MOV30H,#36H

ANL31H,#0FH

ANL30H,#0FH

MOVA,31H

SWAPA

ORL30H,A

ENDSTART2024/3/19嵌入式应用基础1043.逻辑异或指令 前4条指令功能是把A中内容与源操作数所指定的内容进行按位逻辑异或操作。2024/3/19嵌入式应用基础105XRLdirect,A

;(direct)⊕A→directXRLdirect,#data

;(direct)⊕#data→direct

使某些位不变:与0相异或; 使某些位取反:与1相异或。如使Pl口的最高位取反,其余位不变:XRL

Pl,#80H。例A=90H,R3=73H执行指令:XRLA,R3结果:A=E3H2024/3/19嵌入式应用基础106 两数异或,相同出0,异或指令常用来判断两数是否相等。如判A中值是否为

0DH,来决定跳转:XRL

A,#0DH JZ

LOOP4.累加器A清0、取反指令 第1条指令功能是A清0,第2条指令功能是A取反,操作结果均影响P标志。均为单字节单周期指令,对A专用指令速度最快。2024/3/19嵌入式应用基础107 例已知[x]补=E3H(-29的补码),试编程,求[-x]补,要求在KeilµVision3上运行验证。 解:本例的算法是按照求补方法:连同符号位一起“求反加一”,注意与求补码的区别,按此算法的汇编源程序如下:

ORG0030HSTART:MOVA,#0E3H CPL

A INCA

END

START2024/3/19嵌入式应用基础108移位指令

移位指令均是针对A的单操作数、单字节和单周期指令。除带进位位循环移位指令影响CY和P标志外,其它指令均不影响标志位。1、左环移指令 RLA

循环左移指令,其功能是把A中内容由低位向高位移动一位,最后移出的那一位将进入A0位。2024/3/19嵌入式应用基础1092、带进位左环移指令RLCA

功能:将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0。3、右环移指令 RRA

功能:是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。2024/3/19嵌入式应用基础1104、带进位右环移指令RRCA

功能:累加器A的内容和进位标志Cy一起向右环移一位,Acc.0进入Cy,Cy移入Acc.7。

移位指令常用于乘2和除2运算,对A中8位无符数实现乘2运算指令:ADD

A,#0 ;A值不变,CY清0RLCA ;A值乘2,若把此指令改为RRCA,可对A中8位无符数实现除2运算。以CY为“纽带”,两次使用循环移位指令,实现16位数移位。2024/3/19嵌入式应用基础111 控制转移指令,又称跳转指令,通过改变PC的指向来改变程序执行的流向,可分为无条件转移、条件转移、子程序调用和返回等。 在16条控制转移类指令中,用到12种助记符LJMP、AJMP、SJMP、JMP、ACALL、LCALL、RET、RETI、JZ、JNZ、CJNE和DJNZ。 如果加上空操作指令,控制转移类指令共有指令17条。6控制转移指令2024/3/19嵌入式应用基础112无条件转移指令 无条件转移指令有长转移LJMP、绝对转移AJMP、相对转移SJMP和变址转移JMP;无条件转移指令均不影响标志位。 第1条长转移指令LJMP

addrl6,为三字节双周期指令。 指令的功能是将addrl6送入程序计数器PC,使程序无条件转移到PC所指向的目的地址去执行,转移范围可达64KB。2024/3/19嵌入式应用基础113 第2条绝对转移指令AJMP

addrl1,为双字节双周期指令,在机器码中提供11位地址addrl1,addrl1由第一字节高3位a10~8和第二字节8位a7~0构成。

指令的功能是将addrl1送入程序计数器PC,取代低11位的PC10~0,与PC高5位PC15~11一起构成16位目的地址,使程序无条件转移到PC所指向的目的地址去执行。 2024/3/19嵌入式应用基础114

绝对转移又称为短转移,转移范围只有2KB,即转移目的地址与AJMP下一条指令的第一字节同在一个2KB范围内。 本指令是为能与MCS-48的JMP指令兼容而设的。 第3条相对转移指令SJMP

rel,为双字节双周期指令,其操作码为80,后跟1字节的相对偏移量rel,rel为8位补码。2024/3/19嵌入式应用基础115 指令功能:将

与相对偏移量rel相加,其结果作为转移的目的地址,使程序无条件转移到所指向的目的地址去执行。 转移范围只允许在该指令下一条指令地址的-128~+127

字节的空间范围内。 第4条变址转移指令JMP@A+DPTR,A及DPTR的内容均为无符数。指令的功能是将DPTR中的基址与A中的偏移量相加,形成目的地址送入程序计数器PC,实现程序的分支转移,又叫散转。2024/3/19嵌入式应用基础116

例设累加器A中的命令键的键值为0~2,命令键操作程序入口跳转表首址为CTAB,试编程:根据A中的键值按跳转表散转。 解:算法:先将A中键值乘2(因为跳转表中的AJMP指令是双字节的),然后按散转指令散转。汇编源程序如下:

ORG

0030HSTART:CLRC RLC A 2024/3/19嵌入式应用基础117MOVDPTR,#CTABJMP@A+DPTRCTAB:AJMPC0 AJMP C1 AJMP C2 ENDSTART

2024/3/19嵌入式应用基础118 条件转移指令可分为A判零转移,比较不等转移和减1非零转移,这些指令均属相对转移指令。 1.累加器A判零转移指令

指令都是以A是否为零作为转移条件,为双字节双周期的指令,第二个字节是相对转移的偏移量。第1条指令,若A=0,则程序作相对转移;否则顺序执行2024/3/19嵌入式应用基础119 第2条指令,若A≠0,则程序作相对转移;否则顺序执行均不影响标志位。

2.比较不等转移指令

比较不等转移指令是仅有的3操作数指令,指令均为3字节双周期的相对转移指令,第1字节是操作码并隐含了一个操作数,第2个字节是第2个操作数,第3个字节是相对偏移量。2024/3/19嵌入式应用基础120

指令的功能是先对指令给定的前两个操作数进行比较,若不相等,则相对转移,否则顺序执行。2024/3/19嵌入式应用基础121

指令执行后,将影响CY标志,进而能提供被比较两数的大小。 若CY=1,说明被比较两数是小减大,有借位;否则CY=0,没有借位。

比较不等转移指令常用来比较两个无符号数的大小,用来控制循环结束条件。2024/3/19嵌入式应用基础1223.减1非零转移指令 减1非零转移指令和指令要素如表。 第1条指令功能是先对工作寄存器Rn内容减1,若结果不等于0,则相对转移,否则顺序执行。 第2条指令的功能则是先对片内RAM或SFR内容减1,若结果不等于0,则相对转移,否则顺序执行。2024/3/19嵌入式应用基础123 指令执行后,不影响PSW各标志位。 DJNZ指令常用于循环程序中控制循环次数,指令指定的Rn或direct单元作为循环的减1计数器,当此计数器的值减为0时,循环就停止。2024/3/19嵌入式应用基础124 例

下面程序将计算1+2+3+…10的和。试编程,改用DJNZ指令来判断循环结束条件。

ORG 0030HSTART:CLR A MOVR0,#0AH LOOP:ADDA,R0 DEC R0 CJNER0,#00H,LOOP MOV30H,A

ENDSTART 解:DJNZR0,LOOP等价于:DECR0;CJNER0,#00H,LOOP。只要在上述程序中替换即可。得到与原程序相同的结果A=37H(55D)。2024/3/19嵌入式应用基础125

常用的相对独立的功能模块程序定义为子程序,以供主程序调用。 主程序中可以通过调用指令调用子程序;子程序执行完后,通过RET返回主程序。子程序调用和返回指令2024/3/19嵌入式应用基础126

在主程序调用子程序1时,又发生了子程序1对另一个子程序2的调用,称为子程序的嵌套。2024/3/19嵌入式应用基础1271.子程序调用指令子程序调用指令和指令要素如表。 第1条长调用指令LCALL

addrl6,为三字节双周期指令,其操作码为12,后跟两字节的16位地址addrl6。2024/3/19嵌入式应用基础128指令功能: (1)指向断点,执行PC←PC+3,使PC指向被称为断点的下一条指令地址; (2)保护断点,即先后将PCL和PCH压入堆栈,栈指针SP加2指向新的栈顶; (3)转子,将16位目的地址addr16送入程序计数器PC,使程序无条件转向子程序入口地址addr16,执行被调用的子程序。长调用指令可调用在64KB范围内的子程序。2024/3/19嵌入式应用基础129 第2条绝对调用指令ACALL

addrl1,为双字节双周期指令,在机器码中提供11位地址addrl1,addrl1由第一字节高3位a10~8和第二字节8位a7~0构成。指令功能: (1)指向断点,执行PC←PC+2,使指向断点地址,即ACALL下一条指令的第一字节单元的地址; (2)保护断点,即先后将PCL和PCH压入堆栈,栈指针SP加2指向新的栈顶;2024/3/19嵌入式应用基础130 (3)转子,将11位目的地址addr11送入PC,取代低11位的PC10~0,与高5位PC15~11一起构成16位目的地址,使程序无条件转向子程序入口地址去执行。

绝对调用指令只修改了PC的低11位地址,高5位PC15~11仍由决定,所以调用子程序范围只有2KB,又称为短调用。2024/3/19嵌入式应用基础131

ACALL指令把整个64KB程序存储空间划分成32个区,每个区为2KB,由高5位决定区号,区号范围为0~31(0~1FH)。

与AJMP指令相类似,是为了与MCS-48中的CALL指令兼容而设的 2024/3/19嵌入式应用基础1322.返回指令 第1条子程序返回指令RET,为单字节双周期指令,其操作码为22。

功能是:恢复断点,将堆栈栈顶起两个单元中的断点分别弹出至PCH和PCL,同时堆栈指针减2。程序将返回到断点处继续执行。2024/3/19嵌入式

温馨提示

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

评论

0/150

提交评论