第1章 单片机基础知识4_第1页
第1章 单片机基础知识4_第2页
第1章 单片机基础知识4_第3页
第1章 单片机基础知识4_第4页
第1章 单片机基础知识4_第5页
已阅读5页,还剩140页未读 继续免费阅读

下载本文档

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

文档简介

指令是指挥计算机工作的命令,一种计算机所能执行的指令集合称之为该种计算机的指令系统。

本节重点:寻址方式;MCS-51指令集;伪指令;1.4MCS-51单片机的指令系统指令机器指令

0010010000001010B(二进制数表示)240A(十六进制数表示)汇编指令

ADDA,#0AH

1、按指令所占字节数分类:每条指令在程序存储器ROM中占据一定的空间,以字节为单位。 单字节(49条);双字节(46条); 3字节(16条)2、按指令执行时间分类:每条指令在执行时要花去一定的时间,以机器周期为单位。 单周期(64条); 双周期(45条); 4周期(2条)3、按指令的功能分类,可分为5大类: 数据传送类(29条); 算术运算类(24条); 逻辑运算及移位类(24);控制转移类(17条) 位操作类(17条)51系列单片机指令系统分类(共111条指令)MCS-51单片机的指令系统的特点(1)指令执行时间快。(2)指令短,约有一半的指令为单字节指令。(3)用一条指令即可实现2个一字节的相乘或相除。(4)具有丰富的位操作指令。(5)可直接用传送指令实现端口的输入输出操作。方括符[]表示可选项标号代表指令所在地址,1-8个字母/数字,“:”结尾操作码就是指令功能助记符,指令实体目的操作数源操作数注释,以“;”开头一、指令的格式 指令的表示形式称指令格式。编写程序时必须严格按指令格式书写。MCS-51指令由操作码和操作数组成。汇编语言指令格式如下:[标号:]操作码[目的操作数][,源操作数][;注释]1.4.1指令的格式及标识二、指令中的符号标识Rn—当前工作寄存器组中的寄存器R0~R7之一,n=0~7。Ri—当前工作寄存器组中可作地址指针的寄存器R0,R1,i=0、1。@Ri—间接寻址的8位片内RAM单元地址(00H~FFH),i=0、1。例:MOVR1,#30H; MOV@R1,#0FH; MOVA,@R1;#data—8位立即数。#data16—16位立即数。(R1)←立即数30H(30H)←立即数0FH(A)←((30H))=#0FH指令中的符号标识(续)addr11—11位目的地址 只限于在ACALL和AJMP指令中使用。addr16—16位目的地址 只限于在LCALL和LJMP指令中使用。rel—补码形式表示的8位地址偏移量 在指令SJMP中使用。指令中的符号标识(续)例:LJMPaddr16;PC←addr16 长跳转指令——可在64K范围内跳转 AJMPaddr11;PC←(PC)+2,PC10~0←addr11

绝对跳转指令——可在指令所在的2K范围内跳转 SJMPrel;PC←(PC)+2+rel

相对跳转指令——可在当前PC-128与127范围内跳转说明:①在程序中addr16addr16rel等可用标号代替,表示要转移目的地址 ②LJMP,STMP,AJMP功能相同,只是转移范围不同。指令中的符号标识(续)例: LCALLaddr16子程序长调用指令 ——可在64K范围内调用子程序 ACALLaddr11子程序绝对调用指令 ——可在指令所在的2K范围内调用子程序说明:①在程序中addr16addr11等可用标号代替,表示子程序的入口地址 ②LCALL,ACALL功能相同,只是转移范围不同。指令中的符号标识(续)bit—表示片内RAM位寻址区或可位寻址特殊功能寄存器的位地址;

direct—内部RAM的8位地址。既可以是内部RAM的低128个单元地址,也可以是特殊功能寄存器的单元地址或符号。在指令中direct表示直接寻址方式。$—表示本条指令的起始地址;C—进位标志位,它是布尔处理机的累加器,也称之为位累加器;三、关于注释CYACF0RS0OVPRS1PSW.7PSW.0PSW.6PSW.5/—加在位地址的前面,表示对该位先求反再参与运算,但不影响该位的值;例:ANLC,/bit ORLC,/bit(x)—由x指定的寄存器或地址单元中的内容;((x))—由x所指寄存器的内容作为地址的存储单元的内容;←—表示指令操作流程,将箭头右边的内容送到箭头左边的单元中。三、关于注释寄存器寻址立即寻址寄存器间接寻址直接寻址变址寻址(基址寄存器+变址寄存器间接寻址)相对寻址位寻址寻址:就是寻找操作数的地址(操作数可能是具 体的数据,也可能是具体的存放数据的地 址或符号)寻址方式:指令按地址获得操作数的方式MCS-51系列单片机提供了七种寻址方式1.4.2寻址方式 从寄存器中读取操作数或存放操作数进寄存器,寄存器的内容就是操作数。例: MOVA,B ;(A)←(B) MOV30H,R0 ;(30H)←(R0) MOVA,R2 ;(A)←(R2)注意:(1)采用寄存器寻址方式的指令都是一字节的指令(2)可以作寄存器寻址的寄存器有:R0~R7、A、B寄存器和数据指针DPTR1、寄存器寻址——(P31)A2、直接寻址 定义:在指令中直接给出操作数所在单元的地址或名称,这就是直接寻址方式。例如: MOVA,3AH其中:3AH就是表示直接地址, 其操作示意图如右图所示。直接寻址方式可访问以下存储空间: ①内部RAM低128个字节单元。 ②特殊功能寄存器。注意:直接寻址是访问特殊功能寄存器的唯一方法。原因:52子系列的单片机内部RAM高128字节单元地址与特殊功能寄存器的地址存在冲突问题。 SFR分布在80H~0FFH范围内,而52系列单片机有256字节的片内RAM,其中的80H~0FFH的RAM与SFR所占地址重叠。解决办法:

