




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
15.05.2020,-,1,第四章80C51的指令系统,15.05.2020,-,2,4.1指令系统简介,7种寻址方式111条指令,15.05.2020,-,3,常用符号,Rn:工作寄存器中的寄存器R0、R1R7之一,Ri:工作寄存器中的寄存器R0或R1,#data:8位立即数,#data16:16位立即数,direct:片内RAM或SFR的地址(8位),:间接寻址寄存器,Bit:片内RAM或SFR的位地址,addr11:11位目的地址,addr16:16位目的地址,15.05.2020,-,4,rel:补码形式的8位地址偏移量。偏移范围为-128127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容:箭头左边的内容送入箭头右边的单元内,15.05.2020,-,5,4.2寻址方式,1立即寻址ImmediateAddressing,操作数就包含在指令代码中,在操作码之后,称为立即数,用“”表示。如:MOVP1,#80HMOVR7,#0F5HMOVDPTR,#1245H,操作数存在程序存储器中,15.05.2020,-,6,2直接寻址DirectAddressing直接使用操作数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如:MOVA,00HMOVC,60HMOVA,0F0H,15.05.2020,-,7,3寄存器寻址RegisterAddressing,对选定的工作寄存器R0R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。例:MOVA,R0功能:将R0中数据送累加器A中。,问题:工作寄存器就是内存单元的一部分,如果选择工作寄存器组0,实际R0就是RAM的00H单元,那么“MOVA,00H”和“MOVA,R0”不就没什么区别了吗?,的确,这两条指令都是将00H单元中的内容送A,但执行的过程不同,执行第一条指令需2个机器周期,而第二条则只需1个机器周期,第一条指令变成最终目标码要两个字节(E5H00H),而第二条则只一个字节(E8H)就可以。,15.05.2020,-,8,4.2.4寄存器间接寻址RegisterIndirectAddressing,把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。R0,R1-8位地址,片内低128字节或片外DPTR-16位,片外64KBMCS-51如:MOVA,R0MOVXA,R0MOVXA,DPTR,操作数在片内RAM中,操作数在片外RAM中,操作数在片外RAM中,15.05.2020,-,9,以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MCS-51MOVCA,A+DPTR;(A+DPTR)AMOVCA,A+PC;PC+1PC,(A+PC)A,4.2.5变址寻址(基址+变址),Base-Register-plus-Index-Register-IndirectAddressing,操作数在程序存储器中,15.05.2020,-,10,E0,A,如:MOVCA,A+DPTR设DPTR=2000H,A=E0H,20E0H,47,指令代码,15.05.2020,-,11,4.2.6相对寻址,将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数.常用于跳转指令。如:JC23H若C=0,不跳转;C=1,跳转.,RelativeAddressing,改变PC,15.05.2020,-,12,如:JC23,1025H,23H,1002H,指令代码,当前PC,15.05.2020,-,13,对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1CLRC;Cy位清0,4.2.7位寻址BitAddressing,操作数在片内RAM位地址区或SFR某些位中,15.05.2020,-,14,小结:寻址方式涉及的存储器空间,15.05.2020,-,15,4.3.1数据传送类指令(29条)DataTransferInstruction,MCS-51助记符:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址注意:除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,15.05.2020,-,16,4.3.1数据传送类指令,1、累加器A为目的操作数的指令MOVA,data;dataAMOVA,direct;(direct)AMOVA,Rn;RnAMOVA,Ri;(Ri)A,内部RAM数据传送指令,15.05.2020,-,17,内部RAM数据传送指令,2、以寄存器Rn为目的操作数的指令MOVRn,#data;dataRnMOVRn,direct;(direct)RnMOVRn,A;ARn,例1A5BH,R110HR220H,R330H,(30H)4FH执行指令:MOVR1,A;AR1MOVR2,30H;(30H)R2MOVR3,#83H;83HR3执行后:R15BH,R24FH,R383H。,15.05.2020,-,18,3、十六位数的传递指令(1条),MOVDPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35HMOVDPL,#12H。则就相当于执行了MOVDPTR,#3512H。,15.05.2020,-,19,累加器A与片外RAM之间的数据传递类指令(4条),MOVXA,RiMOVXRi,AMOVXA,DPTRMOVXDPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。,15.05.2020,-,20,2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOVDPTR,#0100HMOVXA,DPTRMOVDPTR,#0200HMOVXDPTR,A,15.05.2020,-,21,读程序存储器指令(2条),MOVCA,A+DPTRMOVCA,A+PC例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)MOVDPTR,#100HMOVA,R0MOVCA,A+DPTR.ORG0100HDB0,1,4,9,16,25,如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。,本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。,15.05.2020,-,22,堆栈操作(2条),PUSHdirect;SPSP+1,(SP)(direct)POPdirect;(direct)(SP),SPSP-1第一条为压入指令,就是将direct中的内容送入堆栈中;第二条为弹出指令,就是将堆栈中的内容送回到direct中。例:MOVSP,#5FHMOVA,#100MOVB,#20PUSHACCPUSHB,则执行第一条PUSHACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSHB时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。,15.05.2020,-,23,1.给出每条指令执行后的结果,MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,R0MOV34H,R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,R0,;(23H)=30H;(12H)=34H;R0=23H,;R7=34H;R1=12H;A=30H,;(34H)=34H;(45H)=34H;DPTR=6712H,;(12H)=67H;R0=12H;A=67H,内部RAM,15.05.2020,-,24,4.3.2算术运算类指令(24条)ArithmeticOperations,主要对8位无符号数;也可用于带符号数运算。包括:加、减、乘、除、加1、减1运算指令。影响PSW有关位。,15.05.2020,-,25,加法指令,ADDA,#data;AdataAADDA,direct;A(direct)AADDA,Rn;ARnAADDA,Ri;A(Ri)A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。,1.不带进位位的加法指令(4条),15.05.2020,-,26,2.带进位位的加法指令(4条),ADDCA,Rn;ARnCYAADDCA,direct;A(direct)CYAADDCA,Ri;A(Ri)CYAADDCA,#data;AdataCYA用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到065535。,15.05.2020,-,27,例:,先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H+30H+CY,结果是41H,所以最终的结果是4107H。,1067H+30A0H,0001000001100111,0011000010100000,0100000100000111,1067H,30A0H,4107H,15.05.2020,-,28,设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。,MOVA,R0ADDA,R2;R0+R2A和CYMOVR4,AMOVA,R1ADDCA,R3;R1+R3+CYA和CYMOVR5,A,15.05.2020,-,29,又例:,先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0。然后再做10H+30H+CY,结果是40H,所以最终的结果是4087H。,1067H+3020H,15.05.2020,-,30,DAA在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。例:A=00010101BCD(代表十进制数15)ADDA,#8,3.十进制调整指令(1条),;A=1DH,按二进制规律加,;A=23H,按十进制规律加,DAA,15.05.2020,-,31,调整要完成的任务是:,(1)当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。,(2)当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。十进制调整指令执行后,PSW中的CY表示结果的百位值。,15.05.2020,-,32,例若(A)01010110B,表示的BCD码为56,(R3)01100111B,表示的BCD码为67,(CY)0。执行以下指令:ADDA,R2DAA由于(A)00100011B,即,且(CY)1,即,结果为BCD数123。应该注意,DA指令不能对减法进行十进制调整。,15.05.2020,-,33,减法指令,SUBBA,Rn;ARnCYASUBBA,direct;A(direct)CYASUBBA,Ri;A(Ri)CYASUBBA,#data;AdataCYA将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。如:SUBBA,R2设:A=C9H,R2=55H,CY=1,执行指令之后,A中的值为73H。,1.带借位的减法指令(4条),说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。对带符号数,要注意OV标志。OV=1,出错。,15.05.2020,-,34,4.3.3逻辑运算类指令(24条),主要用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。主要操作:与、或、异或、移位、取反、清零等。对标志位的影响:除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。,LogicOperations,15.05.2020,-,35,逻辑或指令(6条),ORLA,Rn;ARnAORLA,direct;A(direct)AORLA,Ri;A(Ri)AORLA,#data;AdataAORLdirect,A;(direct)A(direct)ORLdirect,#data;(direct)data(direct),例:71H和56H相或:01110001(71H)01010110(56H),01110111即77H,后两条指令,若直接地址为I/O端口,则为“读改写”操作。,ORLogicInstruction,15.05.2020,-,36,逻辑与指令(6条),ANLA,Rn;ARnAANLA,direct;A(direct)AANLA,Ri;A(Ri)AANLA,#data;AdataAANLdirect,A;(direct)A(direct)ANLdirect,#data;(direct)data(direct),后两条指令若直接地址为I/O端口,则为“读改写”操作。,ANDLogicInstruction,15.05.2020,-,37,逻辑异或指令(6条),XRLA,Rn;ARnAXRLA,direct;A(direct)AXRLA,Ri;A(Ri)AXRLA,#data;AdataAXRLdirect,A;(direct)A(direct)XRLdirect,#data;(direct)data(direct),后两条指令,若直接地址为I/O端口,则为“读改写”操作。,eXclusive-oRLogicInstruction,15.05.2020,-,38,清0与取反指令(2条),取反:CPLA;/AA例:若A=5CH,执行CPLA结果:A=A3H,清0:CLRA;0A,ClearAndComPlementLogicOperation,15.05.2020,-,39,循环移位指令(4条),RLARRARLCARRCA,后两条指令,影响P标志和CY。,RotateLogicinstruction,15.05.2020,-,40,例:,若A=5CH,CY=1,执行RLCA后,,对RLC、RRC指令,在CY=0时RLC相当于乘以2RRC相当于除以2,结果:A=B9H,CY=0,P=1,15.05.2020,-,41,4.3.4控制转移类指令(17条)BranchingInstruction,共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令,15.05.2020,-,42,无条件转移类指令(4条),短转移类指令:AJMPaddr11长转移类指令:LJMPaddr16相对转移指令:SJMPrel间接转移指令:JMPA+DPTR,(1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。那么他们的区别何在呢?,15.05.2020,-,43,跳转的范围不同。,短转移类指令:AJMPaddr11长转移类指令:LJMPaddr16相对转移指令:SJMPrel,转移范围:2KB64KB-128+127,指令构成不同。AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。,指令长度不同原则上,所有用SJMP或AJMP的地方都可以用LJMP来替代。,15.05.2020,-,44,间接转移指令:JMPA+DPTR,这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。,(2)第四条指令与前三条指令相比有所不同,15.05.2020,-,45,条件转移指令(8条),条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。,一、判A内容是否为0转移指令(2条),JZrel;如果A=0,则转移,否则顺序执行。JNZrel;如果A0,就转移。转移到相对于当前PC值的8位移量的地址去。即:新的PC值=当前PC+偏移量rel我们在编写汇编语言源程序时,可以直接写成:JZ标号;即转移到标号处。,15.05.2020,-,46,MOVA,R0JZL1MOVR1,#00HAJMPL2L1:MOVR1,#0FFHL2:SJMPL2END在执行上面这段程序前:如果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么?,如果R0=0,结果R1=00H。如果R00,结果是R1中的值为0FFH。,15.05.2020,-,47,二、比较不等转移指令(4条),CJNEA,#data,relCJNEA,direct,relCJNERn,#data,relCJNERi,#data,rel此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样地,使用时,我们可以将rel理解成标号,即:CJNEA,#data,标号CJNEA,direct,标号CJNERn,#data,标号CJNERi,#data,标号,15.05.2020,-,48,利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。,15.05.2020,-,49,举例:,MOVA,R0CJNEA,#10H,L1MOVR1,#0;如R0=10H,则不转移R1=00H;AJMPL3L1:JCL2;如CY=1即R010H,则转移AJMPL3L2:MOVR1,#0FFHL3:SJMPL3因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R010H,则R1=0AAH;如果R010H,则R1=0FFH。,15.05.2020,-,50,三、减1不为0转移指令(2条),DJNZRn,relDJNZdirect,relDJNZ指令的执行过程是这样的:它将第一个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。例:DJNZ10H,LOOP.LOOP:.,15.05.2020,-,51,例:MOV23H,#0AHCLRALOOP:ADDA,23HDJNZ23H,LOOPSJMP$上述程序段的执行过程是:将23H单元中的数连续相加,存至A中,每加一次,23H单元中的数值减1,直至减到0,共加(23H)次。,15.05.2020,-,52,调用与返回指令(4条),一、调用指令(2条),LCALLaddr16;长调用指令(3字节)ACALLaddr11;短调用指令(2字节)上面两条指令都是在主程序中调用子程序,两者的区别:对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。使用时可以用:LCALL标号;标号表示子程序首地址ACALL标号来调用子程序。指令的执行过程是:当前PC压栈,子程序首地址送PC,实现转移。,15.05.2020,-,53,二、返回指令(2条),子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。RET;子程序返回指令RETI;中断子程序返回指令两者不能互换使用。RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。,15.05.2020,-,54,空操作指令(1条),NOP;空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。,15.05.2020,-,55,4.3.5位操作指令(17条),BooleanOperations,MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。,15.05.2020,-,56,在MCS-51中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美团外卖商家订单分成合同
- 直播活动内容补充与品牌合作协议
- 软性材料研发与市场推广合伙协议
- 网络文学有声书制作与环保公益活动合作协议
- 影视作品版权购买与版权收益分成合同
- 顶级域名所有权及商业价值转让服务合同
- 影视特效动作捕捉系统全面解决方案租赁协议
- 生物样本冷链物流与生命科学研究支持合同
- 小产权房配套设施共享及社区公共设施保养维护合同
- 电商侵权案件管辖权争议补充协议
- TBSRS 038-2020 核电厂液态流出物中锶-90的分析方法
- YY/T 1809-2021医用增材制造粉末床熔融成形工艺金属粉末清洗及清洗效果验证方法
- 部编版二年级下册语文课件语文园地七-小动物
- 融合终端微应用开发设计规范-版本
- 妇科门诊护理质量控制管理考核标准
- 秋收起义-完整版课件
- 朝阳区编制外岗位应聘人员报名表
- 自动喷水灭火系统质量验收项目缺陷判定记录
- 人教版一年级起点小学二年级英语下册全套教案
- T-CCIAT 0043-2022 建筑工程渗漏治理技术规程
- 供货、安装、调试、验收方案
评论
0/150
提交评论