第3章 指令系统LAST_第1页
第3章 指令系统LAST_第2页
第3章 指令系统LAST_第3页
第3章 指令系统LAST_第4页
第3章 指令系统LAST_第5页
已阅读5页,还剩186页未读 继续免费阅读

下载本文档

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

文档简介

第3章

指令系统与汇编程序设计学习目标

MCS-51单片机的指令格式及寻址方式汇编语言的指令类型

MCS-51单片机汇编语言编程基本方法伪指令使用及汇编语言程序完整格式应用MCS-51单片机指令系统进行编程主要内容3.1指令概述

3.2寻址方式 3.3指令系统 3.4伪指令 3.5汇编语言程序设计3.1指令概述

3.1.1指令格式MCS-51单片机指令格式采用了单地址指令格式。一条汇编语句是由标号、操作码、目的操作数、源操作数和注释等5部分组成的,其中方括号中的部分是可以选择的。1、指令的具体格式为:

[标号]:操作码[目的操作数],[源操作数];[注释]例如:HY1:MOVR3,#08H;执行数据传送操作一台计算机所有指令的集合称为该计算机的指令系统。其中方括号内的部分为可选项二、指令的三种表示形式机器语言、汇编语言、高级语言以ADDA,#05H为例机器语言二进制:0010010000000101十六进制:24H05H汇编语言:ADDA,#05H高级语言:X=A+B指令的表示形式是识别指令的标志。1)二进制的表示形式:特点:能被CPU直接识别、运行的形式。也称机器码、汇编语言的目标代码。缺点:不便于阅读、记忆和调试修改。2、指令的三种表示形式:2)指令的“助记符”方式(也称“汇编格式”):

00100100B24H00001000B08HADDA,#08H

这是一种由英文单词或字母、数字来表征指令功能的形式。是一种便于阅读、书写和交流的表示形式。这种“汇编”格式的指令必须把它“翻译”为二进制形式“机器码”后才能为CPU所识别和执行。三种不同的表示方法适用于不同的场合。本章内容都以汇编的形式介绍指令系统。二进制表示形式十六进制表示汇编格式下面是一段汇编语言程序的4分段书写格式:标号字段操作操作数注释码字段字段字段START:MOVA,#00H;0→AMOVR7,#10;10→R7MOVR2,#00000011B;3→R2LOOP:ADDA,R2;(A)+(R2);→ADJNZR7,LOOP;R7的内容;减1不为0;则循环NOPSJMP$1、Rn:工作寄存器可以是R0~R74、@Ri:表示寄存器间接寻址Ri只能是R0或R1(1).指令系统中用的符号说明2、#data:8位立即数3、direct:8为直接地址,可以是00H~7fH,也可以是SFR的名称。6、@DPTR:表示以DPTR为数据指针的间接寻址,访问外部ROM/RAM5、#data16:16位立即数7、bit:位地址。10、rel;8位带符号地址偏移量。(2)指令对标志位的影响不同指令对标志位的影响不同8、add11:11位目标地址。9、add16:16位目标地址。11、$;当前指令的地址。助记符意义操作码助记符对照英文传送MOVMOVe代码区数据传送MOVCMOVeCode外部RAM区数据传送MOVXMOVeeXternal压栈PUSHPUSH退栈POPPOP交换XCHeXCHange3、51系列单片机汇编语言操作码的对照英文助记符意义操作码助记符对照英文十进制交换XCHDeXCHangeDecimal加法ADDADD带进位加ADDCADDwithCarry带借位减SUBBSUBtractwithBorrow加1INCINCrement减1DECDECrement乘MULMULtiply助记符意义操作码助记符对照英文除DIVDIVide十进制调整DADecimalAdjust逻辑与ANLLogicleANd逻辑或ORLLogicleOR逻辑异或XRLLogicleeXclusive-oR求补CPLComPLement清零CLRCLeaR助记符意义操作码助记符对照英文置位SETBSETBit左移RLRotateLeft带进位左移RLCRotateLeftthrouththeCarryflag右移RRRotateRight带进位右移RRCRotateRightthrouththeCarryflag(半字节)互换SWAPSWAP助记符意义操作码助记符对照英文绝对转移AJMPAbsoluteJuMP相对转移SJMPShortJuMP长转移LJMPLongJuMP跳转JMPJuMP累加器为零转移JZJumpifaccisZero累加器不为零转移JNZJumpifaccisNotZero助记符意义操作码助记符对照英文进位位为1转移JCJumpifCarry(ifCy=1)进位位为0转移JNCJumpifNotCarry(ifCy=0)指定为为1转移JBJumpifBitisset指定位为0转移JNBJumpifNotBit(ifbit=0)指定位为1转移并清该位JBCJumpifBitissetandClearbit助记符意义操作码助记符对照英文比较不等转移CJNECompareandJumpifNotEqual减1不为0转移DJNZDecrementandJumpifNotZero短调用ACALLAbsoluteCALL长调用LCALLLongCALL子程序返回RETRETurn中断返回RETIRETurnfromInterrupt空操作NOPNoOPeration主要内容3.1指令概述 3.2寻址方式