80H~0FFH范围内RAM只能用寄存器间接寻址方式

SFR只能用直接寻址方式特殊功能寄存器的寻址特点89C51片内RAM128字节(00H—7FH)89C52片内RAM256字节(00H—0FFH)00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM区普通RAM区位寻址区工作寄存器区SFR分布在80H-FFH其中92个位可位寻址80HFFH89C51128字节89C52256字节只能直接寻址只能寄存器间接寻址特殊功能寄存器的寻址特点(续)SFR地址表片内21个SFR中:地址号能被8整除的11个SFR可位寻址标识名称地址标识名称地址

ACC累加器E0HBB寄存器F0HPSW程序状态字D0HSP堆栈指针81HDPTR数据指针DPL82HDPTR数据指针DPH83HP0P0口80HP1P1口90HP2P2口A0HP3P3口B0HIP中断优先级控制B8HIE允许中断控制A8HTMOD定时方式控制89HTCON定时/计数控制88HTH0T0高字节8CHTL0T0低字节8AHTH1T1高字节8DHTL1T1低字节8BHSCON串行控制98HSBUF串行数据缓冲器99HPCON电源控制97HMOVR0,#90H

MOVA,@R0;A←(90H)属寄存器间接寻址,随意写的指令如:MOVA,85H则是非法的!MOVA,SP;(A)←(SP)MOVA,81H;(A)←(SP)MOVP1,#5AH;(P1)←(#5AH)MOV90H,#5AH;(P1)←(#5AH)MOVB,30H;(B)←(30H)相同相同SFR直接寻址方式举例 寄存器中的内容是一个RAM单元的地址,该RAM单元中的内容才是操作数。例:MOVR1,#30H;MOV@R1,#0FH;MOVA,@R1;3、寄存器间接寻址(R1)←立即数30H(30H)←立即数0FH(A)←((30H))=#0FH

注意:(1)“间接”表示某寄存器中的“内容”只是一个“单元地址”,这个地址单元中存放的数据才是要找的“操作数”。(2)符号“@”表示“在…”,其含义与读音皆同“at”。3、寄存器间接寻址(3)能用于间接寻址的寄存器有R0,R1,SP,DPTR。

R0、R1是当前工作寄存器组中的寄存器。

SP仅用于堆栈操作。(4)间接寻址可以访问的存储器空间包括内部RAM和外部RAM。①内部RAM的低128个单元采用R0、R1作为间址寄存器②外部RAM: 一是采用R0、R1作为间址寄存器,可寻址256个单元。 二是采用16位的DPTR作为间址寄存器,可寻址外部RAM的整个64KB地址空间。寄存器间接寻址(续)例如:MOV@R0,A;内部RAM(R0)←A

其指令操作过程示意图如下图所示。片内RAM30HR034HA30H34H寄存器间接寻址举例片外RAM2000HDPTR30HA2000H30H寄存器间接寻址举例例如:MOVX@DPTR,A;外部RAM(DPTR)←A

其指令操作过程示意图如下图所示。例如:已知(R1)=80H (80H)=33H则执行指令 MOVA,@R1后结果: (A)=33H而不是80H。1、寄存器寻址时,寄存器中存放的是操作数寄存器间接寻址中时,寄存器中存放的是操作数的地址。寄存器间接寻址和寄存器寻址作对比2、寄存器寻址时,寄存器可以是:R0~R7、A、B寄存器和数据指针DPTR;寄存器间接寻址使用的寄存器为Ri和DPTR,使用时寄存器前面加“@“标志。 即以下形式: MOV A,@Ri MOVXA,@DPTR 操作数直接就出现在指令中例: MOVA,#64H;(A)←立即数64H ADDA,#05H;(A)←(A)+立即数05H4、立即寻址注意:符号“#”表明其后跟的是立即数,(为了与直接寻址指令中的直接地址相区别)

立即数——就是数字量本身。立即数只能是源操作数,不能作为目的操作数。 立即数有8位立即数和16位立即数。也称为:基址寄存器+变址寄存器间接寻址两条指令的语法:MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))基址寄存器:地址指针寄存器DPTR或PC寄存器变址寄存器:累加器A两者中的“内容”形成一个16位的“地址”

(ROM中地址)

该“地址”所指的存储单元中的内容才是操作数。5、变址寻址MOVCA,@A+DPTR指令指令的功能:将A的内容与DPTR的内容之和作为操作数地址,把该地址中的内容送入累加器A中。如下图所示。变址寻址指令的特点(1)变址寻址只能对程序存储器中数据进行操作。 由于程序存储器是只读的,因此变址寻址只有读操作而无写操作,在指令符号上采用MOVC的形式。(2)这两条指令常用于访问程序存储器中的数据表格。(3)这两条指令都为一字节指令。当前PC值加上指令中规定的偏移量rel,构成实际的操作数地址语法:SJMPrel操作:跳转到的目的地址=当前16位PC值+rel例:2000H:SJMPL16、相对寻址无条件相对转移指令;双字节指令;指令代码80H、54H;其中rel=54H;标号L1指向程序存储器单元地址2056HL1相对寻址方式的特点1)“当前PC值”指程序中下一条指令所在的首地址,是一个16位数;2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH)。

