C51单片机的软件基础.ppt
*,1,4.1 80C51单片机的指令系统,4.1.1 指令格式一条汇编语言指令中最多包含4个字段,其格式为:标号:操作码 目的操作数,源操作数;注释例:LOOP:ADD A,10H;A(A)+10H,根据设计使某台计算机具有的指令的集合便构成了这一计算机的指令系统。80C51系列单片机的指令系统共有111条指令。,*,2,1.标号标号是用户定义的一个符号,表示指令或数据的存储单元地址。标号由以英文字母开始的18个字母或数字串组成,以冒号“:”结尾。不能用指令助记符、伪指令或寄存器名来做标号。一旦使用了某标号定义一地址单元,在程序的其它地方就不能随意修改这个定义,也不能重复定义。一条指令中的标号代表该指令所存放的第一个字节存储单元的地址,故标号又称为符号地址,在汇编时,把该地址赋值给该标号。,*,3,2.操作码操作码是用英文缩写的指令或伪指令功能助记符,用来表示指令的性质或功能。如MOV表示传送操作,ADD表示加法操作。,*,4,3.操作数操作数字段给出参与操作的数据或数据所在单元的地址。操作数字段的内容复杂多样,它可能为以下几种情况之一:(1)工作寄存器名(2)特殊功能寄存器名(3)标号名(4)常数(5)$(6)表达式,*,5,(1)工作寄存器名由PSW.3和PSW.4规定的当前工作寄存器区中的R0R7都可以出现在操作数字段中。(2)特殊功能寄存器名8051中的21个特殊功能寄存器的名字都可以作为操作数使用。(3)标号名可以在操作数字段中引用的标号包括:赋值标号:由汇编伪指令EQU等赋值的标号可以作为操作数。指令标号:指令标号虽未被赋值,但这条指令的第一字节地址就是这个标号的值,在以后指令操作数字段中可以引用。,*,6,(4)常数为了方便用户,汇编语言指令允许以各种数制表示常数,即常数可以写成二进制、十进制或十六进制等形式。(5)$操作数字段中还可以使用一个专门符号“$”,用来表示程序计数器的当前值。这个符号最常出现在转移指令中,如“SJMP$”,该指令表示继续执行该指令,在原地循环。,*,7,(6)表达式 汇编程序允许把表达式作为操作数使用。在汇编时,计算出表达式的值,并把该值填入目标码中。例如:MOV A,SUM+l。,*,8,4.1.2 指令系统的寻址方式寻找操作数所在单元的地址称为寻址;确定操作数所在单元地址的方法称为寻址方式。80C51单片机指令系统中的寻址方式共有七类,分别为立即寻址、寄存器寻址、寄存器间接寻址、直接寻址、变址寻址、相对寻址、位寻址。,*,9,1.立即寻址操作数就跟在操作码的后面,可以立即参与指令所规定的操作,不须另去寄存器或存储器等处寻找和取数。例:MOV A,#30H;A30H MOV DPTR,#2000H;DPTR2000H书写单片机指令时,为了辨识是立即数,规定在它的前面加一个“#”号作为前缀。,*,10,2.寄存器寻址 寻址某工作寄存器,自该寄存器读取或存放操作数,以完成指令所规定的操作。例 MOV R3,A;R3(A)ADD A,R2;A(A)+(R2)可以寻址的寄存器种类有工作寄存器R0R7、累加器A、寄存器B、数据指针DPTR、位累加器Cy。,*,11,3.寄存器间接寻址寄存器中存放的是地址而不是操作数,寻找到该工作寄存器后,以其内容为地址,去寻找所指的RAM单元以读取或存放操作数,称为寄存器间接寻址。例 设R1的内容为40H,则MOV A,R1;A片内RAM(40H)的内容。,图4-1 MOV A,R1指令执行过程,A,1AH,*,12,4.直接寻址直接给出操作数所在的存储单元地址,以供寻址取数或存放的寻址方式称为直接寻址。对于80C51系列单片机,直接寻址可用于访问程序存储器,也可用于访问数据存储器。,*,13,5.变址寻址(或称基址加变址寄存器间接寻址)这种寻址方式只用于访问程序存储器,当然只能读取,不能存放,它主要用于查表性质的访问。以程序计数器PC或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,把它们的和作为程序存储器的地址,再寻址该单元,读取数据。,指令 MOVC A,A+DPTR MOVC A,A+PC,*,14,例如:MOVC A,A+DPTR;A(A)+(DPTR)设(A)=10H,(DPTR)=2000H,程序存储器的(2010H)=36H,则上面语句的功能是将A的内容与DPTR的内容相加,形成操作数的地址2010H,把该地址中的数据传送到累加器A。即(DPTR)+(A)A。结果(A)=36H。,图4-2 MOVC A,A+DPTR的执行示意图,*,15,6.相对寻址在相对转移指令中采用相对寻址方式,在指令的操作数部分给出地址的相对偏移量。相对偏移量为一个带符号的8位二进制数。将相对转移指令所在的地址称为源地址;转移后的地址称为目的地址。目的地址=源地址+转移指令字节数+相对偏移量。,*,16,例 SJMP 50H设指令所在PC值为2000H,而指令的机器码为2字节80H、50H,则转移去的地址=2000H+02H+50H=2052H,故指令执行后,PC的值变为2052H,程序下一次执行的地址为2052H。在实际编程中,往往已知源地址和目的地址,从而计算偏移量。在80C51中,常用“rel”表示为相对偏移量。rel计算方法:rel=目的地址(源地址+转移指令字节数),*,17,7.位寻址80C51单片机设有独立的位处理器(布尔处理器),位寻址时,可以对内部RAM和特殊功能寄存器的某些位寻址单元进行寻址。区分位地址与字节地址的方法:主要看是位操作指令还是其它指令,若为位操作指令,则操作数中的地址一定是位地址,反之则为字节地址。例:SETB 30H;(30H)1,*,18,寻址方式总结:,MCS-51系统的各寻址方式对应不同的存储器空间,使用时要特别注意在各种不同的存储器中采用什么寻址方式。,*,19,片内数据存储器,1.直接寻址方式2.间接寻址方式3.位寻址,1.直接寻址方式2.位寻址,间接寻址方式,*,20,4.1.3 指令系统80C51系列单片机的指令系统包括数据传送、算术运算、逻辑运算、控制转移、位操作五大类指令。分类介绍指令之前,先介绍描述指令的一些符号的意义。Rn:表示通用寄存器R0R7。Ri:表示通用寄存器中可间接寻址(即用做8位地址指针)的寄存器R0和R1。#data8:表示8位立即数。#data16:表示16位立即数。,*,21,direct:表示8位片内RAM或SFR区的直接地址。addr16/addr11:表示外部程序寄存器的16位或11位地址。rel:表示8位偏移量。bit:表示直接位地址。:间接寻址寄存器或基址寄存器的前缀,如Ri,DPTR/:位操作数的前缀,表示对该位取反。(X):X中的内容。(X):由X寻址的单元中的内容。:指令操作流程,将箭头右边的内容送入箭头左边的单元,*,22,共29条,是使用最频繁的一类指令,通用格式如下:MOV 目的操作数,源操作数;目的操作数 源操作数 属“复制”性质,而不是“搬家”数据传送类指令不影响标志位:Cy、Ac和OV,但影响奇偶标志位P。,1 数据传送类指令,*,23,1数据传送到累加器A的指令 MOV A,#data;Adata MOV A,Rn;A(Rn)MOV A,Ri;A(Ri)MOV A,direct;A(direct)功能:把源操作数的内容送入累加器A。例如:MOV A,#10H,该指令执行时将立即数l0H送入累加器A中。该操作影响PSW的P标志位。,*,24,2.数据传送到工作寄存器Rn的指令 MOV Rn,#data;Rndata MOV Rn,direct;Rn(direct)MOV Rn,A;Rn(A)功能:是把源操作数的内容送入当前一组工作寄存器区的R0R7中的某一个寄存器。指令中Rn在内部数据存储器中的地址由当前的工作寄存器组选择位RS1、RS0确定,可以是00H07H、08H0FH、10H17H、18H1FH。,*,25,(3)数据传送到直接地址的指令 MOV direct,A;(A)direct MOV direct,Rn;(Rn)direct,n=07 MOV direct1,direct2;MOV direct,Ri;(Ri)direct MOV direct,#data;#datadirect功能:把源操作数送入直接地址指出的存储单元。direct指的是内部RAM或SFR的地址。,*,26,(4)数据传送到间接地址的指令 MOV Ri,#data;(Ri)data MOV Ri,direct;(Ri)(direct)MOV Ri,A;(Ri)(A)功能:把源操作数的内容送入由间接地址Ri所指的片内RAM单元中。,*,27,(5)16位数传送指令 MOV DPTR,#data16;#data16DPTR 唯一的16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。,*,28,设片内RAM30H单元的内容为40H,设片内RAM40H单元的内容为10H,片内RAM10H单元的内容为00H,(P1)=0CAH,请写出下列指令执行后的结果。解:MOV R0,#30H;R030H MOV A,R0;A40H MOV R1,A;R140H MOV B,R1;B10H MOV R0,P1;30H 0CAH MOV P3,P1;P30CAH MOV 10H,#20H;10H20H MOV 30H,10H;30H20H,*,29,(6)累加器A与外部数据存储器传送指令,MOVX A,DPTR;A(DPTR),且使RD=0MOVX A,Ri;A(Ri),且使RD=0MOVX DPTR,A;(DPTR)(A),且使WR=0MOVX Ri,A;(Ri)(A),且使WR=0,*,30,(7)程序存储器内容送累加器A指令,该类指令采用变址寻址方式,把程序存储器(ROM或EPROM)中存放的表格数据读出,传送到累加器A。它共有两条单字节指令,指令操作码助记符为MOVC。,*,31,设程序存储器中数据与图4-4相同,执行以下程序:1000H:MOV A,#10H 1002H:MOV DPTR,#1000H 1005H:MOVC A,A+DPTR,图4-4 程序存储器的一组数据表格,结果为:(A)=02H,(R0)=02H,(PC)=1004H。,;A10H,查表的偏移量;DPTR1000H,查表的偏移量;A(10H+1000H),*,32,例:,已知(A)=30H,(B)=40H,执行下列指令后,堆栈内容如何变化?MOV SP,#60HPUSH A PUSH B,堆栈工作示意图,;SP(SP)十1,(SP)(A),;SP(SP)十1,(SP)(B),;SP60H,进栈指令或压入指令,PUSH direct;SP(SP)十1,(SP)(direct),(8)堆栈操作指令,*,33,出栈指令或弹出指令,POP direct;(direct)(SP);SP(SP)-1,例:,执行下列两条弹出指令后,堆栈内容如何变化?MOV SP,#60HPUSH A PUSH BPOP A POP B,堆栈工作示意图,;A(SP),SP(SP)-1,;B(SP),SP(SP)-1,*,34,(9)交换指令,XCH A,Rn XCH A,Ri XCH A,direct XCHD A,Ri SWAP A,前三条XCH指令是将A的内容和源操作数内容互换,XCHD是将A的低4位和(Ri)所指出的内部RAM单元的低4位互换,最后一条SWAP指令是将A的高4位与低4位之间进行交换。,*,35,2 算术操作类指令,算术操作类指令有24条,4种基本操作:加、减、乘、除。,算术操作指令的执行将影响程序状态字PSW的3个标志位:,3个标志除特别指出外,服从以下规则:操作结果在最高位有进位输出(加法时)或借位输入(减法时),Cy=1;否则;Cy=0。操作结果的低4位有进位输出(加法时)或有向高4位的借位(减法时),Ac=1;否则;Ac=0。溢出标志OV满足逻辑关系式OV=C6C7。,*,36,(1)加法指令1)不带进位位的加法指令,指令格式 功能 ADD A,Rn;A(A)+(Rn)ADD A,direct;A(A)+(direct)ADD A,Ri;A(A)+(Ri)ADD A,#data;A(A)+data,说明:(1)相加过程中各标志变化符合规则要求;(2)无符号数相加,和的溢出与Cy置位是统一的;带符号数相加,和的溢出是指和+127或-128,另用OV置位来表示。,*,37,例 累加器内容为53H,R0内容为FCH。执行指令 ADD A,R0后,(A)=?(PSW)中有关各位=?,(A)=4FH,Cy=1,Ac=0,OV=0,P=1。,*,38,2)带进位位的加法,指令格式 功能 ADDC A,Rn;A(A)+(Rn)+(Cy)ADDC A,direct;A(A)+(direct)+(Cy)ADDC A,Ri;A(A)+(Ri)+(Cy)ADDC A,#data;A(A)+data+(Cy),说明:(1)Cy值是指指令开始执行时的进位标志值,而不是相加过程中产生的值;(2)带进位加法指令主要用于多字节的加法运算中。,*,39,3)加1指令,指令格式 功能 INC A;A(A)+1 INC Rn;Ri(Rn)+1 INC Ri;(Rj)(Ri)+1 INC direct;direct(direct)+1 INC DPTR;DPTR(DPTR)+1,说明:(1)与加法小类指令不同,加1小类指令执行后不影响标志位。(2)INC DPTR是唯一的16位数算术运算指令。(3)加1指令用途广泛,例可以用来修改操作数的地址,以便使用间址指令。,*,40,4)累加器内容十进制调整指令,DA A 说明:(1)该指令可使加法运算所得存于累加器A中的和进行十进制调整。执行的具体操作是:低半字节的值9或Ac为1时低半字节加6;高半字节的值9或Cy为1时高半字节加6。(2)这一指令专门配用于BCD码加法运算(3)十进制调整指令执行的结果根据有无进位将使进位位相应置位或复位。,*,41,(A)=01H,C=1,相当于十进制数101。,例 作加法后,(A)=9BH,C=0,Ac=0 则执行DA A后,A和C的内容为多少?,*,42,1)带借位减法指令,指令格式 功能 SUBB A,Rn;A(A)-(Rn)-(Cy)SUBB A,direct;A(A)-(direct)-(Cy)SUBB A,Ri;A(A)-(Ri)-(Cy)SUBB A,#data;A(A)-data-(Cy),说明:(1)减法指令只有一组带借位的减法指令,没有不带借位的减法指令。若要进行不带借位的减法操作,则在减法之前,要先用指令使Cy清零,即使Cy=0;然后再相减。(2)减法指令执行后按规则影响标志位。,(2)减法指令,*,43,例 设(A)=52H,(R0)=B4H,Cy=0,则执行指令SUBB A,R0后,(A)=?(PSW)中有关位=?,结果(A)=9EH,C=1,Ac=1,OV=1,P=1,*,44,2)减1指令,指令格式 功能 DEC A;A(A)-1 DEC Rn;Rn(Rn)-1 DEC Ri;(Ri)(Ri)-1 DEC direct;direct(direct)-1,说明:与减法小类指令不同,减1小类指令执行后不影响 标志位。,*,45,说明:单字节指令。但执行时间要4个机器周期,与下面的除法指令相同,是指令系统中执行时间最长的两条指令。该指令可使放在累加器A和寄存器B中的两个待乘数相乘,乘法的结果为16位,高8位存放于B中,低8位在A中。指令执行后将影响三个标志位:C、OV、P,C复位,当乘积(B)=0时,OV=0,否则OV=1,P按A中1的个数的奇偶性确定。,(3)乘法指令,MUL AB;BA(A)(B),*,46,说明:该指令可使放在累加器A中的被除数,与寄存器B中的除数相除,商数在A,余数在B中。指令执行后将影响标志位,当B中的原始值为零,即除数为零时,除法没有意义,A、B中的数不定,溢出标志OV置1,其余情况,OV都清零;进位标志C始终都为零,P按A中1的个数的奇偶性确定。,(4)除法指令,DIV AB;(A)(B),商数在A,余数在B,*,47,3.逻辑操作类指令,逻辑操作类指令有24条,包括简单逻辑操作指令、与指令、或指令、异或指令等4小类。,(1)简单逻辑操作与移位指令,*,48,例:设(A)=5AH、C=1,问下列指令执行后,(A)=?则执行指令 CPL A后,执行指令 CLR A后,执行指令 RL A后,执行指令 RR A后,执行指令 RLC A后,执行指令 RRC A后,,(A)A5H;(A)0;(A)B4H;(A)2DH;(A)B5H,(A)ADH,,*,49,(2)逻辑与指令,指令格式 功能 ANL A,Rn;A(A)(Rn)ANL A,direct;A(A)(direct)ANL A,Ri;A(A)(Ri)ANL A,#data;A(A)data ANL direct,A;direct(direct)(A)ANL direct,#data;direct(direct)data,说明:(1)逻辑与运算以及其它逻辑运算均是按位进行的。(2)逻辑与运算除了可以用累加器为目的操作数外,还有两条以直接地址单元为目的操作数的指令,这样就很便于对各个特殊功能寄存器的内容按需要进行变换。,*,50,例:MOV A,#35H;A 35H ANL A,#0FH;A(A)0FH,即(A)=05H,例:清除A.3、A.4、A.5、A.6,ANL A,#10000111B,*,51,(3)逻辑或指令,指令格式 功能 ORL A,Rn;A(A)(Rn)ORL A,direct;A(A)(direct)ORL A,Ri;A(A)(Ri)ORL A,#data;A(A)data ORL direct,A;direct(direct)(A)ORL direct,#data;direct(direct)data,说明:与、或逻辑运算指令结合在一起,将更便于对RAM单元的内容进行变换,特别是对特殊功能寄存器的内容进行变换。,*,52,例:使A.3、A.4、A.5、A.6 置,例:要选用工作寄存器3组,请采用三种不同的指令实现之。,解:(1)SETB PSW.4 SETB PSW.3(2)ORL PSW,#18H(3)MOV PSW,#18H,ORL A,#01111000B,*,53,(4)逻辑异或指令,指令格式 功能 XRL A,Rn;A(A)(Rn)XRL A,direct;A(A)(direct)XRL A,Ri;A(A)(Ri)XRL A,#data;A(A)data XRL direct,A;direct(direct)(A)XRL direct,#data;direct(direct)data,0 0=0 0 1=1 1 0=1 1 1=0,*,54,例:使A.3、A.4、A.5、A.6 取反。,例:使A内容取反。,XRL A,#01111000B,XRL A,#11111111B,*,55,4.控制转移类指令,80C51有17条程序转移指令:,无条件转移指令,条件转移指令,子程序调用,返回指令,有了丰富的程序转移类指令,就能很方便地实现程序的向前、向后跳转,并根据条件分支运行、循环运行、调用子程序等。,空操作指令,*,56,(1)无条件转移指令,1)长转移(64KB地址内)指令 LJMP addr16,2)绝对转移(2KB地址内)指令 AJMP addr11,3)相对短转移(-128B+127B地址内)指令 SJMP rel,4)变址方式的转移(64KB地址内)指令 JMP A十DPTR,指令中用到的符号含义:addr16:16位地址,可以为16位二进制数,常写为四位十六进制数,也可以用符号地址来代真。addr11:11位地址,是16位地址的低11位,可以为四位十六进制数,也可以是代表16位地址的标号。rel:8位带符号数,是相对转移地址的偏移量,也可以用一个标号来表示,此时只表示所要转移到的目的地址,并应据此算出实际偏移量。,*,57,4条无条件转移指令提供了不同的转移范围和寻址方式:LJMP addr16;PC addr16,02 addr 158 addr 70 AJMP addr11;PC(PC)+2,(PC)100 addr11 addr108 00001 addr70 SJMP rel;PC(PC)+2+rel,80 rel JMP A+DPTR;PC(A)+(DPTR),73,*,58,1 长转移指令LJMP addr16;(PC)addr16,02 addr 158 addr 70,例如:在程序存储器0000H单元存放一条指令:LJMP 3000H;,1000H 02 30 00(PC)3000H则上电复位后程序将跳到3000H 单元去执行用户程序。,*,59,2 绝对转移指令AJMP addr11;(PC)(PC)+2,(PC)100 addr11 addr108 00001 addr70,该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址PC值加上该指令字节数 2,构成当前PC值。取当前PC值的高 5 位与指令中提供的 11 位直接地址形成转移的目的地址,即:,它的机器代码是由 11 位直接地址addr11和指令特有操作码 00001,按下列分布组成的:,*,60,例如:若AJMP指令地址(PC)=2300H2300H 01 FF AJMP 0FFH;(PC)(PC)+2=2302H(PC)100 00011111111 结果为:转移目的地址(PC)=20FFH,程序向前转向 20FFH单元开始执行。,又如:若AJMP指令地址(PC)=2FFFH。执行指令:2FFFH 01 FF AJMP 0FFH;(PC)(PC)+2=3001H,(PC)100 00011111111 结果为:转移目的地址(PC)=30FFH,程序向后转向 30FFH单元开始执行。,*,61,3.相对短转移(-128+127地址内)指令,SJMP rel,说明:(1)此转移指令是两字节。,(2)指令进行的操作为:PC(PC)+2,PC(PC)+rel,(3)rel计算方法:rel=目的地址-(源地址+2),*,62,4.变址方式的转移(64KB地址内)指令 JMP A+DPTR;PC(A)+(DPTR),73,它是以数据指针DPTR的内容为基址,以累加器A的内容为相对偏移量,在 64 KB范围内可无条件转移的单字节指令。该指令的特点是转移地址可以在程序运行中加以改变。,例:已知累加器A的内容为0、2、4、6、8五个偶数中的一个,标号TAB的地址为1800H,试剖析下列程序段的执行结果:MOV DPTR,TAB;表首址送DPTR JMP A+DPTR;依据A值转移 TAB:AJMP 100H;当(A)=0时转1900H执行 AJMP 200H;当(A)=2时转1A00H执行 AJMP 300H;当(A)=4时转1B00H执行 AJMP 400H;当(A)=6时转1C00H执行 AJMP 500H;当(A)=8时转1D00H执行,*,63,(2)累加器判零条件转移指令,JZ rel;若(A)=0,则PC(PC)+2+rel 若(A)0,则PC(PC)+2JNZ rel;若(A)0,则PC(PC)+2+rel 若(A)=0,则PC(PC)+2,例:将外部数据存储器的一个数据块传送到内部数据RAM,两者的首地址分别为2000H和40H,遇到传送的数据为零时为止。,*,64,MOV DPTR,2000H;外部数据块首址送R0 MOV R1,40H;内部数据块首址送R1LOOP:MOVX A,DPTR;取外部RAM数据入AHERE:JZ HERE;数据为零则终止传送 MOV R1,A;数据传送至内部RAM单元 INC R0;修改地址指针,指向下一数据地址 INC R1 SJMP LOOP;循环取数,*,65,2 比较条件转移指令,比较转移指令共有 4 条,其一般格式为:CJNE 目的操作数,源操作数,rel 这组指令是先对两个规定的操作数进行比较,根据比较的结果来决定是否转移到目的地址。,具体操作为:若目的操作数=源操作数,则(PC)(PC)+3;若目的操作数源操作数,则(PC)(PC)+3+rel,C=0;若目的操作数源操作数,则(PC)(PC)+3+rel,C=1;,*,66,3 减1条件转移指令,DJNZ direct,rel;(direct)(direct)-1,D5 direct rel 若(direct)0,则 PC(PC)+3+rel 否则,PC(PC)+3DJNZ Rn,rel;(Rn)(Rn)-1,D8DF rel 若(Rn)0,则 PC(PC)+2+rel 否则,PC(PC)+2,该指令把减1功能与条件转移指令结合在一起。,*,67,例 3:将内部RAM中从30H单元开始的 10 个无符号数相加,相加结果送40H 单元保存。,解:设相加结果不超过8位二进制数,则相应的程序如下:MOV R0,0AH;给 R0 置计数器初值 MOV R1,30H;数据块首址送R1 CLR A;A清零LOOP:ADD A,R1;加一个数 INC R1;修改地址,指向下一个数 DJNZ R0,LOOP;R0 减 1,不为零循环 MOV 40H,A;存 10 个数相加和,*,68,(5)子程序调用及返回指令,子程序调用有长调用指令LCALL和绝对调用指令ACALL两条(1)长调用指令 LCALL addr16;(PC)(PC)+3,12 addr 158 addr 70 SP(SP)+1,(SP)(PC 70)SP(SP)+1,(SP)(PC 158)PC addr 150,在主程序中,有时需要反复执行某段程序,通常把这段程序设计成子程序,用一条子程序调用指令,将程序转向子程序的入口地址。,*,69,(2)绝对调用指令 ACALL addr11;(PC)(PC)+2,addr 108 10001 addr 70 SP(SP)+1,(SP)(PC 70)SP(SP)+1,(SP)(PC 158)(PC)100 addr11 LCALL和ACALL指令类似于转移指令LJMP和AJMP,不同之处在于它们在转移前要把执行完该指令的PC内容自动压入堆栈后,才将addr16(或addr11)送往PC,即把子程序的入口地址装入PC。,*,70,ACALL与AJMP一样提供 11 位目的地址。由于该指令为两字节指令,所以执行该指令时(PC)+2(PC)以获得下一条指令的地址,并把该地址压入堆栈作为返回地址。该指令可寻址 2 KB,只能在与PC同一2 KB 的范围内调用子程序。执行该指令不影响标志位。例如:设:(SP)=30H,标号为SUB1 的子程序首址在2500H,(PC)=3000H。执行指令:3000H:12 25 00 LCALL SUB1;3003H:,结果为:(SP)=32H,(31H)=03H,(32H)=30H,(PC)=2500H。,*,71,返回指令共有两条:一条是对应两条调用指令的子程序返回指令RET;另一条是对应从中断服务程序的返回指令RETI。3)子程序返回指令 RET;PC158(SP),SP(SP)1,22 PC70(SP),SP(SP)1 4)中断返回指令 RETI;PC158(SP),SP(SP)1,32 PC70(SP),SP(SP)1,RETI与RET的区别是清除中断优先级状态标志位。,*,72,(6)空操作指令 NOP;(PC)(PC)+1,00 空操作指令是一条单字节单周期指令。它控制CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志,故称为空操作指令。但由于执行一次该指令需要一个机器周期,所以常在程序中加上几条NOP指令用于设计延时程序,拼凑精确延时时间或产生程序等待等。,*,73,5 位操作类指令,MCS-51有一个位处理机(或称布尔处理机),可以位寻址,进位位C起一般CPU中累加器的作用,并有自己的指令系统,执行位操作(或称位处理)的指令多达17条。,位传送指令,位变量修改指令,位逻辑操作指令,位控制转移指令,*,74,52子系列的RAM编址图,位地址见课本63与64页,*,75,(1)位传送指令,MOV C,bit;C(bit)MOV bit,C;bit(C),说明:其中bit 为内部RAM中的可位寻址位的位地址或特殊功能寄存器中的位地址。,*,76,例:将30H位的内容传送到20H位。传送可以通过C来进行,但要注意保持原有的C值不被破坏。,MOV 10H,C;暂存C内容 MOV C,30H;C(30H)MOV 20H,C;(20H)C MOV C,10H;C(10H),*,77,(2)位变量修改指令,CLR C;C0 CLR bit;bit0 SETB C;C1 SETB bit;bit1,*,78,(3)位逻辑操作指令,ANL C,bit;C(C)(bit)ANL C,/bit;C(C)(bit)ORL C,bit;C(C)(bit)ORL C,/bit;C(C)(bit)CPL C;C(C)CPL bit;bit(bit),指令系统中没有位异或指令,位异或操作可由若干条位操作指令来实现。,*,79,(4)位变量条件转移指令,JC reL;若(Cy)=1,转移,PC(PC)+2+rel 否则顺序执行,PC(PC)+2 JNC reL;若(Cy)=0,转移,PC(PC)+2+rel 否则顺序执行,PC(PC)+2,说明:此两条指令常常和比较转移指令CJNE指令一起使用。,1)以Cy内容为条件的转移指令,*,80,2.以位地址内容为条件的转移指令,JB bit,reL;若(bit)=1,转移,PC(PC)+3+rel 否则顺序执行,PC(PC)+3 JNB bit,reL;若(bit)=0,转移,PC(PC)+3+rel 否则顺序执行,PC(PC)+3 JBC bit,reL;若(bit)=1,转移,PC(PC)+3+rel,并使该位清0,否则顺序执行,PC(PC)+3,*,81,6.伪指令 汇编语言必须通过汇编器的处理,才能转换为计算机能识别和执行的机器语言。伪指令不是真正的指令,仅给汇编器提供一些信息。51单片机汇编器常用的伪指令有ORG、DB、DW、EQU(或=)、DATA、XDATA、BIT,以及END伪指令。ORG(Origin)伪指令出现在源程序或数据块的开始,用以指明此语句后面的目标程序或数据块存放的起始地址。在一个源程序中,可以多次使用ORG来规定不同程序段的起始位置,但定义的地址顺序应该是从小到大。END伪指令指出源程序到此结束。汇编器对其后的程序语句不予处理。一个源程序只在主程序最后使用一个END,作为整个源程序的结束标志。DB(Define Byte)伪指令的功能是将项表中的字节数据存放到从标号开始的连续字节单元中。项表中的数据用逗号分隔。,*,82,DW(Define Word)伪指令的功能与DB类似,通常DB用于定义数据表,而DW用于定义16位的地址表。汇编以后,每个16位地址按照低位地址存高位字节,高位地址存低位字节的顺序存放。EQU(或=)伪指令用于给一个表达式赋值或给字符串起一个名字,这个名字可以作为程序地址、数据地址或立即数使用,因此表达式可以是8位或16位二进制数值。名字必须是以字母开头的字母数字串,但不能重复定义。DATA(Data)伪指令给一个8位内部RAM单元起一个名字。名字必须是以字母开头的字母数字串,但不能重复定义。XDATA(External Data)伪指令给一个8位外部RAM单元起一个名字。命名规则与DATA伪指令相同BIT伪指令给一个可位寻址的位单元起一个名字。命名规则同DATA伪指令。,