3.3指令系统 3.4伪指令 3.5汇编语言程序设计寻址方式实际上是指令中提供操作数的形式,即寻找操作数或操作数所在地址的方式。51系列单片机中,存放数据的存储器空间有4种:内部RAM、SFR、外部RAM和程序存储器。为了区别指令中操作数所处的地址空间,对于不同存储器中的数据操作,采用不同的寻址方式。

51系列单片机寻址方式共有七种:立即数寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。3.2寻址方式:3.2.1立即寻址指令中直接给出操作数的寻址方式称为立即寻址。立即数用一个前面加“#”的8位数(#data,如#40H)或16位数(#data,如#2008H)表示。它直接出现在指令中,紧跟在操作码的后面,作为指令的一部分与操作码一起存放在程序存储器中,可以立即得到并执行。因此立即寻址的指令多为2字节或3字节指令。(P42~46)例3-1MOVA,#20HMOVDPTR,#2009H执行指令后,A的内容为20H,立即数2009H送到DPTR,DPH的内容为20H,DPL的内容为09H。

3.2.2直接寻址

指令中直接给出操作数地址(direct)的寻址方式称为直接寻址。由于直接寻址方式中只能使用8位二进制数表示地址,所以使用直接寻址只可访问片内RAM的128个单元以及所有的特殊功能寄存器(SFR)。对于特殊功能寄存器,既可以使用它们的地址,也可以使用它们的名字。(1)寻址空间内部RAM的低128字节00H~07FHA:适当选择累加器的形式,累加器在指令系统中有三种形式AACC0E0HINCA04H寄存器寻址二、直接寻址:给出操作数的地址MOVA,30HA(30H)特殊功能寄存器SFR(2)使用注意事项INCACC05E0H直接寻址INC0E0H05E0H直接寻址(3)特殊功能寄存器的寻址方式只有一种即直接寻址,直接寻址的SFR的名称如书2324页。

直接寻址方式示意图如下:直接寻址例子若(A)=30H,(25H)=4DH,(P0)=3EH,(30H)=11H,(20H)=2FH则执行上述指令后,结果为:(A)=4DH,(25H)=4DH,(P0)=50H,(30H)=2FH,(20H)=2FH例3-2MOVA,25H;(25H)→(A)MOVP0,#50H;立即数50H→P0MOV80H,#50H;同上一条指令相同,只是表;达方式不一样,建议用上条;指令格式,易读MOV30H,20H;(20H)→(30H)操作数放于某个工作寄存器内R0~R7,指令码中含有寄存器编号。例如:MOVA,Rn E8~EFADDA,Rn28~2FINCRn08H~0FH

DECRn18H~1FH3.2.3寄存器寻址E8MOVA,R0;11101000Rn的物理地址由PSW中的RS1和RS0确定:EFMOVA,R7;11101111INCR008H00001000例如:MOVA,R2;R2A若RS1=0,RS0=0则R2的物理地址为02H35H02H03H01H35HA寄存器寻址定义通用寄存器包括R0-R7以及ABDPTR。直接寻址和寄存器寻址的差别:

直接寻址的操作数是以地址形式(如A=E0H,B=F0H,R0=00H)直接出现在指令码中。寄存器寻址的操作数是以寄存器编码形式出现在指令码中。使用寄存器寻址的寄存器少、编码少(至多三位二进制数),通常操作码和寄存器编码合用一个字节,因此寄存器寻址的指令机器码短,占用空间小,执行快。除上面所指出的几个寄存器外,其他SFR均为直接寻址。

寄存器寻址方式示意图如下:11100010寄存器寻址实例例3-3MOVA,R0;(R0)→(A),机器码为E8,仅占;1字节,A和R0均为寄存器寻址MULAB;(A)*(B)→(B)(A)机器码为A4,;A和B均为寄存器寻址MOVB,R0;(R0)→(B),机器码为88F0,其第;2字节F0为B的地址,B为直接寻;址,R0为寄存器寻址PUAHACC;A的内容压入堆栈,机器码为;C0E0,其第2字节E0为A的地址;A为直接寻址

MOVB,00H;(00H)→(B),机器码为8500F0,寄存器间接寻址:指令码含有操作数地址的寄存器号,寄存器用R0、R1、DPTR。

3.2.4寄存器间接寻址寻址范围A片内RAM00H~7FHMOVA,R0;AR0MOVA,@R0;A(R0)P2高八位Ri低八位B片外RAM64KDPTR作间接地址注意事项:寄存器间址指令不能用于寻址特殊功能寄存器MOVR0,#90H;MOVA,@R0;是错误的寄存器间接寻址方式示意图如下:例3-4MOV@R0,A;(A)→((R0))MOVXA,@R1;外部RAM(地址为P2:R1);的内容→(A)MOVX@DPTR,A;(A)→以DPTR内容为地址的;外部RAM若(A)=3AH,(R0)=74H,(74H)=21H,执行第一条指令后,(74H)=3AH,其余两条指令类似。