在实际编程中,“rel”通常用标号代替3)相对寻址能修改PC的值,故可用来实现程序的分支转移。

指令中直接给出了操作数所在的位地址。例:CLRP1.0;(P1.0)←0SETBACC.7;(ACC.7)←1CPLC;(C)←NOT(C)注意:1)位地址里的数据只可能是一个0或12)有的位地址十分明确,如P1.0,ACC.7等,有的位地址则“不太明确”,如:

MOVA,17H ;(A)←(17H),17H是字节地址

MOVACC.0,17H;(ACC.0)←(17H),这里ACC.0是位地址,所以该指令中的17H是22H单元的第7位7、位寻址片内RAM中有128个位可按位寻址的位,位地址:00H—7FH分布在:20H—2FH单元;另一个是字节地址能被8整除的11个SFR中还有83个位可按位寻址00H20H2FH7FH1FH30H80HFFHSFR普通RAM区位寻址区工作寄存器区27H22H21H20H26H24H25H23H28H07060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A191827262524232221202F2E2D2C2B2A292837363534333231303F3E3D3C3B3A393847464544434241402FH7F7E7D7C7B7A7978位地址总共128个可按位寻址的位单元地址17D7D6D5D4D3D2D1D051单片机内部RAM的两个位寻址区域位地址的几种表示方式(1)直接使用位地址。对于20H~2FH共16个单元的128位,其位地址编号是00H~7FH, 例如,20H单元的0~7位的位地址为00H~07H。(2)用单元地址加位序号表示。如25H.5表示25H单元的D5位(位地址是2DH)。这种表示方法可以避免查表或计算,比较方便。(3)用位名称表示。特殊功能寄存器中的可寻址位均有位名称,可以用位名称来表示该位。如可用RS0表示PSW中的D3位:

RS0=

D0H.3(4)对特殊功能寄存器可直接用寄存器符号加位序号表示。如PSW中的D3位,又可表示为

PSW.3=RS0=D0H.3。〔例3-1〕指出下列每一条指令的寻址方式。①MOV2FH,#40H②MOVA,@R0③MOVDPTR,#2020H④MOV45H,P0⑤MOVA,R1⑥MOVCA,@A+PC⑦JCLOOP①中的源操作数为立即寻址,目的操作数为直接寻址。②中的源操作数为寄存器间接寻址,目的操作数为寄存器寻址。③中的源操作数为16位立即寻址,目的操作数为寄存器寻址。④中的源操作数和目的操作数都是直接寻址。⑤中的源操作数和目的操作数都为寄存器寻址。⑥中的源操作数为基址加变址寻址,目的操作数为寄存器寻址。⑦中的操作数为相对寻址。寻址方式举例(1)〔例3-2〕判断下列指令是否正确,若不正确请指出错误:①MOVA,DPTR②MOVDPTR,#03H③MOV#80H,R7④MOVB,C寻址方式举例(2)〔解〕①不正确。A是8位寄存器,DPTR为16位寄存器,不匹配。②正确。(DPTR)←#0003H

③不正确。#80H为立即数,不能作为目的地址。

④不正确。B为8位字节寄存器,C为1位位累加器,不匹配。MCS-51指令集按照功能分五类,共111条指令1.4.2指令说明MCS-51指令集共111条指令。

按功能分为五类。数据传送类指令:(29条)算术运算类指令:(24条)逻辑运算及移位类指令:(24条)控制转移类指令:(17条)位操作(布尔操作)类指令:(17条)1.4.2指令说明内部数据存储器间传送:(MOV——16条)外部数据存储器与累加器间传送:(MOVX——4条)程序存储器向累加器传送:(MOVC——2条)数据交换:(XCH,XCHD,SWAP—5条)堆栈操作:(PUSH,POP——2条)一、数据传送类指令(5种/29条)内部存储器间传送指令(16条):指令格式:MOV<目的操作数>,<源操作数>指令功能:把源操作数所表示的数据传送到目的地址指定的存贮单元之中,而不改变源操作数。即该指令是“复制”,不是“搬家”。例: MOVA,30H——(A)(30H)(一)内部存储器间传送指令注意: MOV类指令的操作方向总是后面的操作数指向前面的操作数!操作数可取的类型和匹配方式ACC:累加器Rn :R0—R7@Ri :@R0,@R1#data :8位立即数#data16:16位立即数Direct:为内部RAM或SFR地址Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数操作数可取的类型和匹配方式1、以累加器A为目的地址的指令2、以直接地址为目的地址的指令3、以寄存器间接地址为目的的地址的指令4、以Rn为目的地址的指令5、16位数据传送指令Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数1、以累加器A为目的地址的指令以累加器A为目的地址的指令MOVA,Rn

;A←(Rn)MOVA,direct;A←(direct)MOVA,@Ri

;A←((Ri))MOVA,#data;A←data

Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数1、以累加器A为目的地址的指令例:MOVA,20H;(A)=(20H)A的内容为20H中的内容MOVA,@Ri;以Ri的内容为地址,把该地址中的内 容送到A中去。A←((Ri))

