第3章指令系统与汇编语言程序设计本章要点:51系列单片机指令系统的寻址方式51系列单片机指令系统的使用要点51系列单片机汇编语言程序设计的方法及应用实例计算机是高度自动化的机器,它能自动进行运算和处理事务。整个自动操作过程是由CPU中的控制器控制的。控制器自动执行存放在存储器中的指令,而每一条指令规定计算机完成某种操作。CPU所能执行的所有指令的集合就称为指令系统。计算机的CPU只能认识和识别二进制代码,这种代码称为机器码,通常用十六进制书写。机器码虽然能被计算机识别,但不便于记忆和阅读,所以制造厂家对指令系统中的每一条指令都给出了符号作指令助记符。这些助记符都一定的含义(一般为英文缩写),便于记忆、理解和阅读。这种用助记符(操作码)、操作数(或其地址)、标号编写的程序称为汇编(符号)语言程序。汇编语言程序必须由翻译成机器能识别的机器码(目标代码)才能在计算机上运行。翻译的方法有两种:人工汇编和自动汇编。人工汇编就是由人工将指令翻译成机器代码,而自动汇编是由计算机用汇编程序进行翻译。为了剖析现成产品的程序,有时还需要把机器码翻译成汇编语言,这个过程称为反汇编。汇编程序反汇编汇编语言源程序机器语言MCS-51的指令系统共有111条指令,分为5种类型、有7种寻址方式,共255种操作代码、使用了42种助词符。从指令占用的存储空间看,单字节指令有49条,双字节指令有45条,三字节指令有17条;从指令执行的时间看,单周期指令占64条,双周期指令占45条,四周期指令2条(乘法和除法指令)。MCS-51单片机的指令系统占用的存储空间少、执行速度快,有较强的实时处理能力,特别适合于控制系统。MCS-51系列单片机的指令格式及标识MCS-51单片机汇编语言的指令由操作码和操作数两部分组成,操作码表明指令要执行的操作,而操作数则说明参与操作的数据或数据存放的位置。[标号:]操作码[操作数][;注释]标号:是该指令语句的符号地址,汇编时将该符号地址还原为该指令所在的实际地址。使用标号主要是便于编程和查询标号,可根据需要设置。标号一般由1~6个字符组成,第一个字符必须是字母,其余可以是数字、字母或下划线等。标号与操作码之间用冒号“:”分隔。操作码:用于指明指令的功能。在汇编语言中用助词符表示。操作数:根据指令的不同,操作数可以为1个、2个、3个或没有。操作数之间用逗号“,”分隔。“操作数1”通常是执行操作的目的单元,称目的操作数,如寄存器、标号等;“操作数2”通常是执行操作的数据来源,称源操作数,可以是寄存器、常量、标号等;“操作数3”通常是执行操作的目的地址或相对偏移量,在汇编程序中常用标号来表示。如果操作数为数值,可以采用:二进制,以B(Binary)结尾;十进制,以D(Decimal)结尾或省略;十六进制,以H(Hexadecimal)结尾,若第一个数字大于9,前要加0。注释:是对该语句或程序段的简要说明,通常对程序的作用、主要内容、进入和退出子程序的条件等关键性内容进行注释,以提高程序的可读性。注释和源程序一起存储、打印,但汇编时不会被翻译,因而在机器代码的目的程序中并不出现,不会影响程序的执行。注释必须以分号“;”开始,当注释较长占用多行时,每一行都必须以“;”开始。指令中使用的符号addr11------11位目标地址。用于ACALL和AJMP指令,转向下一条指令中的第一个字节所在的同一个2K字节程序存储器地址空间内的任何地方。addr16------16位目标地址。用于LCALL和LJMP指令,可以指向64K字节程序存储器地址空间的任何地方。bit-----可直接位寻址的位地址#------立即数前缀direct-------直接寻址时数据单元地址rel-----相对偏移量(8位有符号数,-128B~+127B)。Ri-------工作寄存器,i=0,1Rn------工作寄存器,n=0~7@-----寄存器间接寻址前缀如:@Ri,@DPTR$----当前指令的地址(X)-----X单元内容((X))-----以X单元的内容为地址的单元中的内容MCS-51系列单片机的寻址方式在有操作数的指令中,参与操作的数据可能就在指令中,也可能在寄存器、存储器、I/O接口中。为正确的执行操作,对这些寄存器、存储器、和I/O接口要进行编号(也称作地址号)。而在指令中对这些设备内的数据要进行操作就要指出地址。指令中所规定的寻找操作数地址的方式称为寻址方式。每一种计算机都具有多种寻址方式。寻址方式的多少即寻址功能是反映指令系统优劣的主要因素之一。MCS-51指令系统的寻址方式有7种。操作数寻址方式的相关空间寻址方式寻址空间寄存器寻址工作寄存器R0~R7A,B,C,DPTR直接寻址内部RAM的低128B特殊功能寄存器内部RAM中字节地址为20H~2FH的128个位地址空间特殊功能寄存器中可位寻址的位地址空间操作数寻址方式的相关空间立即寻址程序存储器寄存器间接寻址内部RAM外部RAM变址寻址程序存储器相对寻址程序存储器位寻址内部RAM中字节地址为20H~2FH的128个位地址空间特殊功能寄存器中可位寻址的位地址空间3.2.1寄存器寻址寄存器寻址就是以通用寄存器中的内容作为操作数。在指令中直接以寄存器的名字表示操作数的地址。例如:MOVA,R0指令的功能是将寄存器R0的内容送入寄存器A。3.2.2.直接寻址指令中直接给出的是操作数的地址。例:MOVA,70H;(70H)→A指令功能是内部RAM70H单元中的内容输入累加器A。3.2.3立即寻址立即寻址方式中,操作数直接写在指令中,汇编后操作数以指令的形式存放在程序存储器中。如:ADDA,#70H功能:将数据70H与A中内容相加请注意,在MCS-51汇编语言指令表中,立即数通常用#data表示,立即数前面必须有符号“#”。3.2.4寄存器间接寻址由指令指出某一个寄存器的内容作为操作数的地址,这种寻址方式称为寄存器间接寻址。注意:在寄存器间接寻址方式中,存放在寄存器中的内容不是操作数,而是操作数所在的存储器单元地址。寄存器间接寻址只能使用寄存器R0和R1作为指针地址,来寻址内部RAM中的数据;可使用寄存器R0、R1和DPTR作为指针地址,来访问外部RAM。寄存器间接寻址用符号“@”表示。例如:MOV@R0,A;A→((R0))假设(R0)=30H,指令功能是把累加器A的内容写入内部RAM的30H单元中。MOVXA,@R0;((R0))→A指令功能是R0所指出的外部RAM单元中的内容送累加器A。若R0内容为60H,而外部RAM60H单元中的内容是3BH,则指令MOVA,@R0的功能是将3BH这个数送到累加器A。MOVXA,@DPTR3.2.5变址寻址这种寻址方式是以16位的程序计数器PC或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,两种寄存器中的内容相加作为操作数的地址。这种寻址方式用于读取表格中的数据。MOVCA,@A+PC;将下条指令第一个字节的地址加上A中的偏移量作为操作数的地址MOVCA,@A+DPTR;将DPTR的内容与A中的偏移量相加作为操作数的地址3.2.6相对寻址用于程序控制,利用指令修正PC指针的方式实现转移。这类方式是以当前PC的内容作为基地址,加上指令中给定的偏移量rel所得的结果作为转移地址。偏移量是带符号数,在+127B~-128B范围内,用补码表示。例如:JCrel;C=1跳转到PC+rel所指定的单元继续执行第一字节为操作码,第二字节就是相对程序计数器PC当前地址(PC的当前地址是指向下一条指令的第一字节的)的偏移量rel。若转移指令操作码存放在1000H单元,该指令执行时PC的内容已经为1002H。设偏移量rel为05H,则转移地址为1007H。当C=1时,去1007H执行单元中的指令。3.2.7位寻址从本质上说,位寻址不是一种新的寻址方式,而是前述寻址方式的一种特殊形式。位寻址的对象是可位寻址空间中的一个位,而不是一个字节。在MCS-51系统中,位地址的表示可以采用以下几种方式:(1)直接使用位寻址区00H~FFH范围内的某一位的位地址表示。(2)采用第几单元第几位的表示方法,如25H.5表示25H单元的D5位。指令对存储空间进行的操作是由指令的操作码和寻址方式确定的对于程序存储器只能采用立即寻址和基址加变址寄存器间接寻址方式特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址对8052/8032等单片机内部的高128字节(80H~0FFH)只能采用寄存器间接寻址,不能使用直接寻址方式外部扩展的数据寄存器只能用寄存器间接寻址而内部RAM的低128字节(00~7FH)既可用直接寻址,也可用寄存器间接寻址,操作指令最丰富。MOVR0,#30H;MOVA,@R0;MOVR1,A;MOVB,@R1;MOV@R1,P1;MOVP2,P1;MOV10H,#20H;例1:设片内RAM的30H单元的内容为40H,40H单元的内容为10H,10H单元的内容为00H,端口P1中的内容为0CAH。试分析下列程序,并说明:各条指令是什么寻址方式?程序执行后各单元、寄存器及端口的内容。程序执行后,(R0)=30H,(A)=40H,(R1)=40H,(B)=10H,(P2)=0CAH,(P1)=0CAH,(40H)=0CAH,(10H)=20H。寄存器寻址,立即寻址寄存器寻址,寄存器间接寻址寄存器寻址,寄存器寻址寄存器寻址,寄存器间接寻址寄存器间接寻址,直接寻址直接寻址,直接寻址直接寻址,立即寻址3.4MCS-51系列单片机的指令系统MCS-51指令系统用42种助记符表示了33种指令功能。共有111条指令,256种机器码。按字节分:单字节指令49条双字节指令45条三字节指令17条按执行时间:单周期指令64条双周期指令45条四周期指令2条按指令功能:数据传送指令29条算术运算指令24条逻辑运算指令24条控制转移指令17条布尔处理指令17条MCS-51系列单片机的指令系统简介111条指令,共分五大类:数据传送类;(29条)算术运算类;(24条)逻辑运算类;(24条)控制转移类;(17条)位操作类。(17条)3.3.1数据传送指令(29条)数据传送指令一般的操作是把源操作数传送到所指定的目的地址,指令执行后,源操作数不变,目的操作数为源操作数所代替。数据传送是一种最基本最主要的操作,它是编制程序时使用最频繁的一类指令,数据传送是否快速对整个程序的执行效率起很大的作用。在MCS-51指令系统中,数据传送指令非常灵活,它可以把数据方便的传送到数据存储器和I/O口。数据传送类指令用到的助记符有:MOV、MOVX、MOVC、XCH、XCHD、PUSH、POP。工作组寄存器R0~R7直接地址direct累加器ACC立即数#data间接寻址@Ri,@DPTR直接地址Direct(bit)数据传送路径位累加器Cy传送指令归纳起来只有5种:片内RAM传送:MOV片外RAM传送:MOVX访问ROM的传送(查表):MOVC累加器交换:XCH、XCHD、SWAP堆栈操作:PUSH、POP1.内部数据传送指令(1)以累加器A为目的操作数的指令MOVA,RnMOVA,directMOVA,@RiMOVA,#data这组指令的功能是将Rn、direct、@Ri单元中的内容或#data送入目的单元累加器A中。(2)以Rn为目的操作数的指令MOVRn,AMOVRn,directMOVRn,#data这组指令的功能是将A、direct单元的内容或#data送入目的单元工作寄存器Rn中。(3)以直接地址为目的操作数的指令MOVdirect,AMOVdirect,RnMOVdirect,directMOVdirect,@RiMOVdirect,#data这组指令的功能是将A、Rn、direct、@Ri单元中的内容或#data送入目的单元direct中。(4)以寄存器间接寻址的单元为目的操作数的指令MOV@Ri,AMOV@Ri,directMOV@Ri,#data这组指令的功能是将A、direct单元的内容或#data送