寄存器间接寻址实例操作数地址=基址+变址PC基址DPTR变址A,八位无符号数00H~FFH

3.2.5变址寻址这种寻址方式常用于访问程序存储器中的常数表。由于程序存储器是只读存储器,因此变址寻址只有读操作而无写操作在指令符号上,采用MOVC形式。变址寻址指令只有下列3条指令。MOVCA,@A+DPTR;((A)+(DPTR))→(A)MOVCA,@A+PC;((A)+(PC))→(A)JMP@A+DPTR;(A)+(DPTR)→(PC)变址寻址方式示意图如下:ROM1EHMOVCA,@A+DPTR0211HDPTR0200HA1EHA11H+......变址寻址实例以当前程序计数器PC值加上指令中给出的偏移量rel,构成实际操作数地址的寻址方式称为相对寻址。在使用相对寻址时要注意以下两点:(1)当前PC值是指相对转移指令的存储首地址加上该指令的字节数。(2)偏移量rel是有符号的单字节数。以补码表示其值是-128~+127(00~FFH),负数表示从当前地址向前转移,正数表示从当前地址向后转移。 满足转移条件的目的地址为:目的地址=当前PC值+rel=转移指令所在首地址+转移指令的字节数+rel

3.2.6相对寻址例3-6:JZrel;若(A)=0,则(PC)=(PC)+2+rel;若(A)≠0,则(PC)=(PC)+2

在实际编程应用中,rel通常是用转移目的地址的标号来替代,由机器汇编程序自动计算偏移量rel,因此rel不需要手算。相对寻址实例

LOOP:MOVA,20HMOVA,#30H;MOVA,R3MOV40H,@R0MOVDPTR,#1006HMOVCA,@A+DPTRJZLOOP

若(20H)=77H(R0)=20H(R3)=88H

(A)=77H(A)=30H(A)=88H(40H)=77H(DPTR)=77H位寻址定义:对可位寻址的地址中的内容进行位操作的寻址方式位寻址方式中位地址常用两种方式表示:(1)、直接使用位地址。对于20H~2FH的16个单元,共128位的位地址。地址分布是00H~7FH。(2)、对于特殊功能寄存器,可以直接用寄存器名字加位数表示如PSW.0、IE.7等。也可以用其对应的位地址符号如P、EA等表示。编程时常使用符号字节地址和符号位地址形式,而不用直接字节地址和位地址,这样做便于阅读和理解。

3.2.7位寻址例3-7:SETB20H;1→20H位SETBEA;1→EA位SETBIP.0;同上

位寻址实例判断下列指令中操作数的寻址方式LOOP:MOVA,BMOVAcc,#30H;MOVA,R3MOV40H,@R0MULABMOVCA,@A+DPTRSETB20HJZLOOP主要内容3.1指令概述 3.2寻址方式 3.3指令系统

3.4伪指令 3.5汇编语言程序设计51系列单片机的指令系统共有111条指令。指令系统按指令在程序存储器所占字节可分为:单字节指令49条;双字节指令45条;三字节指令17条。按指令执行时间可分为:

1个机器周期的指令64条;

2个机器周期的指令45条;

4个机器周期的指令(乘、除)2条;3.3指令系统:

3.3.1指令系统概述

按指令的功能可分为:数据传送类指令29条;算术运算类指令24条;逻辑操作类指令24条;控制转移类指令17条;位操作类指令17条。比较指令系统中的操作数,可以看出:(1)A寄存器使用频率最高。这说明正确掌握使用A寄存器的方法至关重要,同时A也成为程序设计的瓶颈。(2)Direct出现次数居第二。这表明正确掌握片内RAM和SFR的使用非常重要;(3)@Ri和#data出现次数居第三。立即数在程序初始化和参数设置方面应用很广;寄存器间接寻址在程序设计中常常用到。把源操作数送给目的操作数,源操作数不变分为内部RAM和SFR、外部数据传送、堆栈指令、数据交换一、内部数据传送指令15条1、立即寻址型:源操作数字节是立即数MOVA,#data;Adata74dataMOVRn,#data;Rndata78~7FdataMOV@Ri,#data;(Ri)data76~77dataMOVdirect,#data;(direct)data75data

