第2章89C51指令系统2.1汇编语言2.2MCS-51单片机的指令系统2.3汇编程序的设计标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由1~8个字符组成,第一个字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。操作码指明执行什么性质和类型的操作,如数据传送操作,加法操作等。[标号:]操作码助记符[第一操作数][,第二操作数][;注释]2.1汇编语言2.1.1指令的格式操作数指明操作的数本身或者是操作数所在的地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如NOP指令;只有一个操作数,如INCA指令;有两个操作数,如MOVA,#20H指令,操作数之间以逗号相隔;有三个操作数,如CJNEA,#00H,NEXT指令,操作数之间也以逗号相隔。注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。2.1.2指令中的常用符号Rn:表示当前工作寄存器R0~R7中的一个。@Ri:表示寄存器间接寻址,常常作间接寻址的地址指针。其中Ri代表R0和R1寄存器中的一个。Direct:表示内部数据存贮器单元的地址及特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址,也可直接使用它的名字。#date:表示8位立即数,即8位常数,取值范围为#00H~#0FFH#date16:表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFHaddr16:表示16位地址addr11:表示11位地址rel:用补码形式表示的地址偏移量,取值范围为-128~+127。Bit:表示内部RAM和SFR中的具有位寻址功能的位地址。SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。如:表示PSW中奇偶校验位,可写成D0H,也可写成PSW.0的形式出现在指令中。@:表示间接寻址寄存器或基址寄存器的前缀符号。$:表示当前指令的地址。/:位操作数的前缀,表示对该位操作数取反,如/bit。×:片内RAM的直接地址或寄存器。(×):由×寻址的单元中的内容。寻址就是寻找指令中操作数或操作数所在的地址。所谓寻址方式,就是如何找到存放操作数的地址,把操作数提取出来的方法。2.1.3指令系统的寻址方式1、立即寻址立即寻址是指操作数在指令中直接给出,作为指令的一部分存放在代码段里。例如2.1:MOVA,#30H;A←30HMOVDPTR,#1234H;DPTR←234H2、直接寻址直接寻址是将操作数的地址直接存放在指令中。例2.2:MOVPSW,#20H;例2.3:MOVA,30H;A←(30H)3、寄存器寻址将操作数存放于通用寄存器中,以寄存器的内容为操作数的寻址方式。通用寄存器指A、B、DPTR以及R0~R7。例2.4:CLRAINCDPTRADDR5,#20H4、寄存器间接寻址寄存器间接寻址是以寄存器中内容为地址,以该地址中内容为操作数的寻址方式,即操作数是通过寄存器间接得到的。用来存放操作数地址的寄存器称为指针。指针只能用R0、R1和DPTR寻址范围:内部数据存储器、外部数据存储器注意:为了与寄存器寻址区别开,寄存器间接寻址方式要在寄存器前加@;间接寻址不能对SFR寻址。例2.5:设(R0)=25H,内部RAM(25H)=37H,MOVA,@R0指令的执行结果是:(A)=37H。其指令操作过程示意图如图所示。RAM地址R025H37H25HA37H图2.1寄存器间接寻址示意图5、变址寻址将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。例2.6:设(A)=02H,(DPTR)=2000H,外部ROM中,(2002H)=55H执行指令MOVCA,@A+DPTR结果是(A)=55H程序器2000HDPTR02HA2002H55H02H2000H55H图2.2变址寻址示意图6、相对寻址以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式,新的PC值作为跳转指令的转移地址(也称目的地址)。1000H操作码1002HPC+2ROM38HA1001H1002H操作数103AH图2-3相对寻址示意图例2.7:1000H:SJMP38H7、位寻址位寻址,是指对片内RAM中20H~2FH中的128个位地址,以及SFR中的11个可进行位寻址的寄存器中的位地址寻址。例2.8:①MOVC,20H,②MOVA,20H①指令是位寻址指令,它是将位寻址区中位地址为20H中的内容,送给位累加器C,传送的是一位二进制数。②指令是字节地址寻址指令,此指令是将内部RAM中20H单元中的内容送给累加器A,传送的是8位二进制数。2.2MCS-51单片机的指令系统51系列单片机指令系统由111条指令组成。MCS-51指令系统可分为五大类:•数据传送指令(28条);•算术运算指令(24条);•逻辑运算及移位指令(25条);•控制转移指令(17条);•位操作指令或布尔操作(17条)2.2.1数据传送指令数据传送操作是把数据从源地址传送到目的地址,指令执行后源地址内容不变,目的操作数被源操作数所代替。累加器A寄存器Rn寄存器DPTR直接地址direct间接地址@Ri立即数#data图2-4MCS-51单片机片内数据传送图1.内部数据传送指令(1).以累加器A为目的操作数的指令汇编指令格式操作字节周期MOVA,Rn;(Rn)→A11MOVA,direct;(direct)→A21MOVA,@Ri;((Ri))→A11MOVA,#data;#data→A21(2).以寄存器Rn为目的操作数的指令(3条)汇编指令格式操作字节周期MOVRn,A;(A)→Rn11MOVRn,direct;(direct)→Rn22MOVRn,#data;#data→Rn21这组指令的功能是把源操作数所指定的内容送到当前工作寄存器组R0~R7中的某个寄存器。源操作数有寄存器寻址、直接寻址和立即数寻址三种方式。注意:89C51指令系统中没有“MOVRn,Rn”传送指令。问题:是否可以进行寄存器之间的直接寻址传送?如欲进行MOVR1,R2,可否用指令MOVR1,02H?(3).以直接地址为目的操作数的指令(5条)汇编指令格式操作字节周期MOVdirect,A;(A)→direct21MOVdirect,Rn;(Rn)→direct22MOVdirect,direct;(源direct)→32(目的direct)MOVdirect,@Ri;((Ri))→direct22MOVdirect,#data;#data→direct32(4).以间接地址为目的操作数的指令(3条)汇编指令格式操作字节周期MOV@Ri,A;(A)→(Ri)11MOV@Ri,direct;(direct)→(Ri)22MOV@Ri,#data;#data→(Ri)21(Ri)表示Ri中的内容为指定的RAM单元。(5).以DPTR为目的操作数(1条)汇编指令格式操作字节周期MOVDPTR,#DATA16;dataH→DPH,32dataL→DPL这是唯一的16位立即数传送指令,其功能是把16位常数送入DPTR。DPTR由DPH和DPL组成。如执行MOVDPTR,#1234H指令,结果为(DPTR)=1234H。2、外部RAM及I/O端口与累加器A之间的数据传送CPU访问片外PAM只能采用寄存器间接寻址的方式,并且只能通过累加器编指令格式操作字节周期MOVXA,@Ri;((Ri))→A,且使/RD=012MOVXA,@DPTR;((DPTR))→A,使/RD=012MOVX@Ri,A;(A)→(Ri),使/WR=012MOVX@DPTR,A;(A)→(DPTR),使/WR=012在MCS-51系统中,由于扩展I/O端口与外部RAM统一编址,即扩展I/O端口地址占用外部RAM地址空间的某一单元,因此外部RAM及扩展I/O端口的读写操作指令、操作时序完全相同。只能通过累加器A存取外部RAM和扩展I/O端口。①使用@DPTR寻址的指令,访问64K范围。②使用@Ri寻址的指令,访问256B范围。例2.13:已知片外RAM(2000H)=33H,读外部RAM的2000H单元的程序段:MOVXDPTR,#2000HMOVXA,@DPTR指令执行后,(A)=33H例2.14:将累加器A的内容送到外部2000H单元的程序段:MOVP2,#20HMOVR0,00HMOVX@R0,A3、累加器A与程序存储器ROM之间的数据传送指令(查表指令)MOVCA,@A+PCMOVCA,@A+DPTR例2.15:ORG8000HMOVA,#30HMOVCA,@A+PC…ORG8030HDB‘ABCDEFGHIJ’上述查表指令执行后,将8003H+30H=8033H地址所对应的程序存储器中的内容44H(字符‘D’的ASCII码)送到累加器A中。4、数据交换(1)字节交换指令XCHA,RnXCHA,directXCHA,@Ri(2)半字节交换指令XCHDA,@RiA半字节RAM半字节半字节交换操作A一字节源操作数一字节五、堆栈操作堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。设置堆栈操作的目的是为了保护断点和现场,以便在子程序或中断服务子程序运行结束后,能正确返回主程序。数据的进栈、出栈由指针SP统一管理。堆栈的操作有如下两条专用指令:PUSHdirect;SP←(SP+1),((SP))←(direct)POPdirect;direct←((SP)),SP←SP-1例2.16:设(SP)=30H,(50H)=43,执行指令PUSH50H结果:(SP)=31H,(51H)=43H,执行过程如图2.5所示。例2.17:设(SP)=35H,(35H)=66H,执行指令POP40H结果:(40H)=66H,(SP)=34H,执行过程如图2.6所示。图2.5PUSH指令示意图××片内43H50H31H30HSP××40H执行前片内43H50H31H30H43H××SP40H执行前PUSH指令后图2.6POP指令示意图片内40H11H10HSP50H片内50H35H10H66H××SP40H66H66H××××执行前执行POP指令后2.2.2算术运算类指令算术运算结果将进位CY、半进位AC、溢出位OV三个标志位置位或复位,只有加1和减1指令不影响这些标志位。1、加法指令ADDA,Rn;A←(A)+(Rn)ADDA,direct;A←(A)+(direct)ADDA,@Ri;A←(A)+((Ri))2、带进位加指令ADDCA,Rn;A←(A)+(Rn)+CADDCA,direct;A←(A)+(direct)+CADDCA,@Ri;A←(A)+(Ri)+CADDCA,#data;A←(A)+#data+C3、带借位减指令SUBBA,Rn;A←(A)-(Rn)-CSUBBA,direct;A←(A)-(direct)-CSUBBA,@Ri;A←(A)–(Ri)-CSUBBA,#data;A←(A)-data–C4、乘法指令MULAB;BA←A×BMUL指令实现累加器A和B寄存器中的两个8位无符号数相乘,16位乘积的低8位放在累加器A中,高8位放在B寄存器中。例2.20:(A)=30H,(B)=60H,执行MULAB结果:(A)=00H,(B)=12H。5、除法指令DIVABA/B→商在A中,余数在B中DIV指令实现累加器A和B寄存器中的两个8位无符号相除,其中商存放累加器A中,余数存放在B中。例2.21(A)=0B4H(即180),(B)=18H(即24)执行DIVAB结果为(A)=07H…商(B)=0CH…余数,(Cy0=0,(OV)=0,(P)=16、加1指令INCA;A←(A)+1INCRn;Rn←(Rn)+1INCdirect;direct←(direct)+1INC@Ri;(Ri)←((Ri))+1INCDPTR;DPTR←(DPTR