MOVA,R0;将R0的内容送到A去。A←(R0)MOVA,#20H;(A)=20HA的内容为20H例: MOVR0,#30H MOV30H,#60H MOVA,@R0 (A)=?2、以Rn为目的地址的指令以Rn为目的地址的指令 MOVRn,A ;Rn←(A) MOVRn,direct ;Rn←(direct) MOVRn,#data ;Rn←dataAcc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数3、以直接地址为目的地址的指令以直接地址为目的地址的指令MOVdirect,A;direct←(A)MOVdirect,Rn

;direct←(Rn)MOVdirect,direct;direct←(direct)MOVdirect,@Ri

;direct←((Ri))MOVdirect,#data;direct←data

Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数4、以寄存器间接地址为目的地址的指令以寄存器间接地址为目的的地址的指令MOV@Ri,A ;(Ri)←(A)MOV@Ri,direct

;(Ri)←(direct)MOV@Ri,#data

;(Ri)←dataAcc累加器Direct直接寻址@Ri间接寻址Rn寄存器#data立即数5、16位数据传送指令16位数据传送指令MOVDPTR,#data16;DPTR←data16

;DPL←data7~0;DPH←data15~8立即数#data16寄存器DPTR〔例〕设RAM40H单元的内容为80H,80H单元内容为47H,P1口的输入状态为0FFH,试判断下列程序执行结果。MOVR0,#40HMOVA,@R0MOVR1,AMOVB,@R1MOV@R1,P1MOVP2,P1

〔解〕执行结果为:(A)=80H,(B)=47H,(R0)=40H,(R1)=80H,(P1)=0FFH,(P2)=0FFH,(80H)=0FFH。;R0←40H;A←(

40H)=80H;R1←80H;B←(

80H)=47H;(

80H)

←0FFH;P2←0FFHMOV类指令举例MOVX类指令(4条):MOVXA,@DPTR——(A)((DPTR))MOVXA,@Ri——(A)((Ri))MOVX@DPTR,A——((DPTR))(A)MOVX@Ri,A——((Ri))(A)说明:①片外RAM与片内RAM之间以及片外RAM之间不能直接进行数据传送,必须通过累加器A中转。 MOVX20H,2000H MOVX3000H,2000H××(二)外部RAM与累加器间传送类指令MOVX类指令(4条):MOVXA,@DPTR——(A)((DPTR))MOVXA,@Ri——(A)((Ri))MOVX@DPTR,A——((DPTR))(A)MOVX@Ri,A——((Ri))(A)说明:②寻址方式只能是寄存器间接寻址。参与间接寻址的寄存器只有Ri和DPTR两种(3个)。

DPTR为16位寄数器,寻址范围为000H~0FFFFH共64KB空间;

Ri是8位寄数器,只能寻址00~0FFH低256单元。(二)外部RAM与累加器间传送类指令〔解〕①

MOVDPTR,#2000HMOVXA,@DPTRMOV20H,A

MOVDPTR,#2000H

MOVXA,@DPTRMOVR0,#0FAHMOVX@R0,A〔例〕

①将片外RAM2000H单元的内容传送到片内20H单元中;②将片外RAM2000H单元的内容传送到片外0FAH单元。MOVX类指令应用举例MOVC指令(2条): MOVCA,@A+DPTR MOVCA,@A+PC ——通常称为查表指令,寻址方式属:“基址寄存器+变址寄存器间接寻址”注意:(1)@A+DPTR或@A+PC指向程序存储器中的某单元,所以其数据传送都是单向的。(2)拟传送给ACC的数据就是程序中事先写进去的表格数据,这些表格数据往往用伪指令DB,DW等定义在程序中。(3)应用时,一般以PC或DPTR确定表格的首址,查表时,将A中的内容作为表中偏移量(字节数)来查找到表格中的相应项。(4)ROM片内、片外是统一编址,该指令既可访问片内,又可访问片外程序存贮器。一、数据传送类指令(5种/29条)P35〔解法一〕以DPTR为基址寄存器,平方表首址可灵活安排在适当的位置如2000H,即平方表的内容从2000H单元放起。〔例3-7〕以查表方式求出片内RAM20H单元中操作数的平方值,存入片内21H单元中。MOVC指令举例查表程序执行示意图A05HDPTR2000H524H2005H2006HROMMOVCA,@A+DPTR;(A)=19H=52〔解法一〕以DPTR为基址寄存器,平方表首址可灵活安排在适当的位置如2000H,即平方表的内容从2000H单元放起。程序如下:ORG1800HMOVDPTR,#2000HMOVA,20H;A中的内容为所要查找的单元数值在 表中偏移量(字节数)MOVCA,@A+DPTRMOV21H,A

ORG2000HDB00H,01H,04H,09H,10H,19H,24HDB31H,40H,51H,64H,……〔例3-7〕以查表方式求出片内RAM20H单元中操作数的平方值,存入片内21H单元中。MOVC指令举例ORG1000H1000MOVA,20H;A中的内容为所要查找的单元数值 在表中偏移量(字节数)1001ADDA,#03H;补偿值=03H

1003MOVCA,@A+PC1004MOV21H,A1006RET1007DB 00H,01H,04H,09H,10H,19H,24H……〔解法二〕以PC为基址寄存器,此时表格须紧跟程序之后,且要计算好表格首址位置。补偿值定义: 表头地址-查表指令存储地址-1,(1007H-1003H-1=03H)或者表头地址-查表指令执行时的PC当前值(1007H-1004H=03H) 相同点:1)源操作数所在的存储器类型相同;源操作数都在程序存储器中,所以其数据传送都是单向的;2)源操作数都是在源程序中事先写进去的表格数据;3)源操作数的存放位置对于程序存储器是片外、还是片内没有要求,既可访问片内,又可访问片外程序存储器。MOVCA,@A+DPTR