3.3.2数据传送指令例:R0=30H执行如下程序后分析AR430H31H单元的内容MOVA,#10HMOVR4,#36HMOV@R0,#7AHMOV31H,#01H;(A)=10H;(R4)=36H;(30H)=7AH;(31H)=01H2、内部数据存储器(Rn片内RAMSFR)与累加器之间的数据传送MOVA,Rn;ARnE8H~EFHMOVRn,A;RnAF8H~FFHMOV@Ri,A;(Ri)AE6H~E7HMOVA,@Ri;A(Ri)F6H~F7HMOVdirect,A;(direct)AE6H~E7HMOVA,direct;A(direct)F6H~F7H3、内部数据存储器(Rn片内RAMSFR)与片内RAM之间的数据传送MOVdirect,Rn;(direct)Rn88H~8FHdirectMOVRn,direct;RndirectA8H~AFdirectMOV@Ri,direct;(Ri)directA6H~A7HMOVdirect,@Ri;direct(Ri)86H~87HdirectMOVdirect2,direct1;(direct2)(direct1)85Hdirect1direct2例:设内部RAM(30H)=40H,(40H)=10HP1口作输入,输入数据为0CAH执行如下程序后R0=R1=A=B=P1=(40)=MOVR0,#30HMOVA,@R0MOVB,@R1MOV@R1,P1MOVP2,P1;R030H;(30H)AMOVR1,A;R1A;(R0)=30H;(A)=40H;(R1)=40H;(40H)B;(B)=10H;(40H)=0CAH;(90H)(40H);(90H)(A0H);(P2)=0CAH内部数据传送指令总结:内部数据指令中都是用MOV传送A、指令系统中,指令格式和代码由硬件系统决定,不得自己随意编制指令;例如MOVR1,@R2B、要清楚每种寻址方式的寻址范围。例如R0=90HMOVA,@R0是错误的原因是特殊功能寄存器只能是直接寻址C、以累加器为目的操作数会影响PSW中的奇偶标志位累加器Direct直接地址Rn寄存器#data立即数@Ri间接地址例3-8将RAM中20H~25H单元内容传入RAM中60~65H单元。

分析:传送内容只有6次,查指令表知可使用MOVdirect1,direct2共6条指令即可完成。合理可用。程序如下:MOV60H,20HMOV61H,21HMOV62H,22HMOV63H,23HMOV64H,24HMOV65H,25H例3-9将RAM中10H~35H单元内容传入RAM中50H~75H单元。分析:(1)传送内容共有35H-10H+1=26H=38次,如果仍使用上述指令需要38条相同形式的指令,程序太长,可实现但不易读。(2)使用循环传送较好,循环次数为26H次,查循环转移指令,共有DJNZRn,rel和DJNZdirect,rel两条指令,前者占用字节数少,故选前者Rn=R7。(3)源操作数地址存入R0,目的操作数地址存入R1,查表知无MOV@R1,@R0指令,因此需使用MOVA,@R0和MOV@R1,A两条指令间接实现一次数据传送,一次传送完成后,R0和R1分别加1,R7内容(循环次数)减1,若R7内容不等于0,执行下一次传送,反之传送完成。程序如下:MOVR0,#10H;数据源起始地址送R0MOVR1,#50H;目标单元起始地址送R1MOVR7,#26H;循环次数送R7NET1:MOVA,@R0;要传送的数据送AMOV@R1,A;通过A送入目标单元INCR0;R0+1→R0INCR1;R1+1→R1DJNZR7,NET1;R7内容减1,若为0结束循环,反之跳转到NET1

可见使用间接寻址方式传送,辅之控制转移指令不仅程序简单而且易读,合理。1、16位数传送指令二、外部存储器的读写指令7条MOVDPTR#data2、ROM的字节传送指令访问程序存储器的数据传送指令又称作查表指令,采用基址寄存器加变址寄存器间接寻址方式,把程序存储器中存放的表格数据读出,传送到累加器A。共有如下两条单字节指令,指令操作码助记符为MOVC。指令助记符操作功能注释机器码(H)MOVCA,@A+DPTR;(A)←((A)+(DPTR))93MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))83

前一条指令采用DPTR作基址寄存器,因此可以很方便地把一个16位地址送到DPTR,实现在整个64KB程序存储器单元到累加器A的数据传送。即数据表格可以存放在程序存储器64KB地址范围的任何地方。变址寻址ORG0000HLJMPSTARTORG0030HSTART:MOVA,#02MOVCA,@A+PCTABLE:DB00HDB01H DB04H DB09H DB10H DB19H

1009040100830030003100320033003400357402190036003700380039START:MOVR0,#01H LOOP:MOVA,R0ADDA,#05MOVCA,@A+PC MOV20H,A INCR0JMPLOOPTABLE:DB00HDB01H DB04H DB09H DB10H DB19HEND800820F583E8003000310032003300340035003A003B003C003D003E003F00407801F90001040910190036003700380039ORG0000HLJMPSTARTORG0030HSQUAREEQU22HSTART:MOVR0,#01H LOOP:MOVA,R0ADDA,#05MOVCA,@A+PC MOVSQUARE,A INCR0JMPLOOPTABLE:DB00HDB01H DB04H DB09H DB10H DB19HEND003600370038003920F5830524E8003000310032003300340035003A003B003C003D003E003F004078010880F7000104091019@A+PC实例3、外部RAM的字节传送指令4条MOVXA,@RiMOXX@Ri,AMOVXA,@DPTRMOVX@DPTR,A前面两条指令的高位地址由P2口设置,可访问片外64K的范围。例3-10将片外RAM中2000H单元内容传入RAM中50H单元。

