第3章 mcs-51指令系统及汇编语言程序设计GGGAA

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章MCS-51指令系统及汇编语言程序设计对于任何一台计算机,必须有软件(程序)的支持,才能工作。计算机所进行的全部操作都是执行程序的结果,而程序是计算机所能识别的命令的集合。指令系统是一种CPU所能直接执行的所有命令的集合,CPU的主要功能是由它的指令系统来体现的。任何计算机语言编写的任何程序,都必须转换为指令系统中相应指令代码的有序集合,CPU才能执行。3.1指令系统简介MCS-51指令系统的功能十分强大,它把体现单片机的各种功能的寄存器组织在统一的地址空间中,MCS-51指令系统在其存储空间、时间的利用率及工作效率方面都是较高的。每一种CPU都有其独立的指令系统。MCS-51系列单片机指令系统共有111条指令,其中有49条单字节指令,45条双字节指令和17条三字节指令。MCS-51的指令系统中有64条指令的执行时间为一个机器周期(12个振荡周期),45条指令的执行时间为两个机器周期。1.指令格式MCS-51指令系统中的每一条指令都有两级指令格式:•CPU可直接识别并执行的机器语言指令;•汇编语言指令(简称汇编指令)。指令:计算机能够直接识别和执行的操作命令。指令系统:一个CPU所能识别和执行的指令的集合为指令系统。指令格式:[标号:]操作码[目的操作数][,源操作数][;注释]操作码:规定该指令完成何种操作。操作数:规定操作的对象。注意事项:各个操作数之间用“,”分隔,操作数可以是具体的操作数据,也可以是操作数据所在存储单元的地址。2.指令分类及符号说明1)指令分类MCS-51指令系统共有111条指令,分为5大类:•数据传送指:片内RAM、片外RAM、程序存储器的传送指令,交换及堆栈指令。•算术运算类:简加法、带进位加、减、乘、除、加1、减1指令。•逻辑运算类:逻辑与、或、异或、测试及移位指令。•控制程序转移类:无条件转移与调用、条件转移、空操作指令。•布尔变量操作类:分为位数据传送、位与、位或、位转移指令。2)符号说明#data:8位立即数,“#”表示后面的数据是立即数;#data16:16位立即数;direct:片内RAM或SFR的地址(8位);Rn:n=0~7,工作寄存器中的寄存器R0…R7中之一;Ri:i=0或1,表示工作寄存器中的寄存器R0或R1;Addr11:11位目的地址;Addr16:16位目的地址;DPTR:数据指针,可用作16位的地址寄存器;@:间接寄存器或基址寄存器的前缀,如@Ri、@A+DPTR;bit:片内RAM或SFR的直接寻址位;/:位操作数的前缀,表示对该位操作数取反。如/bit;$:当前指令的首地址。对于本书中指令注释部分的表示形式,作以下说明:若X为任意一个寄存器,(X)作为源操作数则表示寄存器的内容,X作为目的操作数则表示该寄存器。例如:A(A)+1表示A的内容加1的和送给A,A(Rn)表示Rn的内容送给A。若X为任意一个寄存器,((X))作为源操作数表示X所指向的存储单元的内容,(X)作为目的操作数表示X所指的存储单元。例如:(Ri)((Ri))+1则表示Ri所指向存储单元的内容加1后再送到该单元中去。对于直接地址direct,则(direct)作为源操作数表示该地址单元的内容,作为目的操作数表示该地址单元。例如:(direct)(direct)+1表示direct单元的内容加1的和送给direct单元。例如(20H)(20H)+1。3.2寻址方式1立即寻址:指令格式:在指令中用“#data”表示操作数。指令特点:操作数直接出现在指令中。实际操作数:指令中在“#data”中出现的数据就是操作数,称为立即数。操作数位置:在指令中直接出现(只能做源操作数)。注意事项:立即数前必须有“#”。举例:MOVA,#52H;A52HMOVDPTR,#5678;DPTR5678H图3.1立即寻址示意图2直接寻址:指令格式:在指令中用片内RAM地址值或SFR名称来表示操作数。指令特点:指令中直接给出的是操作数的地址。实际操作数:所指定的片内RAM或SFR单元中的内容。寻址范围:片内128字节RAM和所有的SFR(除R0~R7和B之外)。操作数位置:在RAM单元或SFR中(源或目的)。注意事项:指令中出现的数据是RAM地址。举例:MOVA,52H;把片内RAM字节地址52H单元的内容送累加器A中。图3.2直接寻址示意图3寄存器寻址:指令格式:在指令中直接使用寄存器名来表示操作数。指令特点:要访问的操作数在给出的寄存器中。实际操作数:寄存器中的内容。寻址范围:R0~R7、B。操作数位置:在寄存器中(源或目的操作数)。举例:设累加器A的内容为4AH,则执行MOVR1,A指令后,内部RAM11H单元的值就变为4AH。图3.3寄存器寻址示意图4寄存器间接寻址:指令格式:在指令中用“@R0、@R1或@DPTR”来表示操作数。指令特点:通过寄存器去间接地找操作数所在的存储单元。实际操作数:地址为寄存器值的单元中的内容。寻址范围:@R0或@R1:片内128字节RAM。@DPTR:片外64KB的数据存储空间和I/O端口。操作数位置:在以寄存器中的内容为地址的存储单元中(源或目的)。举例:MOVA,@R0MOVXA,@DPTR图3.3寄存器间接寻址示意图5变址寻址:指令格式:在指令中用“@A+DPTR或@A+PC”来表示操作数。指令特点:间接访问程序存储器中的常数表。被访问单元的地址为“寄存器的内容+A的内容”,即“基址+偏移量(变址)”的形式。实际操作数:地址为“寄存器+A”的ROM单元中的常数。寻址范围:整个程序存储空间。操作数位置:在以“寄存器+A”的值为地址的ROM单元中(只能做源操作数)。举例:MOVCA,@A+DPTRMOVCA,@A+PC例:MOVA,#22HMOVDPTR,#63A0HMOVCA,@A+DPTR图3.4变址寻址示意图03H00HDPTRALUX0000H0302HX例:MOVA,#02HMOVDPTR,#0300HMOVCA,@A+DPTRA02H程序存储器6相对寻址:指令格式:都是相对转移指令,在指令中用数值或语句标号指明目标位置。指令特点:都是转移指令,转移的目标地址由“PC+n+rel”形成。指令描述:相对转移指令使程序从当前位置跳过由指令中的偏移量规定的地址空间,转到程序的目标地址开始执行。偏移量的提供方法:直接提供偏移量数值;给出目标地址语句的标号。寻址范围:rel是补码形式的8位二进制数,寻址范围PC+n-128~PC+n+127。举例:设指令SJMP54H的机器码80H54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数54H相加,形成目标地址2056H,再送回PC,使得程序跳转到2056H单元继续执行。7位寻址:指令格式:用于位操作指令和位控制转移指令。指令特点:指令中的操作数不是一个字节而是一位二进制数。寻址范围:全部位寻址区。片内RAM的20H~2FH+某些SFR的各位。位地址的提供方法:直接提供位地址数值;XXH.X;SFR.X。举例:设内部RAM27H单元的内容是00H,执行SETB3DH后,由于3DH对应内部RAM27H的第6位,因此该位变为1,也就是27H单元的内容变为20H。3.3指令系统1.数据传送类指令(29条)MCS-51助记符:MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。1)以累加器A为目的操作数的指令(4条):MOVA,Rn;Rn→AMOVA,@Ri;(Ri)→AMOVA,direct;(direct)→AMOVA,#data;data→A该组指令的功能是把源操作数传送给累加器A。2)以工作寄存器Rn为目的操作数的指令(3条):MOVRn,AMOVRn,directMOVRn,#data这组指令功能是把源操作数指定的内容送入当前工作寄存器,源操作数不变。3)以直接地址为目的操作数的指令(5条):MOVdirect,AMOVdirect,RnMOVdirect1,direct2MOVdirect,@RiMOVdirect,#data这组指令功能是把源操作数指定的内容送入由直接地址指出的片内存储单元。例:MOV30H,AMOV20H,R7MOV27H,#0FHMOV50H,40H4)以间接地址为目的操作数的指令(3条):MOV@Ri,A;A→(Ri)MOV@Ri,direct;(direct)→(Ri)MOV@Ri,#data;data→(Ri)功能:把源操作数指定的内容送入以R0或R1为地址指针的片内存储单元中。例:MOV@R1,AMOV@R1,20HMOV@R1,#34H5)16的数据传送指令(1条):MOVDPTR,#data16MCS-51是一种8位机,这是唯一的一条16位立即数传递指令。该指令的功能:把16位的立即数送至数据指针寄存器DPTR。其中高8位送入DPH,低8位送入DPL。例:MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令:MOVDPH,#35HMOVDPL,#12H则就相当于执行了MOVDPTR,#3512H。6)片外数据存储器传送指令(4条):MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中MOVDPTR,#0100HMOVXA,@DPTRMOVDPTR,#0200HMOVX@DPTR,A7)读程序存储器指令(2条)MOVCA,@A+DPTRMOVCA,@A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)MOVDPTR,#100HMOVA,R0MOVCA,@A+DPTR.…ORG0100HDB0,1,4,9,16,25如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。8)交换指令(5条)XCHA,Rn;A←→RnXCHA,direc;A←→(direct)XCHA,@Ri;A←→(Ri)XCHDA,@Ri;A.3~A.0←→(Ri).3~(Ri).0SWAPA;A.3~A.0←→A.7~A.4例:已知A中的内容为34H,R0中的内容为56H。MOVR6,#29HXCHA,R6SWAPAXCHA,R6XCHDA,@R0;R6=29H;A=29H,R6=34H;A=92H;A=34H,R6=92H;A=36H,(R0)=54H9)堆栈操作(2条)PUSHdirect;SP(SP)+1,(SP)(direct)POPdirect;(direct)(SP),SP(SP)-1第一条为压

1 / 87
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功