与MOVCA,@A+PC作比较——相同点1)基址指针不同。MOVCA,@A+DPTR中基址指针为DPTR;MOVCA,@A+PC中基址指针为PC;2)数据表格在源程序中与查表指令的“距离”要求不同。MOVCA,@A+DPTR中数据表格可以在64K程序空间的任意位置;MOVCA,@A+PC中数据表格存储地址的最大值与查表指令存储地址的差值不能超过ACC所能容纳的无符号数最大值255;3)数据表格长度的取值范围不同。MOVCA,@A+DPTR中数据表格长度除了64K程序存储器容量之外没有其它限制;MOVCA,@A+PC中数据表格长度受ACC所能容纳的无符号数最大值255的限制;MOVCA,@A+DPTR

与MOVCA,@A+PC作比较——不同点1、字节互换XCH(3条):XCHA,direct(字节互换)XCHA,@Ri(字节互换)XCHA,Rn(字节互换)功能:将累加器A中内容与源操作数互换。(三)数据交换指令(5条)Acc累加器Direct直接寻址@Ri间接寻址Rn寄存器例:设(A)=08H,(R7)=0DCH,执行指令XCHA,R7结果为:(A)=0DCH,(R7)=08H半字节交换指令XCHD和SWAP2、XCHD指令(1条)XCHDA,@Ri;(A)低4位←→((Ri))低4位功能:累加器A中内容与源操作数低4位交换,高4位不变。

例:已知(A)=80H,(R0)=30H,(30H)=0FH,执行指令 XCHDA,@R0结果为:(A)=8FH,(30H)=00H注意:源操作数只能是间接寻址方式半字节交换指令XCHD和SWAP3、SWAP指令(1条)SWAPA;(A)低4位←→(A)高4位功能:累加器Acc的低4位与自身的高4位互换例:已知(A)=80H,执行指令 SWAPA 结果为:(A)=08H〔解〕

XCHA,20H;SWAPA;MOVR1,#21H;XCHDA,@R1;SWAPA;XCHA,20H;〔例3-4〕试用交换指令使片内20H单元的高4位与21H单元的低4位交换。设:(ACC)=a7a6a5a4a3a2a1a0

(20H)=

b7b6b5b4b3b2b1b0(21H)=c7c6c5c4c3c2c1c0数据交换指令应用举例(ACC)=b7b6b5b4b3b2b1b0(ACC)=b3b2b1b0b7b6b5b4(ACC)=b3b2b1b0c3c2c1c0(21H)=c7c6c5c4b7b6b5b4(ACC)=c3c2c1c0b3b2b1b0(20H)=c3c2c1c0b3b2b1b0目的:(20H)=c3c2c1c0b3b2b1b0(21H)=c7c6c5c4b7b6b5b4堆栈操作指令(2条):PUSHdirect;(SP)←(SP)+1,((SP))←(direct)POP direct ;(direct)←((SP)),(SP)←(SP)-1(四)堆栈操作指令栈顶栈底SP←SP+1SP栈顶栈底SPSP←SP-1a)入栈b)出栈堆栈示意图1、入栈指令PUSH

PUSHdirect;(SP)←(SP)+1,((SP))←(direct)功能:先指针加1,后内容进栈。说明:

①PUSH指令常用于保护CPU现场。

②栈操作是字节指令,每次只能压入或弹出1个字节的内容。如PUSHDPTR是错误的,但可以用以下两条指令完成DPTR的入栈。

PUSHDPH PUSHDPL2、出栈指令POPPOPdirect;direct←((SP)),(SP)←(SP)-1功能:先内容出栈,后指针减1。注意:√堆栈区由特殊功能寄存器堆栈指针SP

管理√堆栈区可以安排在RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,而是放在RAM区的靠后的位置√堆栈总是指向栈顶√通常PUSH与POP两条指令成对使用说明:①栈操作要注意先入后出的原则。②POP指令常用于恢复CPU现场堆栈操作指令执行过程××片内RAM50H40H11H10HSP→××30H执行前指令PUSH40H操作示意图片内RAM50H40H11H10H50H××30H执行后SP→堆栈操作指令执行过程指令POP30H操作示意图片内RAM40H11H10H34H××30H××执行前SP→片内RAM30H11H10H40H34H34H××执行后SP→数据传送类指令综合应用举例【例】将片内RAM30H单元与40H单元中的内容互换。方法2:(间接地址传送法)MOV R0,#40HMOV R1,#30HMOV A,@R0MOV B,@R1MOV @R1,AMOV @R0,BSJMP $方法1:(直接地址传送法)MOV 31H,30HMOV 30H,40HMOV 40H,31HSJMP $数据传送类指令综合应用举例(续)方法4(堆栈传送法):

PUSH 30HPUSH 40HPOP 30HPOP 40HSJMP $方法3(字节交换传送法):MOV A,30HXCH A,40HMOV 30H,A

(或XCH A,30H)SJMP $