分析:查表知从片外RAM读取数据有2条指令:MOVXA,@Ri和MOVXA,@DPTR。后一条指令外部RAM的地址是直接放在DPTR中的,而前一条指令,由于Ri(即R0或R1)只是一个8位的寄存器,所以只提供低8位地址,须用P2口输出高8位地址。这时就应事先预置P2的值。使用后一条指令较简单.

程序如下:MOVDPTR,#2000HMOVXA,@DPTRMOV50H,A需要说明的是,对外部RAM的操作必须经过累加器A才能完成。如果将片外RAM中19FFH~2030H单元的内容传送到内部RAM中30H~61H单元,程序应如编制呢?

程序如下:MOVDPTR,#19FFHMOVR0,#30HMOVR7,#32H;传送次数32H送R7NET1:MOVXA,@DPTRMOV@R0,AINCDPTR;指向源地址下一单元

;指向目的地址下一单元INCR0;R7内容减,1不为0则跳转到NET1DJNZR7,NET1

堆栈操作主要用在子程序和中断服务子程序中用来保护和恢复SFR和片内RAM中其他单元的内容。在片内RAM的128B单元中可以设定一个后进先出的区域作为堆栈区,堆栈区要足够大且不被破坏,以保证多重嵌套子程序使用,否则会出现非正常状态。一般在程序初始化时给堆栈指针SP赋初值,此后栈顶由堆栈指针SP指出。堆栈操作有入栈和出栈,即压入和弹出数据。三、堆栈操作指令2条入栈指令PUSHdirect用于保存片内RAM单元或SFR中需要保护的内容。操作时,先将堆栈指针SP内容加1,然后把直接地址单元的内容压入SP所指内部RAM单元内。出栈指令POPdirect用于恢复片内RAM单元或特殊功能寄存器SFR的内容。操作时,先将堆栈指针SP所指内部RAM单元中内容送入direct单元中,然后堆栈指针SP内容减1,指向新栈顶。PUSHdirect;SPSP+1(SP)(direct)POPdirect;(SP)(direct)SPSP-1POP00HPUSHACCPUSHAPOPR0错的

错的

正确

正确

MOV20H,#55HMOVA,#88HMOVSP,#30H PUSH20HPUSHACCMOV20H,#22H MOVA,#08H POPACC POP20H

(20H)=55H(A)=88H(SP)=30H(31H)=55H(32H)=88H(20H)=22H(A)=08H(A)=88H(20H)=55HPUSH实例XCHDA,@Ri;A3~0(Ri)3~0例:编出外部RAM20H单元一个数X和内部RAM20H单元中的Y互换的程序XCHA,@R1;MOVX@DPTR,A;MOVDPTR,#0020H;MOVXA,@DPTR;四、数据交换类指令5条XCHA,@RiA(Ri)XCHA,directA(direct)XCHA,RnARnSWAPA;执行结果为将A的高4位与低4位交换MOVR1,#20H;;执行结果为(A)=A5HXCHDA,@Ri指令的功能是将Ri间接寻址的单元内容与累加器A中内容的低4位互换,各自的高4位内容不变。SWAPA指令是将A的高4位与低4位交换。;执行结果为:(20H)=37H,(A)=5AH例3-12若(R0)=20H,(20H)=3AH,(A)=57H,执行程序:XCHDA,@R0SWAPA

算术运算指令包括加、减、乘、除基本四则运算,共有24条指令。算术运算的结果将对进位CY、半进位AC、溢出位OV三个标志位置位或是复位,只有加1和减1指令不影响这些标志位。3.3.3算数运算指令一、算术运算指令24条1、加法指令(1)不带进位位CY的加法源操作数可以是立即数、直接地址、寄存器、寄存器间址。ADDA,#data;AA+dataADDA,Rn;AA+RnADDA,@Ri;AA+(Ri)ADDA,direct;A(direct)注意:a、加数和被加数都为8位二进制结果也为8位,对PSW有影响。10100011CYACF0RS0RS1OV-P例3-16(A)=45H,(R0)=10H,(10H)=2FH,执行指令:ADDA,@R0执行过程为:01000101+)0010111101110100

8位二进制加法运算的一个加数固定在累加器A中,计算结果也固定存放于累加器A中。当和的第3位和第7位有进位时,分别将AC,CY标志置位1;否则为0。溢出标志OV=CP⊕CS。其中CP是高位的进位位,CS是次高位进位位。所以(A)=74H,(CY)=0,(AC)=1,(OV)=0,(P)=0。(2)带进位位的加法指令ADDCA,RnAA+Rn+CYADDCA,directAA+(direct)+CYADDCA,@RiAA+(Ri)+CYADDCA,#dataAA+data+CY例3-17(A)=45H,(R0)=10H,(10H)=2FH,(CY)=1,执行指令:ADDCA,@R0执行过程为:0100010100101111+)101110101

