第2章MCS-51单片机指令系统及汇编语言程序设计基础2.1MCS-51单片机指令格式2.2MCS-51单片机寻址方式2.3MCS-51单片机指令2.4汇编语言程序设计基础2.1MCS-51单片机指令格式2.1.1指令格式2.1.2指令的字节数2.1.3指令分类2.1.1指令格式不同类型的CPU有不同的指令系统,MCS-51指令系统兼容性高,功能强。指令:指示计算机执行某种操作命令指令系统:一台计算机所能执行的全部指令的集合指令系统功能强弱很大程度上决定了计算机智能的高低。程序:按人的要求编排的指令操作序列程序设计:编写程序的过程程序设计语言:实现人机交换信息(对话)最基本工具,包括机器语言、汇编语言、高级语言等。机器语言:用一组二进制编码表示每条指令,是计算机能直接识别和执行的语言。缺点:不易记忆,不易查错,不易修改。汇编语言:用助记符、符号和数字等来表示指令的程序语言。与机器语言指令一一对应,易于理解和记忆。优点:内存占用少,不用解释程序,适用实时控制,缺点:与计算机内部硬件结构密切相关,不如高级语言通用性强。高级语言:经过编译或解释成机器能识别和执行的机器语言指令。对51单片机,现有4种语言支持:汇编、PL/M(结构化语言、高级汇编)、BASIC、CC:结构化语言,源于编写UNIX操作系统,可产生紧凑代码,不依赖机器硬件系统、易于移植。指令格式:指令码的结构形式连接/定位器L51汇编语言源程序汇编器A51符号转换程序OHS51绝对地址目标程序.BINC语言程序浮动地址目标程序编译器C51·HEX两种语言源程序转换成目标程序四地址指令:最原始的计算机,操作数部分包括四部分地址,指令格式为:缺点:指令码冗长,严重影响指令执行速度。单地址指令:MCS-51系统单片机的指令系统采用了地址压缩技术,将操作数字段的四个地址压缩到一个地址中,其具体的指令格式为:操作码第一操作数地址第二操作数地址结果操作数地址下一条指令地址操作码操作数或操作数地址单地址指令的特点:累加器A(E0H)经常用来隐含寻址,存放一个操作数和结果操作数,PC自动+1,存放下一条指令地址。2.1.2指令的字节数1)单字节指令(49条)指令中的8位二进制代码既包含操作码的信息,也包含操作数的信息。(1)指令码中隐含着对某一个寄存器的操作INCA操作码:04H(A)+1→(A)NOP操作码:00H空操作(2)指令码中后三位不同编码指定某一个寄存器MOVA,Rn操作码:11101rrr(Rn)→(A)rrr=000-111=R0-R72)双字节指令(45条)一个字节表示操作码,另一个字节表示操作数或操作数所在的地址。(1)操作数字节是立即数(采用立即数寻址方式)如:ADDA,#22H;(A)+22H→(A)操作码24H,操作数22H(2)操作数字节是片内RAM地址(采用直接寻址方式)如:ADDA,22H;(A)+(22H)→(A)操作码25H,操作数22H注:两个22H含义不同3)三字节指令(17条)一个字节表示操作码,一个字节表示目的操作数,另一个字节表示源操作数。第二个和第三个字节为操作数或操作数地址。如:MOV5EH,#4FH操作码85H,目的操作数5EH,源操作数4FH4)汇编语言指令格式一条汇编语言指令最多包含4个区段:[标号:]操作码助记符[目的操作数][,源操作数][;注释]如:START:MOVA,#0F0H;(A)←立即数0F0H(1)标号标号位于语句的最前面,由1-8个字母和数字组成,它代表该语句的地址。标号必须由字母打头,以冒号结尾,不能使用指令助记符、伪指令或寄存器名。(2)操作码操作码是指令的助记符,不可以省略,它是语句的核心部分。(3)操作数必须满足寻址方式的规定。(4)注释应养成良好的添加注释的习惯。MCS-51指令系统共有111条指令,用42种助记符代表了33种操作功能,有的功能可以有几种助记符(例如数据传送的助记符有MOV,MOVC,MOVX)。1)根据指令在程序存储器中所占的字节数,指令系统分为:(1)单字节指令(49条)(2)双字节指令(45条)(3)三字节指令(17条)2.1.3指令分类2)根据指令执行的时间,指令系统分为:(1)1个机器周期(12个时钟振荡器周期)指令(64条)(2)2个机器周期指令(45条)(24个时钟振荡器周期)(3)乘、除两条指令为4个机器周期指令(48个时钟振荡周期)3)根据指令的功能,指令系统分为:(1)数据传送类(28条)(2)算术运算类(24条)(3)逻辑操作类(25条)(4)控制转移类(17条)(5)位操作类(17条)符号说明Rn表示当前工作寄存器区中的工作寄存器,n取0-7,表示R0-R7direct8位内部数据存储单元地址。它可以是一个内部数据RAM单元(0~127)或特殊功能寄存器地址或地址符号@Ri通过寄存器R1或R0间接寻址的8位内部数据RAM单元(0~255),i=0,1#data指令中的8位立即数#data16指令中的16位立即数addR1616位目标地址。用于LCALL和LJMP指令,可指向64K字节程序存储器地址空间的任何地方addR1111位目标地址。用于ACALL和AJMP指令,转至当前PC所在的同一个2K字节程序存储器地址空间内rel补码形式的8位偏移量。用于相对转移和所有条件转移指令中。偏移量相对于当前PC计算,在-128~+127范围内取值DPTR数据指针,用作16位的地址寄存器A累加器MCS-51指令系统符号说明bitB特殊功能寄存器,专用于乘(MUL)和除(DIV)指令中C进位标志或进位位bit内部数据RAM或部分特殊功能寄存器里的可寻址位的位地址表示对该位操作数取反(X)X中的内容((X))表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用((X))表示@间址寄存器的前缀标志←肩头左边的内容被箭头右边的内容所取代符号说明续表2.2MCS-51单片机寻址方式寻址方式:如何找到存放操作数的地址,把操作数提取出来的方法。是计算机的重要性能指标,汇编语言程序设计最基本的内容。2.2.1立即寻址2.2.2直接寻址2.2.3寄存器寻址2.2.4寄存器间接寻址2.2.5变址寻址2.2.6相对寻址2.2.7位寻址2.2.1立即寻址指令中操作数是一个实际的8位或16位的常数(常数#)采用立即寻址方式的指令一般为双字节指令该常数是以指令中字节的形成放在ROM中例:MOVA,#3AH;3AH→(A);MOVA,#data[8]MOVDPTR,#2000H;2000H→(DPTR);MOVDPTR,#DATA16;指令中操作数是片内RAM单元的直接地址,该地址指出了参与操作的数据所在的字节地址或位地址。(1)片内数据存储器的低128个字节单元(00H~7FH)如:MOVA,40H;(A)←(40H)(2)位地址空间如:MOVC,00H;进位位←位地址00H1bit内容(3)特殊功能寄存器(特殊功能寄存器只能用直接寻址方式进行访问)如:MOVA,P1;(A)←(90H)2.2.2直接寻址直接寻址(MOVA,40H)2.2.3寄存器寻址指令指出寄存器组R0~R7中某一个或其它寄存器(A、B、DPTR等)的内容为操作数。寻址寄存器:R0-R7、A、B、DPTR例:MOVA,R7;(A)←(R7)MOVP1,A;(P1)←(A)CLRA;(A)←#00HINCDPTR;(DPTR)←(DPTR)+1ADDA,20H;(A)←(A)+(20H)2.2.4寄存器间接寻址(@)指令中指定某一个寄存器的内容作为操作数的地址,由该地址所指定的单元内容作为操作数。R0、R1为间接寻址寄存器,寻址片内RAM低128字节数据指针DPTR为间接寻址寄存器,寻址片外RAM64KB不能用间接寻址方式寻址特殊功能寄存器例:MOVA,@R0;((R0))→(A)MOVXA,@DPTR;((DPTR))→(A)间接寻址(MOVA,@R0)2.2.5变址寻址用于访问程序存储器中的数据表格,它把基址寄存器(DPTR或PC)和变址寄存器(51中没有专门的变址寄存器,地址偏移量A)的内容作为无符号数相加形成16位的地址,访问程序存储器中的数据表格。如:MOVCA,@A+DPTR;(A)←((DPTR)+(A))MOVCA,@A+PC;(A)←((PC)+(A))变址寻址区是程序存储器ROM,而不是数据存储器RAM,因此变址寻址只有读操作,而没有写操作。变址寻址是单字节两周期指令,CPU执行这条指令前应预先在DPTR和累加器A中为该指令的执行准备条件。间接寻址(MOVCA,@A+DPTR)2.2.6相对寻址指令中,给出的地址偏移量rel与当前PC内容相加,作为操作数的地址。只出现在相对转移指令中偏移量rel以补码(正负)表示(范围-128~+127)访问ROMPC为执行完相对转移指令后的PC值转移后的目的地址:目的地址=源地址+rel+2(相对转移指令字节数)实际应用中,经常根据已知的源地址和目的地址计算偏移量rel,其值为-128~+127正向跳转:rel=目的地址-源地址-2反向跳转:rel=(目的地址-源地址-2)补如:SJMP08H;(PC)←(PC)+2+08H例:设rel=75H,CY=1,执行指令JCrel;CY=1转移相对寻址(JC75H)2.2.7位寻址指令中给出的是位地址,即片内RAM某一单元的一位。51单片机片内RAM位寻址区1)字节地址20H-2FH中,共128位,可直接使用位地址2)特殊功能寄存器中字节地址能被8整除的11个,可用寄存器名加位数表示,如:PSW.3位寻址的位地址和直接寻址的字节地址形式完全一样,主要由操作码来区分。如:MOVC,20H;将位地址为20H的数据送给进位标志CMOVA,70H;(A)←(70H)操作数寻址方式及其寻址空间2.3MCS-51单片机指令2.3.1数据传送类指令2.3.2算术运算类指令2.3.3逻辑运算及移位指令2.3.4控制转移类指令2.3.5位操作类指令2.3.6伪指令2.3.1数据传送类指令(28条)数据传送指令是把源操作数传送到指令所指定的目标地址,指令执行后,源操作数不变,目的操作数被源操作数所代替。主要是用于单片机片内RAM和特殊功能寄存器SFR之间数据的传递,也可以用于单片机片内和片外存储单元之间传送数据。数据传送指令一般不影响标志位,只有堆栈操作可以在栈中修改程序状态字PSW,对目的操作数为A的指令将影响奇偶标志P位。指令用到的助记符有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,PUSH,POP。源操作数可以采用寄存器寻址、寄存器间接寻址、直接寻址、立即寻址和变址寻址5种寻址方式,目的操作数可以采用寄存器寻址、寄存器间接寻址和直接寻址3种寻址方式。1)内部数据传送指令(15条)这类指令的源操作数和目的操作数地址都在单片机内部,可以是片内RAM的地址,也可以是特殊功能寄存器SFR的地址,其指令格式为:MOVdestination,source(1)以累加器A为目的操作数的指令(4条)MOVA,#data;#data→(A)MOVA,direct;(direct)→(A)MOVA,Rn;(Rn)→(A)其中Rn(n=0-7)MOVA,@Ri;((Ri))→(A)其中Ri(i=0,1)功能:把源操作数的内容送入A寻址方式:寄存器寻址、直接寻址、间接寻址、立即寻址只影响PSW中的P标志位(2)以寄存器Rn为目的操作数的指令(3条)MOVRn,A;(A)→(Rn)MOVRn,direct;(direct)→(Rn)MOVRn,#data;#data→(Rn)功能:把源操作数的内容送入当前工作寄存器组R0-R7中的某个寄存器里。寻址方式:寄存器寻址、直接寻址、立即寻址注意:没有MOVRn,Rn指令(3)以直接地址为目的操作数的指令(5条)MOVdirect,A;(A)→(direct)MOVdirect,#data;#dat