⑤XCHA,20HXCHA,30HXCHA,20H〔例〕改正下列指令中的错误,完成其功能:①MOVA,2000H;片外RAM2000H单元内容送入A。②MOVX20H,2000H;片外RAM2000H单元内容送入片内20H单元。③MOVCA,2000H;将ROM2000H单元内容送入A。④MOVXA,@A+DPTR;以查表方式将片外RAM单元的内容送入A。⑤XCH40H,30H;交换片内RAM30H和40H单元的内容。⑥PUSHAB;将寄存器对AB的内容压入堆栈。〔解〕

①MOVDPTR,#2000HMOVXA,@DPTR

②MOVDPTR,#2000HMOVXA,@DPTRMOV20H,A

③MOVDPTR,#2000HMOVA,#0MOVCA,@A+DPTR④无法以查表方式将片外RAM存贮单元的内容送入A。⑥PUSHAPUSHB

错误指令改正1.MOVA,#1000H ;A←1000H2.MOVXA,1000H ;A←(1000H)片外RAM3.MOVCA,1000H ;A←(1000H)片外ROM4.MOVX60H,A ;片外RAM(60H)←A5.MOVR0,60H ;片内RAM:(61H)←(60H)MOV61H,@R06.XCHR1,R2 ;R1←→R27.MOVXDPTR,#2000H;DPTR←2000H8.MOVX60H,@DPTR ;片内RAM←片外RAM下列指令是否错误,如错请改正:XXXXXXXX习题不带进位加法指令:(ADD——4条)带进位加法指令:(ADDC——4条)带借位减法指令:(SUBB——4条)加1/减1操作:(INC,DEC—9条)单字节乘/除运算:(MUL,DIV—2条)十进制调整指令:(DAA

1条)二、算数运算类指令(6种/24条)1、不带进位加法指令(Addtion)ADDA,Rn;

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

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

;A←(A)+#data功能:ADD指令把源操作数与累加器A内容相加,结果存在累加器中。对标志位的影响:影响PSW中的C、AC、OV和P位,但不改变源操作数,。1、不带进位加法指令(Addtion)ADDA,Rn;

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

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

;A←(A)+#data说明:①操作数的允许类型 目的操作数只能是累加器A,源操作数只有以上4种形式; 如:ADDB,40H或ADDA,203AH等都是不存在的,是非法的。②操作数不区分有无符号 无符号数(0~255),带符号数(-128~+127)。〔例〕试编程计算40H和41H两单元字节数的和,并存放在42H单元。(42H)←

(40H)+(41H) 若(40H)=0B3H,(41H)=79H,给出计算结果并判断PSW受影响的位。ADD指令应用举例〔解〕程序如下:MOVA,40H ADDA,41HMOV42H,A若(40H)=0B3H,(41H)=79H 10110011+011110011←00101100若(40H)=0B3H,(41H)=79H 10110011+01111001

1←00101100ADD指令应用举例 若(40H)(41H)是无符号数,和为12CH; 若(40H)(41H)是有符号数,和为+2CH。则运算结果:(42H)=(C)=(AC)=(OV)=(P)=2CH10012、带进位加法指令ADDCA,Rn;A←(A)+(Rn)+(Cy)ADDCA,@Ri;A←(A)+((Ri))+(Cy)ADDCA,direct;A←(A)+(direct)+(Cy)ADDCA,#data;A←(A)+#data+(Cy)功能:该操作与ADD类似,只是PSW中的进位位C参与运算。说明:①对标志位的影响

对标志位的影响与ADD相同;②用途

通常用于多字节或多个数加法运算。2、带进位加法指令例如: 设(A)=20H,(R0)=21H,C=1 执行指令:ADDCA,R0 结果:A=42H。ADDCA,Rn;A←(A)+(Rn)+(Cy)ADDCA,@Ri;A←(A)+((Ri))+(Cy)ADDCA,direct;A←(A)+(direct)+(Cy)ADDCA,#data;A←(A)+#data+(Cy)〔解〕MOVA,30H ADDA,40H MOV50H,A MOVA,31H ADDCA,41H MOV51H,A MOVA, #00H ADDCA,#00H MOV52H,A〔例〕两字节无符号数相加,被加数放在内部RAM31H,30H单元(低位放在前),加数放在内部RAM41H、40H单元。计算两数的和,放在52H~50H单元中。带进位加法指令应用举例(31H)(30H)+(41H)(40H)(52H)(51H)(50H);低字节相加

;高字节相加

;取高位相加产生的进位

说明:①多字节数求和,从低字节开始,最低字节相加用ADD指令,高字节相加用ADDC指令。②N字节数相加,结果可能为N+1字节数。带进位加法指令应用举例(31H)(30H)+(41H)(40H)(52H)(51H)(50H)〔解〕MOVA,30H ADDA,40H MOV50H,A MOVA,31H ADDCA,41H MOV51H,A MOVA, #00H ADDCA,#00H MOV52H,A;低字节相加

;高字节相加

;取高位相加产生的进位

3带借位减法指令(Subtraction)SUBBA,Rn;A←(A)-(Rn)-(Cy)SUBBA,@Ri;A←(A)-((Ri))-(Cy)SUBBA,direct;A←(A)-(direct)-(Cy)SUBBA,#data;A←(A)-#data-(Cy)说明:①无不带借位的减法指令。