这条指令与不带进位加法指令不同点是进位标志CY将参加运算,CY的值要加到累加起A中。其结果也是存放于累加器A中。当运算结果第3位和第7位有进位时,分别将AC,CY标志位置1;否则为0。若产生溢出时,OV置1。所以(A)=75H,(CY)=0,(AC)=1,(OV)=0,(P)=1.1、A=0B6HCY=02、A=85HCY=13、A=97HCY=04、A=0BHCY=1例:A=85H,R0=30H(30H)=11H(31H)=0FFH,CY=1求执行结果A和CY1、ADDCA,R02、ADDCA,31H3、ADDCA,@R04、ADDCA,#85H185306B185FF581185117918585B01INCA;AA+1INCRn;RnRn+1INCdirect;(direct)(direct)+1INC@Ri;(Ri)(Ri)+1INCDPTR;DPTRDPTR+1例3-21(A)=C3H,(DPTR)=20FFH,执行指令:INCAINCDPTR执行结果:(A)=C4H,(DPTR)=2100H指令的功能是将操作数所指定的单元内容加1,内容改变后又存放于同一单元。其操作不影响PSW。若单元内容为FFH,加1后溢出为00H,也不影响PSW标志。INCDPTR是指令集中唯一的一条16位算术运算指令。它是将DPTR中的内容加1。若低8位DPL执行加1操作产生溢出时,就对高8位DPH的内容加1,其结果不影响标志位。2、减法指令(1)、带CY减法指令SUBBA,Rn;AA-Rn-CYSUBBA,direct;AA-(direct)-CYSUBBA,@Ri;AA-(Ri)-CYSUBBA,#data;AA-data-CY例3-18(A)=A9H,(R2)=24H,(CY)=1,执行指令:SUBBA,R2

执行过程:1010100100100100-)110000100

减法指令的功能是从累加器A中减去不同寻址方式的减数以及进位位CY的值,差的结果存放在累加器A中。所以(A)=84H,(CY)=0,(AC)=0,(OV)=0。在51系列单片机指令系统中,由于没有不带借位的减法指令,若是要执行不带借位的减法,必须在“SUBB”指令前用“CLRC”指令将CY清0。同时,若第3位和第7位有借位时,AC和CY需置位,否则清0。DECA;AA-1DECdirect;directdirect-1DECRn;RnRn-1DEC@Ri;(Ri)(Ri)-1(2)、减1指令这条指令的功能是将操作数所指定的单元内容减1,内容改变后又存放于同一单元。其操作不影响PSW。若单元内容为00H,减1需借位,其值溢出为FFH,其结果也不影响PSW标志。例3-22(A)=C3H,执行指令:DECA执行结果:(A)=C2H

3、十进制调整指令DAA若AC=1或A3~0>9则AA+06H若CY=1或A7~4>9则AA+60H该指令是用于压缩BCD码加法运算的十进制调整

十进制调整指令DAA一条专用指令,用于对BCD码十进制数加法运算的结果进行修正。该指令必须紧跟在加法指令之后。前面讲过的ADD和ADDC指令都是二进制加法指令。但对于十进制数(BCD码)的加法运算指令系统中并没有专门的指令,因此只能借助于二进制加法指令来完成。然而二进制数的加法运算原则不能完全适用于十进制数的加法运算,有时会产生错误的结果例如:(a)6+3=9(b)8+4=12(c)8+9=17011010001000+0011+0100+1001100111001←0001其中:(a)运算结果正确。9的BCD码就是1001(b)运算结果不正确。因为十进制数的BCD码中没有1100这个编码。(c)运算结果不正确。因为8+9的正确结果应为17。

分析出错的原因:4位二进制编码一共有16个编码,但BCD码采用4位二进制编码,却只用了其中的10个(0000~1001B)编码。剩余的6个编码(1010~1111B)通常称之为无效码。在进行BCD码加法运算时,其结果进入或跳过无效编码区时结果就会出现错误。因此对于BCD码十进制数进行加法运算时需要进行调整,调整的方法是:(1)累加器低4位大于9或是AC=1,则将低4位加6进行修正。(2)累加器高4位大于9或是CY=1,则将高4位加6进行修正。(3)累加器高4位为9,低4位大于9,则高4位和低4位分别加6进行修正。说明:1、本指令使用时跟在ADD或ADDC之后2、不能用DA指令对BCD码减法直接调整3、指令不影响溢出标志位OV4、借助标志位可实现多位BCD码加法结果的调整。例:完成85+59的BCD加法调整解:ORG1000HMOVA,#85H;A85HADDA,#59H;A85H+59HA=DEHDAASJMP$END01011001低四位〉9高四位〉9例3-23(A)=01010110B,(R2)=01100111B,

执行指令:ADDA,R2DAA执行过程:01010110+)0110011110111101调整:01100110结果:100100011所以,BCD码为123。MUL1、进位标志位CY总是清零2、P由累加器中1的个数决定3、当积大于255OV=1否则OV=0DIV1、对CY和P的影响与MUL相同2、当除数为零时除法没有意义,OV=1,否则OV=04、乘法和除法指令MULABDIVAB形成进位标志位

