第4章MCS-51单片机指令系统4.1概述4.2数据传送类指令4.3算术运算类指令4.4逻辑运算类指令4.5控制转移类指令4.6位处理类指令2.1概述一、指令与指令系统指令系统:一种型号的计算机所有指令的集合就是它的指令系统[即软件(语言)系统]。各种型号的计算机都有自己的指令系统。指令:是主机能直接识别和接受并指挥计算机执行某种操作的命令。二、计算机指令的基本类型1.机器语言2.汇编语言3.高级语言1.机器语言a.特点:b.缺点:c.机器码表示的指令格式:是计算机自身固有的语言;用二进制代码表示,亦称为机器代码。能被主机直接识别、分析和执行;程序不易阅读,易出错;----------(读程序难)代码不便于记忆,编程繁、难;--(写程序难)操作码[操作数]2.汇编语言a.优点:b.缺点:指令意义直观、易记忆,编程方便;不需专门的软件平台,占用的存储空间少;1-3B执行速度快;不能被机器本身直接识别。程序通用性差,复杂程序编程工作量大;介于机器语言和高级语言之间,用助记符、符号地址和标号来表示指令和编写程序。直接和硬件接口,适时性强。机器语言汇编语言代真(汇编、翻译目标代码)手工代真、自动代真3.高级语言Basic、Fortran、Pascal、C、Delphi、java等b.缺点:写、读程序方便、简单;程序通用性强。机器本身无法识别。a.优点:需要专门的软件系统(平台),需占用较大的存储空间;三、MCS-51系列单片机的指令格式完整的指令格式如下:[标号:]操作码[操作数][,操作数][;注释]其中:[]项是可选项。注释:注释也是指令语句的可选项,它是为增加程序的可读性而设置的,是针对某指令而添加的说明性文字,不产生可执行的目标代码。操作数:参与操作的地址单元、寄存器单元或数据;可选项(可以是0-2个)“对谁操作”操作码:用助记符表示,是由对应的英文缩写构成的,作用是命令主机作何操作。它规定了指令具体的操作功能,描述指令的操作性质,是一条指令中不可缺少的内容。“做什么,应达到什么目的”标号:用符号表明本条指令的起始存储单元地址,也称为指令的符号地址。以便控制程序的转向。可选项。Note:标号与操作码之间用“:”隔开;标号以英文字母为首,不能超过6个字符;操作码与操作数之间用若干空格隔开;操作数之间用“,”隔开;注释前用“;”与指令主题隔开。四、指令的分类MCS-51指令系统有111条指令,可按下列几种方式分类:1.按指令字节数分类:单字节指令(49条)、双字节指令(45条)和三字节指令(17条)。2.按指令执行时间分类:单机器周期指令(64条)、双机器周期指令(45条)和四机器周期指令(2条)。3.按功能分类:数据传送类指令(29条)、算术运算类指令(24条)、逻辑操作类指令(24条)、控制转移类指令(17条)和位操作指令(17条)。五、指令格式的符号约定Rn:当前工作寄存器R0-R7中的某个寄存器;Ri:当前寄存器组中能间接寻址的两个寄存器R0,R1;#data:8位二进制数(立即数);#data16:16位二进制数;direct:片内RAM中的某个单元或某个SFR的地址;addr11:11位二进制码表示的地址,寻址范围0-2KB;addr16:16位二进制码表示的地址,寻址范围0-64KB;rel:用补码形式表示的8位二进制偏移量;bit:可直接位寻址的片内RAM或SFR中的某个位地址;C:最高进位标志位或为累加器;@:在间接寻址方式中,是间接寻址寄存器指针的前缀。$:表示当前的指令地址;/:在位操作指令中,表示对该位先求反后再参与操作。(X):表示X单元中的内容;((X)):表示以X单元中的内容为地址的相应单元中的数据;如((Ri))、((DPTR))←:表示将箭头右边的内容传送到左边;:表示将数据交换;∨、∧、⊕:分别表示逻辑或、与、异或。4.2数据传送类指令(共29条)数据传送就是将数据从一个单元传送到另一个单元的操作,是单片机最基本、最主要、量最大的操作。数据传送指令共29条,可分为内部RAM数据传送、外部RAM数据传送、程序存储器数据传送、数据交换和堆栈操作等五类。寻址范围:累加器A、片内RAM、SFR、片外RAM。功能:(目的地址)←(源地址),源地址单元的内容不变。对标志位的影响:除以累加器A为目的操作数的数据传送指令对P标志位有影响外,其余均不影响标志位。一、一般传送类指令(4+3+5+3=15条)MOVA,Rn;(A)←(Rn)MOVA,direct;(A)←(direct)MOVA,@Ri;(A)←((Ri))MOVA,#data;(A)←#dataMOVRn,A;(Rn)←(A)MOVRn,direct;(Rn)←(direct)MOVRn,#data;(Rn)←#dataMOVdirect,A;(direct)←(A)MOVdirect,Rn;(direct)←(Rn)MOVdirect,@Ri;(direct)←((Rn))MOVdirect,direct;(direct)←(direct)MOVdirect,#data;(direct)←#dataMOV@Ri,A;((Rn))←(A)MOV@Ri,direct;((Rn))←(direct)MOV@Ri,#data;((Rn))←#data例子:设内部RAM第30H单元内容为40H,第40H单元内容10H,P1作为输出口其输入的数据为0CAH(11001010B)经过程序执行后结果。MOVR0,#30HMOVA,@R0MOVR1,AMOVB,@R1MOV@R1,P1MOVP2,P1R0,R1,A,B40H单元,P2口?二、堆栈操作指令(2条)PUSHdirect;SP←SP+1,(SP)←(direct)POPdirect;(direct)←(SP),(SP)←(SP)-1例1:设(SP)=30H,(A)=01H,(B)=02H,执行如下指令后,SP、A和B中的内容分别是什么?PUSHACCPUSHBPOPACCPOPB三、累加器传送类指令(3+2+4+2=11条)①8位数据交换指令:XCHA,Rn;(A)(Rn)XCHA,@Ri;(A)((Ri))XCHA,direct;(A)(direct)②4位数据(半字节)交换指令:XCHDA,@Ri;(A)3~0((Ri))3~0SWAPA;(A)7~4(A)3~0例2:编程将内部RAM中30H单元的低4位和高4位进行交换,并保持A中的内容不变。XCHA,30HSWAPAXCHA,30HSWAP30H???③访问外部RAM的指令MOVXA,@DPTR;(A)←((DPTR))MOVXA,@Ri;(A)←((Ri))MOVX@DPTR,A;((DPTR))←(A)MOVX@Ri,A;((Ri))←(A)例3:若(R0)=12H,(0012H)=56H,则执行指令MOVXA,@R0后;累加器(A)=?例4:若(DPTR)=3020H,(A)=48H,则执行指令MOVX@DPTR,A后,外部RAM(3020H)=?再来一个例子例如:设外部RAM(0203H)=FFH,分析以下指令执行后的结果。MOVDPTR,#0203H;(DPTR)←0203H,900203MOVXA,@DPTR;(A)←((DPTR)),E0MOV30H,A;(30H)←(A),F530MOVA,#0FH;(A)←0FH,740FMOVX@DPTR,A;((DPTR))←(A),F0执行结果为:(DPTR)=0203H,(30H)=FFH,(0203H)=(A)=0FH。④读程序存储器的指令(查表指令):MOVCA,@A+DPTR;(A)←((A)+(DPTR))MOVCA,@A+PC;(PC)←(PC)+1,(A)←((A)+(PC))※两条指令的异同:其功能完全相同,但使用中存在着差异:采用DPTR作为基址寄存器,表可以放在64KB程序存储器空间的任何地址,使用方便,故称为远程查表。一般作为首选查表指令。采用PC作为基址寄存器,具体的表在程序存储器中只能在查表指令后的256B的地址空间中,使用有限制,故称为近程查表。四、16位数据传送指令(1条)MOVDPTR,#data16;(DPTR)←#data16即:(DPH)←#data8~15;(DPL)←#data0~7。例5:编程将内部RAM中30H单元的数据传送到外部RAM的2000H单元。MOVA,30HMOVDPTR,#2000HMOVX@DPTR,A例:利用查表的方法编写Y=X2(X=0,1,2,…,9)的查表程序。设变量X的值存放在内存30H单元中,求得的Y的值存放在内存31H单元中;平方表存放在首地址为TABLE的程序存储器中。编程如下:MOVA,30HMOVDPTR,#TABLEMOVCA,@A+DPTRMOV31H,ATABLE:00H,01H,04H,09H,10H,19H,24H,31H,40H,51H若(30H)=#03H,则执行完上述程序后:(31H)=?4.3算术运算类指令(共24条)算术运算指令的两个参与运算的操作数,累加器A为第一操作数,也是目的操作数;第二操作数可以是#data(立即数)、寄存器R0~R7、@Ri(片内RAM)或直接地址单元。算术运算指令可分为加法指令、带进位的加法指令、带借位的减法指令、十进制调整指令、加1指令、减1指令、乘除指令。算术指令都是针对8位无符号数的,如要进行带符号或多字节二进制数运算,需编写程序,通过执行程序来实现。(实验1.多字节算术运算程序实验)一、加法指令ADDA,#data;(A)←(A)+#dataADDA,direct;(A)←(A)+(direct)ADDA,@Ri;(A)←(A)+((Ri))ADDA,Rn;(A)←(A)+(Rn)ADDCA,#data;(A)←(A)+#data+(C)ADDCA,direct;(A)←(A)+(direct)+(C)ADDCA,@Ri;(A)←(A)+((Ri))+(C)ADDCA,Rn;(A)←(A)+(Rn)+(C)INCA;(A)←(A)+1INCdirect;(direct)←(direct)+1INC@Ri;((Ri))←((Ri))+1INCRn;(Rn)←(Rn)+1INCDPTR;(DPTR)←(DPTR)+1进位(借位)标志CY为无符号整数的多字节加法、减法、移位等操作提供了方便;溢出标志OV可方便的控制补码运算;辅助进位标志AC用于BCD码运算。算术运算操作将影响PSW中的OV、CY、AC和P等。例若(A)=84H,(30H)=8DH,执行指令ADDA,30H之后,由于:即:(A)=11H,(CY)=1,(AC)=1,(OV)=1(D7有进位,D6无进位),(P)=0。带进位加法指令RnAARnCYdirectAAdirectCYADDCA@RiAARiCY#dataAAdataCY;()()();()()(),;()(())();()()指令的功能是把源操作数与累加器A的内容相加再与进位标志CY的值相加,结果送入目的操作数A中。加的进位标志CY的值是在该指令执行之前已经存在的进位标志的值,而不是执行该指令过程中产生的进位。增11DPTRDPTRDPTR1RiRi@Ri1directdirectdirect1RnRnRn1AAAINC)(;))(();()(;)(;)(;指令的功能是把源操作数的内容加1,结果再送回原单元。这些指令仅INCA影响P标志。其余指令都不影响标志位的状态。DAA二-十进制调整指令若(A)0~39或(AC)=1,则(A)0~3=(A)0~3+06H;若(A)4~79或(C)=1,则(A)4~7=(A)4~7+06