若进行不带借的减法运算,要在运算前使用ADDA,#00H或CLRC等指令将进位标志清0。②减法指令中,无BCD码调整。③对标志位的影响:影响PSW中的C,AC,OV,和P位。〔例〕两个双字节数相减,被减数放在30H,31H,减数放在40H,41H中,差放入50H、51H。SUBB指令应用举例(31H)(30H)-(41H)(40H)(51H)(50H)〔解〕ADDA,#00HMOVA,30HSUBBA,40HMOV50H,AMOVA,31HSUBBA,41HMOV51H,A说明:多字节相减,从低字节开始,最低字节相减时,应先将进位位清0。;将进位位清0;低字节相减;高字节相减加法运算:(ADD——4条)带进位加法运算:(ADDC——4条)带借位减法运算:(SUBB——4条)所有的ADD、ADDC、SUBB运算都是以A为一个加数或被减数,最终结果也存进A。ADD、ADDC以及SUBB运算中,如果产生了进位或借位,将自动对PSW中的Cy标志位置“1”。ADDC:(A)(A)+(Cy)+(第二操作数)SUBB:(A)(A)-(Cy)-(第二操作数)ADD、ADDC、SUBB指令小结(1)加1指令(Increase)INCA ;(A)←(A)+1INCRn ;(Rn)←(Rn)+1INCdirect ;(direct)←(direct)+1INC@Ri ;((Ri))←((Ri))+1INCDPTR ;(DPTR)←(DPTR)+1对标志位的影响:除INCA影响P外,不影响任何标志位。例如:已知(A)=0FFH 执行INCA后,(A)=,Cy= 执行ADDA,#01H后,(A)=,Cy=。00H不变。00H14、加1/减1操作:(INC,DEC—9条)(2)减1指令DEC(Decrease)DECA;(A)←(A)-1DECRn;(Rn)←(Rn)-1DECdirect;(direct)←(direct)-1DEC@Ri;((Ri))←((Ri))-1说明:与INC命令类似; 但无“DECDPTR”指令。例如:R0=30H,(30H)=22H, 执行DEC@R0后,(30H)=。21H〔例〕已知: (A)=0FFH (R2)=0FH (R0)=40H (40H)=00H (DPTR)=1AFFH。执行下列指令:其结果为:INCAINCR2INC@R0INCDPTR加1/减1支令应用举例;(A)=00H;(R2)=10H;(R0)=40H;(40H)=01H;(DPTR)=1B00H。〔例〕已知: (A)=10H (R5)=00H (30H)=2FH (R0)=40H (40H)=0FFH。执行下列指令:其结果为:DECADECR5DEC30HDEC@R0加1/减1支令应用举例;(A)=0FH;(R5)=0FFH;(30H)=2EH;(40H)=0FEH,(P)=0(1)乘法指令MUL(Multiplication) MULAB ;BA←A×B 低8位→A,高8位→B功能:累加器A和寄存器B中的两个无符号8位数相乘,所得16位乘积的低8位放在A中,高8位入在B中。例如:(A)=20H=32,(B)=0A0H=160, 执行指令:MULAB结果:积为1400H=5120, (A)= (B)=(C)= (OV)=00H14H015、单字节乘/除运算:(MUL,DIV—2条)乘法指令MUL说明没有带符号数乘法指令

A、B中都是无符号整数对PSW状态的影响。 进位标志总是清零Cy=0

OV与结果有关。

OV=0,表示乘积小于256,(B)=0;

OV=1,表示乘积大于255,(B)≠0。DIVAB;(A)÷(B),(A)←商,(B)←余数功能:两8位无符号数相除。 执行前:(A)←被除数;(B)←除数。 执行后:(A)←商,(B)←余数。(2)除法指令DIV(Division)例如:(A)=0FBH=251,(B)=12H=18, 执行指令DIVAB结果:(A)=0DH=13,(B)=11H=17,例如:(A)=0FBH=251,(B)=12H=18, 执行指令DIVAB结果:(A)=0DH=13,(B)=11H=17,

(C)= (OV)=(2)除法指令DIV(Division)说明:a)没有带符号除法指令,A、B中都是无符号整数b)对标志位的影响: 进位标志总是清零Cy=0如果除数B为“0”,OV=1,否则OV=00,0〔例〕编程实现下列运算:F=D1×D2+D3/D4,其中D1、D2、D3、D4都为非0的8位二进制无符号数。〔解〕MOVA, #D1 MOVB, #D2 MULAB

;计算D1×D2=BA MOV R2, A ;暂存D1×D2=R3R2的结果 MOV R3, B MOVA, #D3 MOVB, #D4 DIV AB ;计算D3/D4 ADD A, R2;乘积的低位与商相加 MOVR2, A;存F低位 MOVA, R3 ADDCA, #0;乘积的高位与低位和的进位相加 MOVR3, A;存F高位在R3中乘/除运算应用举例6、十进制调整指令DAA(1条)问题引入:

在指令系统中,没有专门的十进制(BCD码)的加法运算指令,两个十进制(BCD码)的加法只能使用ADD,ADDC命令,但计算结果不是十进制(BCD码)

。例如:(a)5+3=8(b)7+6=13(c)8+9=17010101111000+)0011+)0110+)10011000

110110001(a)的运算结果是BCD码;(b)(c)的运算结果不是BCD码。6、十进制调整指令DAA(1条)解决办法:对累加器中由上一条加法指令(加数和被加数均为压缩的BCD码)所获得的结果进行调整,使得结果为压缩BCD码形式。010101111000+)0011+)0110+)10011000

110110001注意:

ADD或ADDC与DAA指令一起使用;参与运算的两个加数均为压缩型BCD码;结果是大家熟悉的压缩型BCD码 +)0110+)0110 1001110111〔例〕在20H、21H中分别存放压缩BCD码55和72,试将两数相加,并计算出结果。DAA指令应用举例〔解〕