3.3.4逻辑操作指令

逻辑操作指令可以对两个8位二进制数进行与、或、异或、清除、求反、移位等操作。在这类指令中,除以累加器A为目标寄存器指令外,其余指令均不影响标志位。ANL(ORL、XRL)A,direct;ANL(ORL、XRL)A,#data;ANL(ORL、XRL)direct,A;ANL(ORL、XRL)direct,#data;AA^(direct)AA^datadirectA^(direct)directA^dataANL(ORL、XRL)A,Rn;ANL(ORL、XRL)A,@Ri;CLRA;将A清0CPLA;将A按位取反RLC/RLA;带/不带进位位的左移指令RRC/RRA;带/不带进位位的右移指令

例:1MOVA,#0FFHANLA,R02MOVA,#0F0HANLA,@R0解:A=30H

2A=A0H(30H)=0AAH已知R0=30H和(30H)=0AAH,试问8031分别执行如下程序后累加器和30H单元中的内容是什么?

例:已知片外RAM1000H单元中有一个数7BH完成将高4位取反,低4位不变的程序ORG2000HMOVDPTR,#1000HMOVXA,@DPTR,XRLA,#F0HMOVX@DPTR,ASJMP$END011110111111000010001011例3-24(R0)=10H,(10H)=7AH,执行指令:MOVA,#3EHANLA,@R0执行过程为:00111110∧0111101000111010

已知M1单元中有一个9的ASCII码39H,试编程把它变为BCD码(即高4位为0,低4位不变)例方法(1)ANLM1,#0FH001110010000111100001001方法(2)MOVA,M1ANLA,#0FH

美国标准信息交换代码(AmericanStandardCodeforInformationInterchange)是由美国国家标准学会(AmericanNationalStandardInstitute,ANSI)制定的,ASCII码是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC646。在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,象a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

例3-26设(A)=AAH,P1=FFH,试通过编程把A的低4位送入P1口低4位,P1口高4位不变。ANLA,#0FH;取出A的低4位,高4位置0ANLP1,#0F0H;取出P1口的高4位,低4位置0ORLP1,A;字节装配例3-27编程使内部RAM中的30H单元内容的低2位清0,高2位置1,中间4位取反。

ANL30H,#0FCH;低2位清0ORL30H,#0C0H;高2位置1XRL30H,#3CH;中间4位取反

51系列单片机的移位指令只能对累加器A进行移位,移位示意图如下所示:移位

例3-28若(A)=01101100B,CY=1,(1)执行指令RRA,结果为(A)=00110110B,CY不变(2)执行指令RRCA,结果为A=10110110B,CY=0(3)执行指令RLA,结果为(A)=11011000B,(4)执行指令RLCA,结果为A)=11011001B,CY=0例3-29已知2DH单元有一正数,试编程求其负数的补码并传送到30H单元。MOVA,2DHCPLAINCAMOV30H,A

3.3.5控制转移指令控制转移类指令的功能是改变指令的执行顺序,转移到指令指示的新的地址执行程序。51系列单片机的控制转移指令有以下类型:无条件转移:无需判断,执行该指令就转移到目的地址。条件转移:需判断标志位是否满足条件,若满足条件,则转移到目的地址,否则顺序执行。

绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移。相对转移:转移的目的地址用相对于当前PC的偏移量来表示,通常为条件转移。长转移或长调用:目的地址在距当前PC的64KB范围内。短转移或短调用:目的地址在距当前PC的2KB范围内。一、控制转移指令17条1、无条件转移指令02HAdd15~add8Add7~add0LJMPadd16;PCadd16AJMPadd11SJMPrelJMP@A+DPTR(1)长转移指令LJMPadd16三字节双周期;PCadd11PCadd16(2)绝对转移指令AJMPadd112字节2周期A10A9A800001A7A6A5A4A3A2A1A0分两步:1、PC=PC+2PC的高5位为页面地址,a0~a10为页内地址操作码2、PC加2后,取高5位和操作码的11位组成新的PC值A7A6A5A4A3A2A1A0pc15pc14pc13pc12pc11A10A9A8

例:AJMPadd11Add11=10110100101B0010H10000101101001010010H0011HPC=PC+2=0012HPC的高五位是00000新的PC值是0000010110100101B=05A5H程序跳转到05A5H处执行(3)短转移指令SJMPrel1PC=PC+22、PC=PC+rel80Hrel目的地址=当前PC值+rel=转移指令首地址+转移指令字节数+relRel=目标地址-转移指令首地址-2Rel-128~127之间rel=目的地址-转移指令首地址-转移指令字节数0010H;01HA;AR0;0CF01HDPTR0018H80rel;转到STARTRel用START表示ORG0010HSTART:MOVA,#01HMOVR0,ALOOP:MOVDPTR,#0CF01HSJMPSTARTRel=0010H-0018H-2=-10Rel-128~127之间HERE:SJMPHEREHERE:SJMP$Rel=0FEH(4)变址寻址转移指令JMP@A+DPTRPC=A+DPTR

