版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目351单片机指令系统3.1指令系统概述
所谓指令,就是指挥计算机工作的基本操作命令。计算机所能执行的基本操作命令的集合就构成了计算机的指令系统。我们按照一定的目的编写的计算机程序,实际就是各种指令的组合。 机器语言、汇编语言、高级语言项目351单片机指令系统3.1.1指令的格式
格式:[标号:]<操作码>[操作数];[注释]1.标号:也称标识符,由用户自行定义,由1~8个字符组成,必须以字母开头,其余字符可以是字母或是数字等。2.操作码:也称指令助记符,它规定了指令的功能。3.操作数:指令的操作对象,规定了参与操作的数据的来源或操作结果存放的地点,大多为1~2个,个别指令有3个(如CJNE等)。4.注释:指令语句的说明性文字,必须以“;”开始,其目的便于编程人员的阅读和交流,它不是指令的功能部分,可以省略。例如:LOOP:MOVA,#05H;累加器A中送入数据05H项目351单片机指令系统3.1.2指令系统的符号说明Rn:表示当前选定寄存器组的工作寄存器R0~R7;Ri:表示作为间接寻址的地址指针R0~R1;#data:表示8位立即数,即00H~FFH;#data16:表示16位立即数,即0000H~FFFFH;addr16:表示16位地址,用于64K范围内寻址,通常也可以用字符串表示;addr11:表示11位地址,用于2K范围内寻址,通常也可以用字符串表示;direct:表示8位直接地址,可以是内部RAM区的某一单元或某一专用寄存器地址;Rel:表示带符号的8位偏移量(-128~+127),通常也可以用字符串表示;Bit:表示位寻址区的直接寻址位或者是可位寻址的特殊功能寄存器的位地址;项目351单片机指令系统3.1.3寻址方式
所谓寻址方式就是获得操作数的方式问题。由于指令给出操作数的方式不同,因此就形成不同的寻址方式。寻址方式越多,操作就越方便,控制就越灵活。寻址方式是看提供操作数中源操作数的性质来看的,与目的操作数无关。1.立即寻址 指令中给出的是操作数本身。在指令格式中有两种形式:即8位和16位立即数两种表示方法用“#”作为前缀。例如:MOVA,#100;将立即数100(64H)送入累加器AMOVR0,#32H;将立即数32H送入到R0中MOV30H,#40H;将立即数40H送入数据存储器30H单元中 上述三条指令执行完后,累加器A中数据为立即数据64H,R0寄存器中数据为32H,数据存储器30H单元数据为40H。项目351单片机指令系统2.直接寻址 指令中给出的是操作数所在的单元地址,通过单元地址找到这个操作数,这就是直接寻址。寻址范围只限内部RAM低128单元(即00H~7FH)和特殊功能寄存器。例如:MOVA,40H;将内部数据存储器40H单元中的数据传送到累加器A中MOVA,P1;将特殊功能寄存器P1的数据传送到累加器A中3.寄存器寻址 指令中给出的是操作数在一个寄存器中,以寄存器的内容作为操作数,找到了制定的寄存器,就等于找到了操作数,这就是寄存器寻址方式,通用寄存器指A、B、DPTR以及R0~R7,工作寄存器R0~R7常用于寄存器寻址。例如:MOVA,R0;将R0中的数据传送到累加器A中项目351单片机指令系统4.寄存器间接寻址 指令中给出的是操作数的单元地址,这个单元地址放在一个寄存器中,通过寄存器找到这个操作数,也就是说操作数是通过寄存器间接得到的,所以叫寄存器间接寻址方式。 例:假定寄存器R0中的内容是40H,而内部RAM中40H单元的内容是62H,则执行指 令‘MOVA,@R0’后,R0中内容不变,A中内容变为62H,其指令操作过程示意图如图3-1所示。62H62H40HR040HA图3-1寄存器间接寻址示意图项目351单片机指令系统5.变址寻址 指令中给出的是操作数的单元的复合地址。即基址寄存器加变址寄存器的间接寻址方式。通常是以数据指针寄存器DPTR或者程序计数器PC作为基本地址,累加器A作为变址,两者的内容相加形成16位程序存储器地址。简单的说,指令的立脚点DPTR中有一个数,A中有一个数,执行指令时,将A和DPTR中的数加起为,就成为要查找单元的地址。 变址寻址方式仅使用于程序存储器(ROM)。 例:假定累加器A中的内容是05H,而DPTR中的内容是2100H,程序存储器2105H处的内容是3FH,则执行指令‘MOVCA,@A+DPTR’后,DPTR中的内容不变,A中的内容变为3FH,其指令操作过程示意图如图3-2所示。05H00H21HDPTR+A图3-2变址寻址示意图3FH2105HROM3FH项目351单片机指令系统6.位寻址
MCS-51单片机具有位寻址功能,即指令给出的不再是单元地址,而是8位中的一位地址,这种寻址方式就是位寻址方式。通常位寻址方式中都出现布尔累加器C。寻址范围包括内部RAM20H~2FH位寻址区中的128位和特殊功能寄存器(SFR)中11个可以按位寻址特殊功能寄存器的83位。 位寻址有4种表示方式:
1)直接给出位地址。例如:
MOVC,2FH
其中C是累加位,2FH是位地址。
2)给出单元地址与位地址的组合。例如:
MOVC,22H.6
其中,22H.6表示22H单元地址中的第6位。
3)特殊功能寄存器符号与位的组合。例如:
MOVC,P1.3
其中,P1.3表示Pl口的第3位。
4)给出特殊功能寄存器中位的符号。例如:
MOVC,AC
其中AC即程序状态字PSW中的D6位的专用符号。项目351单片机指令系统7.相对寻址方式 相对寻址是在相对转移指令中使用的寻址方式。相对转移指令需要人为地改变程序计数器PC的值,以改变程序执行的顺序。相对寻址,就是给出相对于PC当前所指位置的偏移量,以使程序“跳转”到新的位置执行。 例如,在100OH处有这样一种“短转移”指令,rel=05H,则执行指令
1000H:SJMPrel
后,程序转移到1007H处继续执行。执行该指令前,PC本来指向该指令的起始地址1000H。该指令占两个字节,所以取出指令后,PC指向1002H。rel即相对于此地址的偏移量,其目标地址为PC+2+rel=1000+2+5=1007H。项目351单片机指令系统3.1.4单片机指令的分类
MCS-5l系列单片机指令系统由111条指令组成。其中,若按指令机器码的字节数来分,可以分为单字节指令(49条)、双字节指令(45条)、3字节指令(17条). 从指令的执行时间(机器周期)来看,单周期指令有64条,双周期指令有45条,还有2条指令(乘、除法运算)是4个周期。 根据操作功能的不同,整个指令系统分为以下五大类指令:1.数据传送类指令(28条),2.算术运算类指令(24条)。3.逻辑运算及移位类指令(25条)。4.控制转移类指令(17条)。5.布尔变量操作类指令(17条)。项目351单片机指令系统3.2数据传送类指令3.2.1内部RAM数据传送指令 内部RAM数据传送,是指单片机内部的各寄存器和存储器之间的数据传送。根据目的操作数的不同,又分为以下几种类型。
1.以累加器A为目的操作数的指令
MOVA,Rn;A←(Rn)
MOVA,direct;A←(direct)
MOVA,@Ri;A←((Ri)) MOVA,#data;A←data项目351单片机指令系统2.以寄存器Rn为目的操作的指令
MOVRn,A;Rn←(A)MOVRn,direct;Rn←(direct)MOVRn,#data;Rn←data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。3.以直接地址为目的操作数的指令MOVdirect,A;direct←(A)MOVdirect1,direct2;direct1←(direct2)MOVdirect,@Ri;direct←((Ri))MOVdirect,#data;direct←data这组指令功能是把源地址单元中的内容送入直接地址所指定的内部RAM单元中,源操作数不变。项目351单片机指令系统4.以间接地址为目的操作数的指令MOV@Ri,A;((Ri))←(A)MOV@Ri,#data;((Ri))←dataMOV@Ri,direct;((Ri))←direct
这里不是将源操作数送给Ri,而是送到以Ri的内容为地址的内部RAM单元中。例如:
MOV@R1,#100;将立即数100送入,以R1内容作为地址的内存单元中。若R1=32H,执行完本指令后,R1值不变,32H单元的内容变为100。【特别提示】 若立即数以A、B、C、D、E或F开头,需要在前面加上0,例如FFH,在指令中应写成0FFH。项目351单片机指令系统5.以DPTR为目的操作数的指令 MOVDPTR,#data16;DPTR←data16 8051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例如:
MOVDPTR,#1234H
执行完了该指令之后,DPH中的值为12H,DPL中的值为34H。反之,如果我们分别向DPH,DPL送数,则结果也一样。如有下面两条指令:MOVDPH,#35HMOVDPL,#12H则就相当于执行了MOVDPTR,#3512H。项目351单片机指令系统3.2.2外部RAM的数据传递指令
这类指令是指对单片机外部扩展的RAM进行数据存取的指令,而访问外部RAM只能使用间接寻址的方式。【特别提示】 在51单片机中,与外部存储器RAM打交道的只可以是累加器A。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 另外,在MOV指令后面增加了“X”,表示对外部RAM的数据传送。1.使用DPTR间接寻址MOVXA,@DPTR;A←((DPTR))MOVX@DPTR,A;((DPTR))←(A) 前一条指令的功能是,将DPTR所指的外部RAM地址单元内容送给A;第二条指令的功能则是将A的值送到外部RAM地址单元中去,由于DPTR是16位数据指针,所以它的可址范围是2^16=64KB(0000H~FFFH)。项目351单片机指令系统2.使用Ri间接寻址MOVXA,@Ri;A←((Ri))MOVX@Ri,A;((Ri))←A
这两条指令与上述使用的DPTR间接寻址的指令功能基本相同,不过因为由于Ri(即R0或R1)只是一个8位的寄存器,所以只提供低8位地址,可寻址的范围仅仅外部RAM中的低256个单元(00H~FFH)。 编程实现将外部RAM中01H单元的数据与02H单元数据互换。项目351单片机指令系统3.2.3ROM数据传送指令 这里的ROM(程序存储器),既包括外部ROM,也包括内部ROM,单片机ROM统一编址,指令不用加以区分。另外,ROM只能读不能写,所以数据传送是单向的,即从ROM中读取数据,并只能送入累加器A中。MOVCA,@A+DPTR;A←((A)+(DPTR))MOVCA,@A+PC;A←((A)+(PC))
这类指令属于变址寻址方式,使用DPTR或PC为基址寄存器,寻址范围64KB,是将ROM中的数送入A中,所以也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。但是,这两条指令在使用上有些区别,当使用DPTR作为基址寄存器时,由于事先可以给DPTR赋64KB范围内的任意值,与A相加后的寻址范围可以是整个ROM的64KB空间,使用很方便;而当使用PC作为基址寄存器时,由于PC有严格的当前值,A是8位无符号数,只能在当前指令的256个单元范围内进行查表。项目351单片机指令系统3.2.4数据交换指令 数据交换指令是指单片机内部RAM单元与累加器A的内容进行交换,分为整个字节交换、半个字节交换以及累加器A半字节交换等几种。1.字节交换指令XCH
A,Rn ;(A)←→(Rn)XCH
A,direct;(A)←→(direct)XCH
A,@Ri ;(A)←→((Ri))以上指令结果影响程序状态字寄存器PSW的P标志。2.半字节交换指令指的是内部RAM单元与A之间进行低4位数据交换。XCHDA,@Ri ;(A)3-0←→((Ri))3-0项目351单片机指令系统3.2.5堆栈指令 堆栈是用户自己设定的内部RAM中的一块专用存储区,向栈里存取数据的操作成为堆栈操作。存放数据称为“入栈”,取出数据称为“出栈”。堆栈操作必须是字节操作,且只能直接寻址。PUSHdirect;SP←(SP)+1,(SP)←(direct)POPdirect;(direct)←((SP)),SP←(SP)-1
第一条指令称之为推入,就是将direct中的内容送入堆栈中。指令执行分为两步:第一步先将SP+1,第二部将direct中的数据传递到SP中的值为地址的RAM单元中,所以说,当入栈的数据增多时,SP永远指向已入栈数据的最高地址处,或是叫做“栈顶”的地方。项目351单片机指令系统3.3算术运算指令
MCS-5l指令系统有丰富的算术运算类指令,算术运算类指令一共有24条,可以分为不带进位加法、带进位加法、带借位减法、加1、减1、乘、除和十进制调整指令等。主要完成加、减、乘、除四则运算以及增量、减量和十进制调整等操作。同时执行过程中会影响到程序状态字PSW中的某些位,例如进位位Cy、辅助进位标志AC、溢出标志OV以及奇偶校验标志位等。项目351单片机指令系统3.3.1加法指令加法指令可以归纳为不带进位加法指令、带进位加法指令以及加1指令等三类。1.不带进位加法指令(4条)ADDA,#data;(A)+data→AADDA,Rn;(A)+(Rn)→AADDA,@Ri;(A)+((Ri))→AADDA,direct;(A)+(direct)→A
这些指令的基本功能是,将源操作数与累加器A中操作数相加,并将相加后的结果送到累加器A中。运算的结果会影响PSW标志位,情况如下:进位标志位CY:和的D7位有进位时,(CY)=l,否则(CY)=0;辅助进位标志位AC:和的D3位有进位时,(AC)=l,否则(AC)=0;溢出标志位OV:和的D7、D6位只有一个有进位时,(OV)=1;和的D7、D6位同时有进位或同时无进位时,(OV)=0,表示溢出。溢出说明运算的结果超出了数值所允许的范围,如两个正数相加结果为负数或两个负数相加结果为正数时属于错误结果,此时(OV)=1。奇偶标志位P:当累加器ACC中“l”的个数为奇数时,(P)=1,为偶数时,(P)=0。项目351单片机指令系统2.带进位加法指令(4条)ADDCA,#data;(A)+data+(Cy)→AADDCA,Rn;(A)+(Rn)+(Cy)→AADDCA,@Ri;(A)+((Ri))+(Cy)→AADDCA,direct;(A)+(direct)+(Cy)→A
这些指令的基本功能是,将源操作数、累加器A中操作数以及进位标志Cy的值相加相加,并将相加后的结果送到累加器A中。 带进位的加法法运算指令常用于多字节的加法运算中。例如两个字节数的相加运算,当高位字节相加时,就需要考虑低位字节相加后可能产生的进位。项目351单片机指令系统3.加1指令(5条)INCA;A←(A)+1INCRn;Rn←(Rn)+1INCdirect;direct←(direct)+1INC@Ri;(Ri)←((Ri))+1INCDPTR;DPTR←(DPTR)+1
这组指令的功能是使源操作数的值加1,并且将结果送回原来的单元。加1指令比较简单,执行比较快,只有INCA影响PSW的奇偶校验位,其余指令不影响标志位的状态。例如,(A)=0FFH,执行指令INCA后,变为00H,但是溢出标志位没有变化。项目351单片机指令系统3.3.2减法指令减法指令包括带借位减法指令和减1指令两类。1.带借位减法指令(4条)SUBBA,Rn;A←(A)–(Rn)–(CY)SUBBA,direct;A←(A)–(direct)–(CY)SUBBA,@Ri;A←(A)–((Ri))–(CY)SUBBA,#data;A←(A)–data–(CY) 这些指令的功能是将A中的值减去其后面的值,再减上Cy的值,最终结果送回到A中。 减法指令只有带借位的减法,没有不带借位的减法,如果进行不带借位的减法运算,可以先输入一条指令“CLRC”,将Cy清零。在使用SUBB指令时,如果系统没有特别指出Cy值时,第一次相减时一定要清零借位标志位Cy。即“CLRC”。项目351单片机指令系统2.减1指令(4条)DECA;A←(A)-1DECRn;Rn←(Rn)-1DECdirect;direct←(direct)-1DEC@Ri;(Ri)←((Ri))-1
这组指令的功能是使源操作数的值减1,并且将结果送回原来的单元。与加1指令一样,只有DECA影响PSW的奇偶校验位,其余指令不影响标志位的状态。项目351单片机指令系统3.3.3乘除法指令 乘除法指令执行时需要4个机器周期,是指令系统中执行时间最长的指令。1.乘法指令
MULAB;BA←(A)×(B)
指令的功能是把累加器A和寄存器B中两个8位无符号整数相乘,并把乘积的高8位存于寄存器B中,低8位存于累加器A中。 乘法运算指令执行时会对标志位产生影响:CY标志总是被清0,即CY=0;OV标志则反映乘积的位数,若OV=1,表示乘积为16位数(即乘积的结果大于FFH,B中的内容不为0);若OV=0,表示乘积为8位数。 例如,若(A)=50H,(B)=05H,则执行指令MULAB后,(A)=90H,(B)=01H,表明乘积的结果0190H。项目351单片机指令系统2.除法指令
DIVAB;A商,B余←(A)÷(B) 指令的功能是把累加器A和寄存器B中的两个8位无符号整数相除,所得商的整数部分存于累加器A中,余数存于B中。 除法指令执行过程对标志位的影响:CY位总是被清0,OV标志位的状态反映寄存器B中的除数情况,若除数为0,则OV=1,表示本次运算无意义,否则,OV=0。 例如,若(A)=51H,(B)=05H,则执行指令DIVAB后,(A)=10H(商),(B)=01H(余数)。项目351单片机指令系统3.3.4十进制调整指令 这是一条专用指令,用于对BCD码十进制加法运算的结果进行修正。DAAMOVA,#75HMOVR3,#69HADDA,R3;(A)=DEH,CY=0MOVB,A;(B)=DEHDAA;(A)=44H,CY=1项目351单片机指令系统3.4逻辑运算指令3.4.1累加器A的逻辑操作指令1.累加器A清0 CLRA;A←00H2.累加器A取反 CPLA;这两条指令的功能是,对累加器A清零或取反后,结果仍存入A中。3.累加器A循环左移
RLA利用左移指令,可实现对A中的无符号数乘2的目的。D7←D0项目351单片机指令系统4.累加器A带进位循环左移 RLCA5.累加器A循环右移 RRA
对累加器A进行的循环右移,可实现对A中无符号数的除2运算。6.累加器A带进位循环右移 RRCA7.累加器A半字节交换SWAPA功能是将累加器A中内容的高4位与低4位互换。项目351单片机指令系统3.4.2逻辑运算指令1.逻辑与指令(6条)ANLA,Rn;A←(A)∧(Rn)ANLA,direct;A←(A)∧(direct)ANLA,@Ri;A←(A)∧((Ri))ANLA,#data;A←(A)∧#dataANLdirect,A;direct←(direct)∧(A)ANLdirect,#data;direct←(direct)∧#data 这些指令的功能是将目的操作数和源操作数按位进行逻辑与操作,结果送目的操作数。在程序设计中,逻辑与指令主要用于对目的操作数中的某些位进行屏蔽(清0)。方法是:将需屏蔽的位与“0”相与,其余位与“1”相与即可。项目351单片机指令系统2.逻辑或指令(6条)ORLA,Rn;A←(A)∨(Rn)ORLA,direct;A←(A)∨(direct)ORLA,@Ri;A←(A)∨((Ri))ORLA,#data;A←(A)∨#dataORLdirect,A;direct←(direct)∨(A)ORLdirect,#data;direct←(direct)∨#data 功能是将目的操作数和源操作数按位进行逻辑或操作,结果送目的操作数。 逻辑或指令可对目的操作数的某些位进行置位。方法是:将需置位的位与“1”相或,其余位与“0”相或即可,常用于组合数据。项目351单片机指令系统3.逻辑异或指令(6条)XRLA,Rn;A←(A)⊕(Rn)XRLA,direct;A←(A)⊕(direct)XRLA,@Ri;A←(A)⊕((Ri))XRLA,#data;A←(A)⊕#dataXRLdirect,A;direct←(direct)⊕(A)XRLdirect,#data;direct←(direct)⊕#data 功能是将目的操作数和源操作数按位进行逻辑异或操作,结果送目的操作数。 逻辑异或指令可用于对目的操作数的某些位取反,而其余位不变。方法是:将要取反的这些位和“1”异或,其余位则和“0”异或即可。项目351单片机指令系统3.5控制转移指令
在很多情况下,程序需要循环、分支或调用子程序等,这都要人为的改变程序的执行顺序,利用控制转移指令就可以达到这样的目的。 控制转移类指令分为无条件转移、条件转移及子程序调用与返回指令等。3.5.1无条件转移指令 没有规定转移条件的指令称无条件转移指令,MCS-51单片机有4条指令。 1.长转移指令 LJMPaddr16;addr16→PC 该指令的功能是,将指令码中的16位地址送入程序计数器PC中,使程序跳转到addr16目的地址的地方执行。addr16表示16位目的地址,通常用标号代替。项目351单片机指令系统2.绝对转移指令 AJMPaddr11;(PC)+2→PC,addr11→PC10~PC0 这里的addr11是11位的绝对地址,其最小值是0000H,最大值是07FFH,所以寻址范围是2KB。该指令的功能是,程序跳转到addr11目的地址的地方执行,通常用标号代替。3.相对转移指令
SJMPrel;(PC)+2+rel→PC 该指令的功能是,程序跳转到rel目的地址的地方执行。rel表示8位目的地址,通常用标号代替。
SJMP$;$就是当前行,就是跳转到当前行继续执行。即一个死循环。
主要用处就是等待内外的中断。4.散转指令 JMP@A+DPTR;(A)+(DPTR)→PC 该指令的功能是,程序跳转到(A+DPTR)为目的地址的地方执行。由于累加器A和数据指针DPTR都可以赋值,因此使用很灵活,其中,DPTR的内容可以作为基地址,是一个相对固定的值,以A的内容作为变址,根据A的不同值,可使程序转移到不同的地方。项目351单片机指令系统3.5.2条件转移指令 条件转移指令是指,当程序在处理这类命令时,需要判断是否要满足某个条件,若条件满足就转移,条件不满足就不转移,仍按顺序执行程序。1.累加器判零转移 这类指令是判断A内容是否为0作为转移的条件。JZrel;若(A)=0,则PC←(PC)+2+relJNZrel;若(A)≠0,则PC←(PC)+2+rel 第一指令的功能是:如果(A)=0,则转移,否则顺序执行(执行本指令的下一条指令)。转移到什么地方去呢?我们可以这样理解:JZ标号,即转移到标号处。项目351单片机指令系统2.比较转移指令
数值比较转移指令是将两个操作数进行比较,以比较的结果作为是否转移的条件。CJNEA,#data,rel;若(A)≠data,则PC←(PC)+3+relCJNEA,direct,rel;若(A)≠direct,则PC←(PC)+3+relCJNERn,#data,rel;若(Rn)≠data,则PC←(PC)+3+relCJNE@Ri,#data,rel;若((Ri))≠data,则PC←(PC)+3+rel 第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移。同样地,我们可以将rel理解成标号,即:CJNEA,#data,标号。编程时rel常常用标号代替。 这样利用这条指令,我们就可以判断两数是否相等,这在很多场合是非常有用的。另外,该指令还知道这两个操作数的大小,如果两数不相等,则CPU还会反映出哪个数大,哪个数小,这是用Cy(进位位)来实现的。若指令左边的操作数≥右边的操作数,则Cy=0,否则Cy=1。项目351单片机指令系统3.循环转移指令 循环转移指令又叫减1条件转移指令,常用于控制程序的转移次数。
DJNZRn,rel;(Rn)-1→Rn,;若(Rn)≠0,则(PC)+2+rel→PC,转移执行;若(Rn)=0,则(PC)+2→PC,顺序执行
DJNZdirect,rel;(direct)-1→Rn,;若(direct)≠0,则(PC)+2+rel→PC,转移执行;若(direct)=0,则(PC)+2→PC,顺序执行 该指令的功能是,是先将操作数(Rn或者direct)的内容减1,并保存减1的结果,如果减1后的结果不为0就转移,否则就顺序执行。项目351单片机指令系统3.5.3子程序调用返回指令 1.子程序的概念所以我们通常把能完成一定功能的且能被调用执行并能返回调用程序的程序叫子程序。调用子程序的程序叫主程序,被调用的叫子程序。在MCS-51系统中,子程序和主程序是相对的两个概念。主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行,不能“一去不回头”,那么回到什么地方呢?是回到调用子程序的下面一条指令地址处(称为断点地址)继续执行,此外子程序本身也可以调用另外的子程序,称为子程序嵌套,
2.子程序调用指令 有两种调用指令,即绝对调用和长调用指令。LCALLaddr16;长调用指令ACALLaddr11;短调用指令 这两条指令的区别在于调用子程序的目标地址范围不同,长调用指令的寻址范围是64KB,短调用的寻址范围是2KB,addr16和addr11都可以用标号代替。项目351单片机指令系统3.返回指令 有两种返回指令,即子程序返回和中断返回指令。
RET;子程序返回指令 这是子程序的最后一条指令。该指令的功能是恢复调用子程序时的断点地址,以便从子程序返回主程序继续执行。
RETI;中断返回指令 这也是子程序的最后一条指令,不过只是用于中断服务程序的末尾,以便从中断程序返回主程序继续执行。3.5.4空操作指令
NOP;PC←PC+1
这条指令不产生任何控制操作,只是将程序计数器PC的内容加1,。该指令在执行时间上要消耗1个机器周期,在存储空间上可以占用一个字节,常用来实现较短时间的延时。项目351单片机指令系统3.6位操作指令
位操作于字节操作不同,它是以位(bit)为单位进行的运算和操作,位操作指令的操作数是1“位”数据,其取值只能是0或1,故又称之为布尔变量操作指令。 位操作指令的操作对象是片内RAM的位寻址区(即20H-2FH)的128位和特殊功能寄存器SFR中的11个可位寻址的寄存器。MCS-51单片机的位操作指令可分为位传送、位置位与位清零、位逻辑运算和位的控制转移等。3.6.1位传送指令MOVC,bit;(bit)→CyMOVbit,C;(Cy)→bit
指令中的C即Cy。前一条指令的功能是,将位地址bit中的内容出送给PSW中的进位位Cy,后一条指令的位传送方向正好相反。项目351单片机指令系统3.6.2位状态设置指令 这类指令很简单,可以实现清零、置一等操作,操作数可以是进位位Cy,或是可以位寻址的位。SETBC;1→CySETBbit;1→bitCLRC;0→CyCLRbit;0→bit3.6.3位运算指令位运算就是进行逻辑运算,有与、或、非三种。ANLC,bit ;(Cy)∧(bit)→CyANLC,/bit;(Cy)∧→CyORLC,bit ;(Cy)∨(bit)→CyORLC,/bit;(Cy)∨→CyCPLC;→CyCPLbit;→bit项目351单片机指令系统3.6.4位控制转移指令
JCrel ;若(Cy)=1,则(PC)+2+rel→PC,程序转移执行
;若(Cy)=0,则(PC)+2→PC,程序顺序执行
JNCrel ;若(Cy)=0,则(PC)+2+rel→PC,程序转移执行
;若(Cy)=1,则(PC)+2→PC,程序顺序执行以上两条指令都是两个字节的相对转移指令,而且都是以Cy为转移的条件,前一条指令,若(Cy)=1,则程序转移执行,否则程序顺序执行。
JBbit,rel;若(bit)=1,则(PC)+3+rel→PC,程序转移执行
;若(bit)=0,则(PC)+3→PC,程序顺序执行
JNBbit,rel;若(bit)=0,则(PC)+3+rel→PC,程序转移执行
;若(bit)=1,则(PC)+3→PC,程序顺序执行
JBCbit,rel;若(bit)=1,则(PC)+3+rel→PC,程序转移执行且0→bit
这三条指令都是三字节的相对转移指令,第一条和第三条指令的基本功能相同,但是,后者在执行转移后还将bit位清零。项目351单片机指令系统演讲完毕项目4汇编语言程序设计
什么是程序设计?程序设计=结构+算法。 程序设计就像盖房子,数据结构就像砖、瓦,而算法就是设计图纸。你若想盖房子首先必须有原料(数据结构),但是这些原料不能自动地盖起了你想要的房子;你必须按照设计图纸(算法)上的说明一砖一瓦地去砌。这样你才能拥有你想要的房子。程序设计也一样,程序设计时你得按照程序规定的功能去编写,而程序的功能是实现就是算法的具体体现。所以通俗地说:你必须按照特定的规则,把特定的功能语句和基本结构按照特定的顺序排列起来,形成一个有特定功能的程序,这就是:程序设计=结构+算法。
一般说来,计算机程序设计语言种类很多,不仅有机器语言和汇编语言,还有很多高级语言。对单片机而言,通常使用汇编语言或C语言进行程序设计,程序较大时一般采用C语言编写,但用汇编语言编写的程序执行的效率较高。程序设计完成后,然后利用计算机或人工方法将汇编语言或C语言程序转化为单片机可以执行的机器语言。转换前的汇编语言或C语言程序被称为源程序,转换后的机器语言程序被称为目标程序,转换过程也叫汇编过程,通过计算机或人工转换的方法又被称为计算机汇编或手工汇编。计算机汇编要使用专门的软件,叫汇编软件。项目4汇编语言程序设计4.1源程序的编制4.1.1程序设计步骤在对单片机系统进行程序设计时,必须考虑硬件资源的配置,当硬件系统设计完成后,可以按照以下步骤进行程序设计。1.预完成任务的分析2.进行算法的优化3.绘制程序流程图4.分配资源5.编写源程序6.程序优化7.编译,调试,修改和最后确定源程序项目4汇编语言程序设计
用图形符号将总体设计思路及程序流向绘制在平面图上。从而使程序的结构关系直观明了,便于检查和修改,它直观清晰的体现了程序的设计思路,是程序设计的依据。 绘制流程图时,首先画出简单的功能流程图粗框图,再对功能流程图进行扩充和具体化,即对存储器标志位等单元做具体的分配和说明,把功能图上的每一个粗框图转化为具体的存储器或地址单元,从而绘制出详细的程序流程图。流线程序执行顺序流向线表示处理功能端点符号程序的开始和结束符号表示判断功能判断符号处理符号连接符号用来实现流程图之间的连接程序流程图的绘制项目4汇编语言程序设计4.1.2汇编语言源程序的格式 汇编语言源程序是由若干语句组成的,每一语句可由4个部分组成:标号、操作码、操作数及注释。每一部分间以不同的分隔符分隔,语句格式如下:
[标号]:操作码[目的操作数][源操作数];[注释]
其中[]项为可选项,视具体的指令选用.
标号是表示该语句所在地址的标志符号,使用标号可方便程序中的其他语句访问该语句。标号由字母打头的1-8个字母数字串组成,但指令保留符、寄存器名、位址记忆符、伪指令符等都不能作标号使用。操作码表示操作的性质,它是汇编指令中唯一不能缺省的部分。操作数表示操作的对象,在一条语句中,操作数可能是空白或以逗号分开的几个。注释是对语句或程序段功能的解释说明有助于的阅读和维护。项目4汇编语言程序设计4.1.3汇编语言源程序的汇编 将汇编语言源程序“翻译”成机器语言目标程序的过程称为汇编,对单片机助记符的汇编有两种方法:人工汇编和机器汇编。 人工汇编是用人工查表将源程序译成机器码。一般分为两步进行。第一步将源程序中的指令逐条译成目标码,指令中的标号地址待求。第二步由伪指令求出标号所代表的具体地址,进行有关程序存储区的数据操作并进行偏移量的计算。 机器汇编是将源程序输入计算机后,由汇编程序实现翻译工作,产生相应的机器码。这是一种非常高效和方便的方法。项目4汇编语言程序设计4.1.4伪指令 在机器汇编时,对汇编过程进行控制和指导的指令称为伪指令。在汇编过程中,伪指令供汇编程序识别和执行但不产生可执行的目标代码。如规定汇编生成的目标代码在ROM中的存放区域,给源程序符号、标号赋值,指示汇编结束等。每种汇编程序都有自己的伪指令,标准的MCS-51定义的伪指令常用的有以下7条。1.汇编其始地址伪指令——ORG(Origin)格式:ORG16位地址功能:规定该指令后的下一段源程序经汇编后生成的代码存放的起始地址。例如:ORG0500HSTART:MOVA,R0……
END ORG伪指令总是出现在每段源程序或数据块的开始,汇编语言源程序中多处使用ORG指令,可使程序员把子程序、数据块存放在ROM的任何位置。每当ORG出现时,下条指令的存放地址由此重新定位,所以ORG定义地址的顺序应有小到大,且不能重叠。项目4汇编语言程序设计2.汇编结束伪指令-END(EndofAssembly)指令格式:[标号]:END
功能:结束汇编语言源程序的操作。在源程序中只能有一条END,END后所写的指令,汇编程序不予处理。项目4汇编语言程序设计3.符号赋值伪指令——EQU(EQUate)
指令格式:字符名称EQU数或汇编符号功能:将一个数或特定的汇编符号赋给指定的字符名称。字符名称为一自定的符号,而不是标号,字符名称后无“:”。字符名称可用来作数据地址,立即数,位地址或者是一代码地址,其值可以是一个8位数,也可以是16位数。例如:TESTEQU20HMOVA,TEST
这里字符名称TEST就代表了内部RAM20H地址单元。又例如:A1EQU10HMOVA,A1这里A1代表片内RAM的直接地址单元10H。使用EQU伪指令可以把抽象的数字地址表示成有一定意义的符号,增强程序的可读性。项目4汇编语言程序设计4.定义数据字节伪指令——DB(DefineByte)
格式:[标号:]DB<项或项表> 项或项表是指一个字节,逗号隔开的8位二进制的数或字符串,或撇号’括起来的ASCII字符串。 功能:从标号指定的地址单元开始,在程序存储器中存入一组8位二进制数,或者将一个数据表格存入程序存储器。这条伪指令汇编后影响程序存储器的内容。例如:ORG1100HTAB:DB01H,04H,09H,10HDB00001111B,‘1’,‘A’,‘BC’项目4汇编语言程序设计5.定义数据字命令——DW(DefineWord)格式:[标号:]DW<项或项表>功能:DW的功能和DB类似,DW是从标号指定的地址开始存放16位而非8位二进制数,存放时,数据字的高8位在前(低地址),低8位在后(高地址)。例如:ORG5000HMOVA,#30H………ORG5020HADDTAB:DW1234H,100H,10………;
END
一条DB和DW语句定义的数表其数的个数不得超过80个。当数据的数目较多时,可使用多个定义命令。在MCS-51程序设计应用中,常以DW来定义地址。项目4汇编语言程序设计6.预留存储区伪指令——DS(DefineStorage)
格式:[标号:]DS<表达式> 功能:本命令用于从指定地址开始,保留DS之后表达式的值所需数目的字节单元作为存储区以备后用。汇编时,对这些单元不赋值。例如:ORG0100HMOVA,#50H………ADDRTABL:DS05HDB20HEND
从标号ADDRTABL代表的地址开始,保留5个连续的ROM地址单元,第6个单元存放20H。
对MCS-51单片机来说,DB,DW,DS伪指令只能对程序存储器使用,而不能对数据存储器进行初始化。项目4汇编语言程序设计7.位地址赋值伪指令——BIT
格式:[字符名称]BIT<位地址> 功能:本命令用于给字符名称赋以位地址。其中<位地址>可以是绝对地址,也可以是符号地址(即位符号名称)。例如:AQBITP1.0A2BIT07H
这两条指令分别把P1.0的位地址赋给变量AQ,位地址07H赋给符号名A2,在其后的编程中AQ和A2就可以作为位地址使用。项目4汇编语言程序设计4.1.5程序设计技巧1.模块化程序设计方法 单片机应用系统的程序一般由包含多个模块的主程序和各种子程序组成。每一程序模块都要完成一个明确的任务,实现某个具体的功能,如发送、接收、延时、打印、显示等。采用模块化的程序设计方法,就是将这些不同的具体功能程序进行独立的设计和分别调试,最后将这些模块程序装配成整体程序并进行联调。项目4汇编语言程序设计
把一个多功能的、复杂的程序划分为若干个简单的、功能单一的程序模块的程序设计方法具有明显的优点:1)单个模块结构的程序功能单一,易于设计、编写、调试及修改;2)有利于程序的优化和分工,从而可使多个程序员同时进行程序的编写和调试,加快软件研制进度;3)提高了程序的阅读性和可靠性,使程序的结构层次一目了然,同时4)对程序的修改可局部进行,其他部分可以保持不变,便于功能扩充和版本升级;5)对于使用频繁的子程序可以建立子程序库,便于多个模块调用。项目4汇编语言程序设计
模块的划分有很大的灵活性,但也不能随意划分。划分时应遵循下述原则:1)每个模块应具有独立的功能,能产生一个明确的结果,这就是单模块的功能高内聚性。2)模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换(传递)方式、交换量的多少及交换的频繁程度。3)模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,信息交换太频繁,因而也不合适。项目4汇编语言程序设计2.程序设计技巧1)尽量采用循环结构和子程序。2)尽量少用无条件转移指令。3)对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出)进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡。一般不必把标志寄存器压入堆栈。4)对于中断处理子程序除了要保护程序中用到的寄存器外,还应保护标志寄存器。5)累加器是信息传递的枢纽。项目4汇编语言程序设计4.2程序结构4.2.1顺序程序 顺序结构是按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止,无分支,也无循环。顺序结构是所有程序设计中最基本、最单纯的程序结构形式,在程序设计中使用最多,因而是一种最简单且应用最普遍的程序结构。一般实际应用程序远比顺序结构复杂得多,但它是组成复杂程序的基础和主干。项目4汇编语言程序设计【例4.1】将两个半字节数合并成一个一字节数。 设内部RAM40H、41H单元中分别存放着8位二进制数。要求取出两个单元的低半字节,合并成一个字节后,存入42H单元。开始(40H)内容送A,屏蔽高位A与R1或后送入(42H)交换高低位,送入R1(41H)内容送A,屏蔽高位返回图4-1例1程序流程图项目4汇编语言程序设计【例4.2】用顺序结构程序编写三字节无符号数的加法程序。设被加数存放在:40H(高字节),41H(中字节),42H(低字节)
加数存放在:43H(高字节),44H(中字节),45H(低字节)
运算结果仍存在被加数单元中。开始取低字节数据返回相加后送回被加数单元取中字节数据带进位位相加后送回被加数单元取高字节数据带进位位相加后送回被加数单元图4-2例2程序流程图项目4汇编语言程序设计4.2.2分支程序 通常,单纯的顺序结构程序只能解决一些简单的算术、逻辑运算,或者简单的查表、传送操作等。实际问题一般都是比较复杂的,总是伴随有逻辑判断或条件选择,要求计算机能根据给定的条件进行判断,选择不同的处理路径,从而表现出某种智能。 根据程序要求改变程序执行顺序,即程序的流向有两个或两个以上的出口,根据指定的条件选择程序流向的程序结构我们称为分支程序结构。 通常根据分支程序中出口的个数分为单分支结构程序(两个出口)和多分支结构程序(三个或三个以上出口)。 在MCS-51指令系统中,通过条件判断实现单分支程序转移的指令有JZ、JNZ、CJNE和DJNZ等。此外,还有以位状态为条件,进行程序分支的指令JC、JNC、JB、JNB和JBC等。使用这些指令,可以完成或为0、1,或为正、为负,以及相等、不相等各种条件判断,以实现程序有条件地转移。项目4汇编语言程序设计1.两分支程序设计【例4.3】两个无符号数比较(两分支)。内部RAM的30H单元和31H单元各存放了一个8位无符号数,请比较这两个数的大小,大数放在32H中。开始X-YCy=1?30H→32H31H→32HYN结束4-3两数比较流程图项目4汇编语言程序设计2.三分支程序设计【例4.4】两个无符号数比较(三分支程序)。内部RAM的20H单元和30H单元各存放了一个8位有符号数,根据下列条件编程点亮相应的发光二极管,电路如图4-4所示,。若(20H)=(30H),则P2.0管脚连接的黄色LED发光;若(20H)>(30H),则P2.1管脚连接的绿色LED发光;若(20H)<(30H),则P2.2管脚连接的红色LED发光。开始X=Y?X>Y?黄灯点亮YN结束NY红灯点亮绿灯点亮项目4汇编语言程序设计3.散转程序 散转程序是指经过某个条件判断之后,程序有多个流向(三个以上)。MCS-51单片机指令系统中专门提供了散转指令,使得散转程序的编制更加简洁。 【例4.5】在例4.4的电路的基础上加两个开关组成简单的信号灯电路,如图4-6所示,试编程实现以下功能。K0K10 0 都按下,红黄绿灯全亮(状态1)0 1 K0单独按下,红灯亮(状态2)1 0K1单独按下,绿灯亮(状态3)1 1 都未按下,黄灯亮(状态4)项目4汇编语言程序设计开始读P1口引脚状态→A转移指令表基地址→DPTR屏蔽无关位散转移状态1状态2状态3状态4返回返回返回返回项目4汇编语言程序设计4.2.3循环程序 循环结构程序是把需要多次重复使用的程序段,利用转移指令反复转向该程序段,从而大大缩短程序代码,减少占用程序空间,程序结构也大大优化。循环程序可以分为单重循环和多重循环,其通常有两种编制方法:一种是先执行后判断,另一种是先判断后执行。如图4-8所示。开始初始化循环处理循环控制循环完成?NY循环结束结束开始初始化循环控制循环完成?NY循环结束结束循环处理项目4汇编语言程序设计1.单重循环程序设计 【例4.6】数据极值查找程序。设内部RAM从30H单元开始存放有8个数,找出其中最大的数,放到60H单元。 解:极值查找操作的主要内容是进行数值大小比较。假定在比较过程中,以A存放大数,与之逐个比较的另一个数放在50H单元。采用先执行后判断的结构,首先设定比较次数,在比较结束后,把查找到的最大数送到60H单元。程序流程图如图4-9所示。开始数据区首地址→R0读下一个数→50H(50H)→A(A)>(50H)?NYA→(60H)结束数据个数→R7读第一个数→AR7-1→R7R7-1=0?NY项目4汇编语言程序设计
【例4.7】将内部RAM中30H单元开始的数据传送到外部RAM1200H开始的存储空间内,直到发现数据‘100’停止传送。开始A=100?取内部RAM数据→AYN结束传送数据到外部RAM图4-10例4.7流程图解:由于循环次数事先不知道,但是循环条件可以测试到,可以采用先判断后执行的程序结构。流程图如图4-10所示。开始A=100?取内部RAM数据→AYN结束传送数据到外部RAM图4-10例4.7流程图项目4汇编语言程序设计2.多重循环程序设计—定时程序 在循环内套循环的程序结构称多重循环,或称循环嵌套。若把每重循环的内部看作一个整体,则多重循环的结构与单重循环的结构是一样的,也由四部分组成。 多重循环的执行过程是从内向外逐层展开的。内层执行完全部循环后,外层则完成一次循环,逐次类推。因此,每执行一次外层循环,内层必
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 传感器与检测技术第5章电容式传感器
- 2026年医药行业社会责任实践与品牌形象研究报告001
- 2026年保洁服务行业市场潜力研究报告
- 2026年冷链保鲜技术行业政策法规研究报告
- 2026年云计算行业政策环境与市场前景报告
- 2026年环保产业投资策略及市场潜力分析报告
- 2026年家居建材行业研究报告及绿色环保趋势
- 2027届山东省青岛李沧、平度、西海岸、胶州中考适应性考试物理试题含解析
- 2026年井控工艺考试模拟试卷带答案
- 2026年计算机等级考试模拟试卷及参考答案
- 2026健康管理师考试理论知识真题及答案
- 2026年《中国高血压防治临床管理指南(2026版)》
- 银行网点消防安全实操培训
- 2026年四川省成都市技能人才评价考评员考试题库(附答案)
- 2026年宁波银行秋招试题及答案
- 2025-2026学年甘肃省兰州市五校联考八年级上册期中考试物理试卷 含答案
- 《城市体检工作手册》(试行)
- 2025年事业单位内部审计题库(含答案)
- 2025江南大学辅导员招聘考试真题
- 2026年版《中华人民共和国药品管理法实施条例》学习与解读课件
- 雨课堂学堂在线学堂云《舰载机结构与系统(中国人民解放军海军航空)》单元测试考核答案
评论
0/150
提交评论