MOVA,20HADDA,21HDAA,结果:

(A)= C=如果不使用DAA指令,则结果: (A)= C=27H10C7H0若(A)3~09或(AC)=1则(A)3~0(A)3~0+6;若(A)7~49或(CY)=1则(A)7~4(A)7~4+6;例:两个十进制数“65”与“58”相加,根据常识,显然其和应当为“123”。“DAA”指令完成的操作MOVA,#65HADDA,#58HDAA结果:(A)=23H(CY)=1131819265+58+66B>9D>9BD若(A)3~09或(AC)=1则(A)3~0(A)3~0+6;若(A)7~49或(CY)=1则(A)7~4(A)7~4+6;又如:两个十进制数“39”与“58”相加,根据常识,显然其和应当为“97”。“DAA”指令完成的操作(续)MOVA,#39HADDA,#58HDAA结果:(A)=97H(CY)=097+639+5891AC=1逻辑与运算:(ANL——6条)逻辑或运算:(ORL——6条)逻辑异或运算:(XRL——6条)累加器清零/取反:(CLR,CPL——2条)累加器移位操作:(RL,RLC,RR,RRC—4条)三、逻辑运算及移位类指令(5种/24条)指令形式ByteTmANL(ORL,XRL)direct,A21ANL(ORL,XRL)direct,#data32ANL(ORL,XRL)A,#data21ANL(ORL,XRL)A,direct21ANL(ORL,XRL)A,@Ri11ANL(ORL,XRL)A,Rn11说明:逻辑运算是按位进行的,对进位标志位C不产生影响。 ∧--“与”,“有0即0,全1为1”∨--“或”,“有1即1,全0为0”--“异或”,“相异为1,相同为0”1、逻辑与(ANL),逻辑或(ORL),逻辑异或(XRL):(1)逻辑与ANL用于清0或者保留某些位: 例:ANLA,#0FH; 则(A)=0AH(高4位清0,低4位不变)(2)逻辑或ORL用于置1或者保留某些位: 例:ORLA,#0FH; 则(A)=9FH(高4位不变,低4位置1)(3)逻辑异或XRL用于取反或者保留某些位:说明: ①若与0进行异或运算,结果保持不变; ②若与1进行异或运算,结果取反; ③自身异或等效于清0。例:XRLA,A;结果为:(A)=0(已知累加器A中已存有数:9AH)ANL,ORL,XRL指令的常见用法2、累加器清零/取反:(CLR,CPL—2条)CLRA;A←“0”CPLA;A←A例: (A)=3AH, 执行 CPLA 结果为:(A)=0C5H

00111010B→11000101B说明:1)取反即为逻辑非运算。 2)MCS-51单片机没有求补指令,若对累加器A中数求补,则程序如下:CPLAINCARLA 左环移An+1←An,A0←A7累加器A累加器ACy累加器ACy累加器ARRCA 带进位位右环移 An+1

→An,C→A7,A0

→CRRA 右环移An+1→An,A0

→A7RLCA 带进位位左环移

An+1←An,A0←C,C←A73、累加器移位操作:(4条)逻辑运算及移位类指令总结此类指令改变程序的执行顺序——改变当前PC值顺序执行:由PC自动加1实现分支、循环:通过控制转移类指令强迫改变PC值来实现无条件转移:(LJMP,AJMP,SJMP,JMP——4条)条件转移(判断跳转):(JZ,JNZ,CJNE,DJNZ——8条)子程序调用及返回:(LCALL,ACALL,RET,RETI——4条)空操作:(NOP——1条)“耗时”一个机器周期。donothing!四、控制转移类指令(4种/17条)LJMPaddr16;PC←addr16

长跳转指令——可在64K范围内跳转AJMPaddr11;PC←(PC)+2,PC10~0←addr11

绝对跳转指令——可在指令所在的2K范围内跳转SJMPrel;PC←(PC)+2+rel

相对跳转指令——可在当前PC-128与+127范围内跳转JMP@A+DPTR;PC←(A)+(DPTR)

间接长跳转指令——可在以DPTR为基址+A为偏移量之和所指向的64K程序范围内跳转1、无条件转移——4条说明:①在程序中addr16,addr16,rel等可用标号代替,表示要转 移的目的地址

②LJMP,STMP,AJMP功能相同,只是转移范围不同。地址机器码00002000300030C30031E60032370033080034DAFB0036800200387803003A18003B80FE原地踏步指令:SJMP$常写成:HERE:SJMPHERE

程序中标号与地址之间的关系源程序注释

ORG0000H;整个程序起始地址 LJMPMAIN;跳向主程序 ORG0030H;主程序起始地址MAIN:CLRC;MAIN为程序标号LOOP:MOVA,@R0 ADDCA,@R1 INCR0 DJNZR1,LOOP;相对转移 SJMPNEXT MOVR0,#03HNEXT:DECR0 SJMP$;

END;结束标记例:根据累加器中的命令键值,设计命令键操作程序入口跳转表。A0…7入口标号PM0…PM7AJMPPM0PMTBJMP@A+DPTR散转指令应用举例AJMPPM0AJMPPM7...例:根据累加器中的命令键值,设计命令键操作程序入口跳转表。PM: CLR CRL A ; A=A*2

温馨提示

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

评论

0/150

提交评论