例3-31要求当(A)=0转处理程序K0当(A)=2转处理程序K1当(A)=4转处理程序K2汇编程序如下:MOVDPTR,#TABLE;表首地址送DPTR中JMP@A+DPTR;以A中内容为偏移量跳转TABLE:AJMPK0;(A)=0转K0执行AJMPK1;(A)=2转K1处执行AJMPK2;(A)=16转K8执行JMP@A+DPTR指令常用于键盘输入处理程序和命令解析程序中。2、条件转移指令8条分为累加器A的判零转移、比较条件转移、减1条件转移(1)累加器A的判零转移JZrel如果A=0,PCPC+2+rel如果A≠0,PCPC+2JNZrel如果A≠0,PCPC+2+rel如果A=0,PCPC+2例:已知外部RAM中1000H为始地址的数据块以零为结束标志,试编程将之传送到以30H为开始地址的内部RAM中0data3data2data11000HORG0010MOVDPTR,#1000HMOVR0,#30HLOOP:MOVXA,@DPTRJZDONEMOV@R0,AINCDPTRINCR0SJMPLOOPDONE:SJMP$END数据移动程序

(2)比较条件转移CJNEA,(#datadirect),rel如果A≠dataPCPC+3+rel如果A=dataPCPC+3形成CY标志位目的操作数-源操作数〉0CY=0目的操作数-源操作数<0CY=1CJNERn,#data,rel形成CY标志位CJNE@Ri,#data,rel形成CY标志位目的操作数-源操作数〉0CY=0目的操作数-源操作数<0CY=1如果Rn≠dataPCPC+3+rel如果Rn=dataPCPC+3如果(Ri)≠dataPCPC+3+rel如果(Ri)=dataPCPC+3(3)减1条件转移DJNZRn,relDJNZdirect,rel如果Rn-1≠0PCPC+2+rel如果Rn-1=0PCPC+2如果(direct)-1≠0PCPC+3+rel如果(direct)-1=0PCPC+3

例3-33软件延时

利用DJNZ指令可在一段程序中插入某些指令来实现软件延时。DJNZ指令执行时间为2个机器周期,这样循环一次可产生2个机器周期延时。设主频为12MHZ,循环次数为24次,下段程序在P1.7引脚上输出一个50us的脉冲。

CLRP1.7;P1.7输出变低电平MOVR7,#18H;赋循环初值HERE:DJNZR7,HERE;(R7)←(R7)-1,不为0;继续循环 SETBP1.7;P1.7输出高电平

延时计算例:已知内部RAM中30H为始地址的数据块存放连续十个无符号数,试编程求十个数的和并把和放到50H单元。

data3data2data130HORG0010MOVR2,#10MOVR1,#30HCLRALOOP:ADDA,@R1INCR1DJNZR2,LOOPMOV50H,AEND和3、子程序调用和返回指令把具有完整功能的程序定义为子程序主程序运行中可多次调用子程序,子程序还可以再调用子程序(子程序嵌套)调用子程序时,需要保护现场,把断点处地址保存起来,通过堆栈来完成,先压入PC的低八位,再压入PC的高八位,两条调用指令如下:LCALL长调用ACALL短调用一次调用子程序子程序的嵌套PCPC+3SPSP+1(SP)PC7~PC0SPSP+1(SP)PC15~PC8PCadd16ACALLadd11PCPC+2SPSP+1(SP)PC7~PC0SPSP+1(SP)PC15~PC8PC10~0add11LCALLAdd16与LJMP和AJMP类似,只是多了自动保存断点地址的功能ORG0010MOVSP,#70HLCALLA060H16H00H

70H71H72H0010H75H0011H81H0012H70H0013H12H0014HA0H0015H60H先压入断点地址的低八位,再压入断点地址的高八位(2)返回指令RET(RETI)PC15~8(SP)SPSP-1PC7~0(SP)SPSP-1RET子程序返回指令RETI中断返回指令,返回后清除中断优先标志。

例3-34设(SP)=53H,子程序首址在3000单元,并以标号STR表示。在(PC)=2000H处执行指令:LCALLSTR将使(SP)=55H,(54H)=03H,(55H)=20H,(PC)=3000H。例3-35设(SP)=55H,RAM中(54H)=03H,(55H)=20H,则执行RET后,PC=?SP=?(PC)8~15=20HSP=54H(SP)=53H,(PC)=2003H程序由2003H开始执行。(PC)0~7=03HSP=53H

例3-36用NOP指令产生方波。SQU1:CLRP2.7;P2.7清0输出NOP;空操作NOPSETBP2.7;置位P2.7高电平输出NOPNOP执行空操作指令NOP除PC加1外,不做任何操作,而转向下一条指令去执行。不影响任何寄存器和标志。

温馨提示

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

评论

0/150

提交评论