![第三章 单片机汇编程序设计 课件_第1页](http://file4.renrendoc.com/view/9480f8aa2d93122ec90edaba4d205389/9480f8aa2d93122ec90edaba4d2053891.gif)
![第三章 单片机汇编程序设计 课件_第2页](http://file4.renrendoc.com/view/9480f8aa2d93122ec90edaba4d205389/9480f8aa2d93122ec90edaba4d2053892.gif)
![第三章 单片机汇编程序设计 课件_第3页](http://file4.renrendoc.com/view/9480f8aa2d93122ec90edaba4d205389/9480f8aa2d93122ec90edaba4d2053893.gif)
![第三章 单片机汇编程序设计 课件_第4页](http://file4.renrendoc.com/view/9480f8aa2d93122ec90edaba4d205389/9480f8aa2d93122ec90edaba4d2053894.gif)
![第三章 单片机汇编程序设计 课件_第5页](http://file4.renrendoc.com/view/9480f8aa2d93122ec90edaba4d205389/9480f8aa2d93122ec90edaba4d2053895.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
12023/1/31单片机原理与应用电子课件第3
章单片机汇编语言程序设计2023/1/312本章主要内容:3.151系列单片机指令系统概述3.251系列单片机寻址方式3.351系列单片机指令系统
3.451系列单片机汇编指令格式及标识3.551系列单片机汇编程序常用伪指令
3.651系列单片机汇编程序设计2023/1/313§3.151系列单片机指令系统概述指令:就是计算机可以直接识别和执行的某种操作命令。指令系统:一台计算机中所有指令的集合。一条指令的结构用如下形式表示:操作码字段OP地址码字段A操作码字段表征指令的操作特性与功能,而地址码字段通常指定参与操作的操作数的地址。
在51单片机中的指令系统中,有单字节、双字节、三字节等不同长度的指令。
单字节指令只有一个字节,操作码和操作数都在这个字节中。51指令系统共有单字节指令49条。
§3.151系列单片机指令系统概述
双字节指令包括两个字节,其中一个字节是操作码,第二个字节是操作数。51指令系统共有双字节指令45条。
三字节指令中,操作码占一个字节,操作数占两个字节,其中操作数既可能是数据,也可能是地址。51指令系统共有三字节指令45条。§3.251系列单片机寻址方式
MCS-51单片机的寻址方式按操作数的类型,可分为数的寻址和指令寻址.数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址.指令的寻址有:绝对寻址和相对寻址。操作数是常数,常数又称为立即数,使用时直接出现在指令中,紧跟在操作码的后面,作为指令的一部分。在汇编指令中,立即数前面以“#”符号作前缀。在程序中通常用于给寄存器或存储器单元赋初值,例如:MOVA,#20H其功能是把立即数20H送给累加器A,其中源操作数20H就是立即数。指令执行后累加器A中的内容为20H。§3.251系列单片机寻址方式3.2.1立即寻址2023/1/3173.2.2寄存器寻址操作数在寄存器中,使用时在指令中直接提供寄存器的名称,这种寻址方式称为寄存器寻址。在汇编指令中,寄存器寻址在指令中直接提供寄存器的名称,如R0、R1、A、DPTR等。例如:MOVA,R0其功能是把R0寄存器中的数送给累加器A,在指令中,源操作数R0为寄存器寻址,传送的对象为R0中的数据。§3.251系列单片机寻址方式§3.251系列单片机寻址方式3.2.3直接寻址
直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元的地址。
这种寻址方式针对的是片内数据存储器和特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储器单元的地址。例如:
MOVA,20H其功能是把片内数据存储器20H单元的内容送给累加器A。
直接寻址方式的寻址范围包括:1.低128单元。在指令中直接以单元地址形式给出。2.专用寄存器。专用寄存器除了以单元地址形式给出外,还可以以寄存器符号形式给出。直接寻址是访问专用寄存器的唯一方法。例如指令:
MOVA,SBUFSBUF是专用寄存器名。§3.251系列单片机寻址方式§3.251系列单片机寻址方式3.2.4寄存器间接寻址
寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用对应的存储单元。形式为:@寄存器名
例如:MOVA,@R1该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去。80H20H20HA80HR1§3.251系列单片机寻址方式寄存器间接寻址若R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,则执行该指令MOVA,@R1后,累加器A的内容为20H。寄存器间接寻址示意图如图所示。
寄存器间接寻址用到的寄存器只能是通用寄存器R0、R1和数据指针寄存器DPTR,它能访问的数据是片内数据存储器和片外数据存储器。其中,片内数据存储器只能用R0和R1作指针间接访问;片外数据存储器,低端的256字节单元,既可以用两位十六进制地址以R0或R1作指针间接访问,也可用四位十六进制地址以DPTR作指针间接访问.而高端的字节单元则只能以DPTR作指针间接访问。§3.251系列单片机寻址方式对于片内RAM和片外RAM的低端256字节都可以用R0和R1作指针访问,它们之间用指令来区别。片内RAM访问用MOV指令,片外RAM访问用MOVX指令。3.2.5相对寻址
相对寻址是把指令中给定的地址偏移量与程序计数器
PC的当前值相加,得到真正的程序转移地址。相对寻址方式主要是解决程序转移而专门设置的。
例如:JC80H
若C=0,则PC值不变,若C=1,则以当前PC值为基地址,加上偏移量80H得到新的PC值。
这里的偏移量是一个带符号的二进制补码数,所能表示的数的范围是-128~+127,因此相对转移是以转移指令的下条指令为基点,向前最大可能转移127个字节,向后最大可能转移128个字节。3.2.6变址寻址
变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器的地址得到。它是以数据指针寄存器DPTR或程序计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器。
MOVCA,@A+DPTR
MOVCA,@A+PC
2000H30H30HDPTRA2005H05HA+§3.251系列单片机寻址方式变址寻址设指令执行前数据指针寄存器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,则指令执行后,累加器A中的内容为30H。示意图如图所示。§3.251系列单片机寻址方式3.2.7位寻址51指令系统有位处理功能,可以对数据位进行操作,因此就有相应的位寻址方式。位寻址的范围包括:(1)内部RAM中的位寻址区。单元地址为20H~2FH,共16个单元128位,位地址是00H~7FH。(2)专用寄存器的可寻址位。可以位寻址的专用寄存器共有11个,实有寻址位83位。
§3.351系列单片机指令系统3.3.1数据传送指令数据传送指令属于复制,传送后,源操作数不变,不影响别的寄存器和标志。传送指令包括“MOV”、“MOVX”、“MOVC”。数据传送指令的约定是从右向左,左边是目的操作数,右边是源操作数。源操作数可以是:累加寄存器、通用寄存器、直接地址、间接地址和立即数。目的操作数除了不能用立即数,其它和源操作数一样。3.3.1.1片内数据存储器传送指令MOV指令格式:MOV目的操作数,源操作数其中:源操作数可以为A、Rn、@Ri、direct、#data,目的操作数可以为A、Rn、@Ri、direct,组合起来总共16条,按目的操作数的寻址方式划分为五组:(1)以A为目的操作数
MOVA,Rn
;A←(Rn) MOVA,direct ;A←(direct)
MOVA,@Ri
;A←((Ri))
MOVA,#data ;A←#data§3.351系列单片机指令系统(2)以Rn为目的操作数
MOVRn,A ;Rn←(A) MOVRn,direct ;Rn←(direct)
MOVRn,#data ;Rn←#data(3)以直接地址direct为目的操作数
MOVdirect,A ;direct←(A) MOVdirect,Rn
;direct←(Rn) MOVdirect,direct;direct←(direct)
MOVdirect,@Ri
;direct←((Ri))
MOVdirect,#data ;direct←#data§3.351系列单片机指令系统(4)以间接地址@Ri为目的操作数
MOV@Ri,A ;(Ri)←(A) MOV@Ri,direct ;(Ri)←(direct)
MOV@Ri,#data ;(Ri)←#data(5)以DPTR为目的操作数
MOVDPTR,#data16;DPTR←#data16注意,源操作数和目的操作数中的Rn和@Ri不能相互配对。如不允许有“MOVRn,Rn”,“MOV@Ri,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址。§3.351系列单片机指令系统3.3.1.2片外数据存储器传送指令MOVX
在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过@Ri和@DPTR以间接寻址方式进行。MOVX指令共有四条:
MOVXA,@DPTR ;A←((DPTR))
MOVX@DPTR,A ;(DPTR)←(A) MOVXA,@Ri
;A←((Ri))
MOVX@Ri,A ;(Ri)←(A)
其中前两条指令通过DPTR间接寻址,可以对整个64K片外数据存储器访问。后两条指令通过@Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中。§3.351系列单片机指令系统3.3.1.3程序存储器数据传送指令MOVC
程序存储器传送指令只有两条,一条用DPTR基址变址寻址。一条用PC基址变址寻址。
MOVCA,@A+DPTR ;A←(A+DPTR)
MOVCA,@A+PC ;A←(A+PC)这两条指令通常用于访问表格数据,因此称为查表指令。§3.351系列单片机指令系统
【例3-1】写出完成下列功能的程序段。(1)将R0的内容送R6中程序为:MOVA,R0 MOVR6,A(2)将片内RAM30H单元的内容送片外60H单元中程序为:MOVA,30H MOVR0,#60H MOVX@R0,A(3)将片外RAM1000H单元的内容送片内20H单元中程序为:MOVDPTR,#1000H MOVA,@DPTR MOV20H,A§3.351系列单片机指令系统(4)将ROM2000H单元的内容送片内RAM的30H单元中程序为:MOVA,#0 MOVDPTR,#2000H MOVCA,@A+DPTR MOV30H,A§3.351系列单片机指令系统3.3.1.4数据交换指令
普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中。数据交换指令要求第一个操作数须为累加器A,共有5条。
XCHA,Rn
;A<=>Rn XCHA,direct ;A<=>direct
XCHA,@Ri
;A<=>(Ri)
XCHDA,@Ri
;A0~3<=>(Ri)0~3 SWAPA ;A0~3<=>A4~7§3.351系列单片机指令系统
【例3-2】若R0的内容为30H,片内RAM30H单元的内容为23H,累加器A的内容为45H,则执行XCHA,@R0指令后片内RAM30H单元的内容为45H,累加器A中的内容为23H。若执行SWAPA指令,则累加器A的内容为54H。§3.351系列单片机指令系统3.3.1.5堆栈指令
堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区。数据的进栈和出栈由指针SP统一管理。堆栈操作指令有两条:PUSHdirect;SP←(SP+1),(SP)←(direct)POPdirect;direct←(SP),(SP)←(SP-1)
其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。§3.351系列单片机指令系统
【例3-3】若入栈保存时入栈的顺序为:
PUSHA PUSHB则出栈的顺序为:
POPB POPA§3.351系列单片机指令系统3.3.2算术运算指令§3.351系列单片机指令系统3.3.2.1加法指令1.一般的加法指令ADDADDA,Rn
;A←(A)+(Rn)ADDA,direct ;A←(A)+(direct)ADDA,@Ri
;A←(A)+((Ri))ADDA,#data ;A←(A)+#data2.带进位加指令ADDCADDCA,Rn
;A←(A)+(Rn)+CADDCA,direct ;A←(A)+(direct)+CADDCA,@Ri
;A←(A)+(Ri)+CADDCA,#data ;A←(A)+#data+C3.加1指令INCA ;A←(A)+1INCRn
;Rn←(Rn)+1INCdirect ;direct←(direct)+1INC@Ri
;(Ri)←((Ri))+1INCDPTR ;DPTR←(DPTR)+1
其中,ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。而INC指令除了INCA要影响P标志位外,对其它标志位都没有影响。在MCS-51单片机中,常用ADD和ADDC配合使用实现多字节加法运算。§3.351系列单片机指令系统
【例3-4】试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中。处理时,R2和R4用一般的加法指令ADD,结果放于R6中,R1和R3用带进位的加法指令ADDC,结果放于R5中,程序如下:
MOVA,R2 ADDA,R4 MOVR6,A MOVA,R1 ADDCA,R3 MOVR5,A§3.351系列单片机指令系统【例3-6】见书P453.3.2.2减法指令1.带借位减法指令SUBBSUBBA,Rn
;A←(A)–(Rn)-CSUBBA,direct ;A←(A)-(direct)-CSUBBA,@Ri
;A←(A)-(Ri)-CSUBBA,#data ;A←(A)-#data–C2.减1指令DECDECA ;A←(A)-1DECRn
;Rn←(Rn)-1DECdirect ;direct←(direct)-1DEC@Ri
;(Ri)←(Ri)-1§3.351系列单片机指令系统
在51单片机中,只提供了一种带借位的减法指令,没有提供一般的减法指令,一般的减法操作可以通过先对CY标志清零,然后再执行带借位的减法来实现。例3-7:设(45H)=0AAH,(47H)=66H,试编写45H内容减去47H内容后,结果再存入49H单元的程序。MOV45H,#0AAHMOV47H,#66HMOVA,45H;向A设置被减数CLRC
;清除进位标志CY
SUBBA,47H ;A←(A)-(47H)-(C
)MOV 49H,A ;将结果置于地址为49H的内部RAM存储单元中执行以上程序后,(49H)=44H,CY=0,OV=1,AC=0。
§3.351系列单片机指令系统3.3.2.3乘法指令
在MCS-51单片机中,乘法指令只有一条:
MULAB该指令执行时将对存放于累加器A中的无符号被乘数和放于B寄存器中的无符号乘数相乘,积的高字节存于B寄存器中,低字节存于累加器A中。指令执行后将影响CY和OV标志,CY复位,对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0。§3.351系列单片机指令系统3.3.2.4除法指令
在MCS-51单片机中,除法指令也只有一条:
DIVAB
该指令执行时将用存放在累加器A中的无符号被除数与存放在B寄存器中的无符号除数相除,除得的结果,商的存于累加器A中,余数存于B寄存器中。指令执行后将影响CY和OV标志,一般情况CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1。§3.351系列单片机指令系统3.3.2.5十进制调整指令在MCS-51单片机中,十进制调整指令只有一条:
DAA
它只能用在ADD或ADDC指令后面,用来对两个二位的压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使得它得到正确的十进制结果。通过该指令可实现两位十进制BCD码数的加法运算。它的调整过程为:(1)若累加器A的低四位为十六进制的A-F或辅助进位标志AC为1,则累加器A中的内容作加06H调整。(2)若累加器A的高四位为十六进制的A-F或进位标志CY为1,则累加器A中的内容作加60H调整
§3.351系列单片机指令系统【例3-6】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中。程序为:
MOVA,R3 ADDA,R2 DAA MOVR5,A
程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)。§3.351系列单片机指令系统3.3.3逻辑运算指令§3.351系列单片机指令系统3.3.3.1逻辑与指令ANLANLA,RnA←(A)(Rn)ANLA,directA←(A)
(direct)ANLA,@RiA←(A)
((Ri))ANLA,#dataA←(A)#dataANLdirect,Adirect←(direct)
(A)ANLdirect,#datadirect←(direct)
#data3.3.3.2逻辑或指令ORLORLA,RnA←(A)(Rn)ORLA,directA←(A)
(direct)ORLA,@RiA←(A)
((Ri))ORLA,#dataA←(A)#dataORLdirect,Adirect←(direct)
(A)ORLdirect,#datadirect←(direct)
#data§3.351系列单片机指令系统3.3.3.3逻辑异或指令XRLXRLA,RnA←(A)(Rn)XRLA,directA←(A)
(direct)XRLA,@RiA←(A)
((Ri))XRLA,#dataA←(A)#dataXRLdirect,Adirect←(direct)
(A)XRLdirect,#datadirect←direct)
#data§3.351系列单片机指令系统
在使用中,逻辑与用于实现对指定位清0,其余位不变;逻辑或用于实现对指定位置1,其余位不变;逻辑异或用于实现指定位取反,其余位不变。【例3-7】写出完成下列功能的指令段。1.对累加器A中的1、3、5位清0,其余位不变
ANLA,#11010101B2.对累加器A中的2、4、6位置1,其余位不变
ORLA,#01010100B3.对累加器A中的0、1位取反,其余位不变
XRLA,#00000011B§3.351系列单片机指令系统3.3.3.4清零和求反指令1.清零指令:CLRAA←02.求反指令:CPLAA←Ā
在MCS-51系统中,只能对累加器A中的内容进行清零和求反,如要对其它的寄存器或存储单元进行清零和求反,则须放在累加器A进行,运算后再放回原位置。【例3-8】写出对R0寄存器内容求反的程序段。程序为:
MOVA,R0 CPLA MOVR0,A§3.351系列单片机指令系统3.3.3.5循环移位指令
MCS-51系统有四条对累加器A的循环移位指令,前两条只在累加器A中进行循环移位,后两条还要带进位标志CY进行循环移位。每一次移一位。分别如下:1.累加器A循环左移
RLA2.累加器A循环右移
RRA3.带进位的循环左移
RLCA4.带进位的循环右移
RRCA【例3-9】若累加器A中的内容为10001011B,CY=0,则执行RLCA指令后累加器A中的内容为00010110,CY=1。§3.351系列单片机指令系统3.3.4控制转移指令§3.351系列单片机指令系统3.3.4.1无条件转移指令
无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去。无条件转移指令包括长转移指令、绝对转移指令、相对转移指令和间接转移指令。控制转移指令分为:无条件转移指令、有条件转移指令和子程序调用和返回指令。
1.长转移指令LJMP
LJMPaddr16 ;PC←addr16
指令后面带目的位置的16位地址,执行时直接将该16位地址送给程序指针PC,程序无条件地转到16位目标地址指明的位置去。
指令中提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,故得名为“长转移”。长转移指令需要三个字节。§3.351系列单片机指令系统例3-10ORG0000HLJMPSTARTORG0030HSTART:LJMPLABORG7000HLAB:MOVA,R42.绝对转移指令AJMPAJMPaddr11 ;PC10~0←addr11
AJMP指令后带的是目的位置的低11位直接地址,范围是00000000000-11111111111,即2KB范围,而目的地址的高5位不变,所以程序转移的位置只能是和当前PC位置(AJMP指令地址加2)在同一2KB范围内。转移可以向前也可以向后,指令执行后不影响状态标志位。§3.351系列单片机指令系统3.短转移指令SJMPSJMPrel
;PC←(PC)+2+rel
短转移指令又叫相对转移指令。
SJMP指令后面的操作数rel是8位带符号补码数,8位补码的取值范围为-128~+127,所以该指令的转移范围是:相对PC当前值向前128字节,向后127字节。§3.351系列单片机指令系统注意:在单片机程序设计中,通常用到一条SJMP指令:
SJMP$
该指令的功能是在自己本身上循环,进入等待状态。其中符号$表示转移到本身,它的机器码为80FEH。在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以避免执行后面的内容而出错。§3.351系列单片机指令系统4.变址寻址转移指令JMPJMP@A+DPTR ;PC←(A)+(DPTR)
又叫间接转移指令。是51系统中唯一一条间接转移指令,转移的目的地址是由数据指针DPTR的内容与累加器A中的内容相加得到。
该指令的特点是转移地址可以在程序运行中加以改变。DPTR一般为确定值,根据累加器A的值来实现转移到不同的分支。在使用时往往与一个转移指令表一起来实现多分支转移。§3.351系列单片机指令系统【例3-11】下面的程序能根据累加器A的值0、2、4、6转移到相应的TAB0-TAB6分支去执行 MOVDPTR,#TABLE;表首地址送DPTR JMP@A+DPTR;根据A值转TABLE:AJMPTAB0;当(A)=0时转TAB0执行 AJMPTAB2;当(A)=2时转TAB2执行 AJMPTAB4;当(A)=4时转TAB4执行 AJMPTAB6;当(A)=6时转TAB6执行§3.351系列单片机指令系统§3.351系列单片机指令系统3.3.4.2有条件转移指令
有条件转移指令是指当条件满足时,程序转移到指定位置,条件不满足时,程序将继续顺次执行。在MCS-51系统中,有条件转移指令有三种:累加器A判零条件转移指令、比较转移指令、减1不为零转移指令。1.累加器A判零条件转移指令JZrel
;若A=0,则PC←(PC)+2+rel,否则,PC←(PC)+2
JNZrel
;若A0,则PC←(PC)+2+rel,否则,PC←(PC)+2例3-12比较内部RAM单元中地址为60H的数据如果不为0,则传送到P1口,否则不传送。MOVA,60HJZL1MOVP1,AL1:......
§3.351系列单片机指令系统【例3-13】把片外RAM的30H单元开始的数据块传送到片内RAM的40H开始的位置,直到出现零为止。片内、片外数据传送以累加器A过渡。每次传送一个字节,通过循环处理,直到处理到传送的内容为0结束。程序如下:
MOVR0,#30H MOVR1,#40H LOOP:MOVXA,@R0 MOV@R1,A INCR1 INCR0 JNZLOOP SJMP$§3.351系列单片机指令系统2.比较不等转移指令比较转移指令用于对两个数作比较,并根据比较情况进行转移,比较转移指令有四条:CJNEA,#data,rel
;若A=data,则PC←(PC)+3,不转移,继续执行。若A>data,则C=0,PC←(PC)+3+rel,转移。若A<data,则C=1,PC←(PC)+3+rel,转移。CJNERn,#data,rel
;若(Rn)=data,则PC←(PC)+3,不转移,继续执行。若(Rn)>data,则C=0,PC←(PC)+3+rel,转移。若(Rn)<data,则C=1,PC←(PC)+3+rel,转移。§3.351系列单片机指令系统CJNE@Ri,#data,rel
;若((Ri))=data,则PC←(PC)+3,不转移,继续执行。若((Ri))>data,则C=0,PC←(PC)+3+rel,转移。若((Ri))<data,则C=1,PC←(PC)+3+rel,转移。CJNEA,direct,rel
;若A=direct,则PC←(PC)+3,不转移,继续执行。若A>direct,则C=0,PC←(PC)+3+rel,转移。 若A<direct,则C=1,PC←(PC)+3+rel,转移。§3.351系列单片机指令系统例3-14内部RAM单元中两个存储单元地址为50H和51H,如果它们相等,则将地址为52H的数据单元传送给58H,如果不相等,则将地址为62H的数据单元传送给58H。MOVA,50HCJNEA,51H,L1MOV58H,52HSJMPL2L1:MOV58H,62HL2:3.循环减1转移指令该种指令是先减1后判断,若不为零则转移。指令有两条:DJNZRn,rel
;先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移。DJNZdirect,rel
;先(direct)中的内容减1,再判断(direct)中的内容是否等于零,若不为零,则转移。
在51系统中,通常用DJNZ指令来构造循环结构,实现重复处理。§3.351系列单片机指令系统
【例3-15】统计片内RAM中30H单元开始的20个数据中0个数,放于R7中。
用R2作循环变量,最开始置初值为20;作R7作计数器,最开始置初值为0;用R0作指针访问片内RAM单元,最开始置初值为30H;用DJNZ指令对R2减1转移进行循环控制,在循环体中用指针R0依次取出片内RAM中的数据,判断,如为0,则R7中的内容加1。程序:
MOVR0,#30H MOVR2,#20 MOVR7,#0LOOP:MOVA,@R0 CJNEA,#0,NEXT INCR7NEXT:INCR0 DJNZR2,LOOP§3.351系列单片机指令系统4.判C转移指令JCrel;若C=1,则转移,PC←(PC)+2+rel;否则程序继续执行JNCrel;若C=0,则转移,PC←(PC)+2+rel;否则程序继续执行例3-16比较内部RAM单元中两个存储单元的大小。设A、B、C的地址分别为50H、51H、52H。A和B为无符号数,如果A<B,则将-1送入C;如果A=B,则将0送入C;如果A>B,则将1送入C。MOVA,50HCJNEA,51H,L1MOV52H,#0SJMPL3L1:JCL2MOV52H,#1SJMPL3L2:MOV52H,#-1L3: ......§3.351系列单片机指令系统5.判直接寻址位转移指令JBbit,rel
;若(bit)=1,则转移,PC←(PC)+3+rel;否则程序继续执行JNBbit,rel
;若(bit)=0,则转移,PC←(PC)+3+rel;否则程序继续执行JBCbit,rel
;若(bit)=1,则转移,PC←(PC)+3+rel,且(bit)←0;否则程序继续执行利用位转移指令可进行各种测试。例3-17内部RAM单元中存储单元地址为50H,如果该存储单元有奇数个1,则将R0置1,否则将R0清0。编写该程序。首先将50H单元送给A,然后判断P标志位,根据P标志位的结果,给RO置1或清0。MOVA,50HJBP,L1MOVR0,#0SJMPL2L1:MOVR0,#1L2:......§3.351系列单片机指令系统§3.351系列单片机指令系统3.3.4.3子程序调用指令
这类指令有四条。两条子程序调用指令,两条返回指令。1.绝对调用指令指令格式:ACALLaddr11执行过程:PC←(PC)+2 SP←(SP)+1
(SP)←(PC)7~0 SP←(SP)+1
(SP)←(PC)15~8 PC10~0←addr112.长调用指令指令格式:LCALLaddr16执行过程:PC←(PC)+3 SP←(SP)+1
(SP)←(PC)7~0 SP←(SP)+1
(SP)←(PC)15~8 PC←addr16
§3.351系列单片机指令系统3.子程序返回指令指令格式:RET执行过程:PC15~8←((SP))
SP←(SP)-1 PC7~0←((SP))
SP←(SP)-1由于子程序调用指令执行时压入的内容是调用指令的下一条指令的地址,因而RET指令执行后,程序将返回到调用指令的下一条指令执行。§3.351系列单片机指令系统4.中断子程序返回指令指令格式:RETI执行过程:PC15~8←((SP))
SP←(SP)-1 PC7~0←((SP))
SP←(SP)-1
该指令用于中断服务子程序后面,作为中断服务子程序的最后一条指令,它的功能是返回主程序中断的断点位置,继续执行断点位置后面的指令。§3.351系列单片机指令系统例3-18编写一个子程序,其首地址为LCOUNT,功能是计算A寄存器中1的个数,并将这个计数值放入寄存器R0。编一程序段,求出地址为50H的16位内存单元的1的个数,放入寄存器A中子程序如下:LCOUNT:MOVR0,#0;计数初值为0MOVR1,#8;R1是循环变量,初始值为8,因为A寄存器有8位LOOP:RLCA;带进位左移1次,将当前最高位移到进位标志CY中MOVR2,A;由于马上要进行加法运算,保存A寄存器的内容到R2MOVA,R0;将R0送入A中,为下一步加法做准备ADDCA,#0;将CY加入A中MOVR0,A;将结果送回R0中MOVA,R2;恢复A的值DJNZR1,LOOP;一次循环结束,将循环计数器减一RET主程序将这16位数据分成两个字节,分别传入A寄存器中,然后分别调用子程序计算出它们1的个数,然后再相加到A寄存器。主程序如下:MOVA,50HACALLLCOUNT;调用子程序MOV60H,R0;将计算结果保存在地址为60H的内存单元中MOVA,51HACALLLCOUNT;调用子程序MOVA,R0;将计算结果保存在A寄存器中ADDA,60H ;将两次调用结果相加§3.351系列单片机指令系统3.3.4.4空操作指令NOP;PC←(PC)+1这是一条单字节指令。执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序。它要占用一个机器周期,常用来产生时间延迟,构造延时程序。3.3.5位操作指令§3.351系列单片机指令系统3.3.5.1位数据传送指令
位传送指令有两条,用于实现位运算器C与一般位之间的相互传送。
MOVC,bit ;C←(bit)
MOVbit,C ;(bit)←C
指令在使用时必须有位运算器C参与,不能直接实现两位之间的传送。如果进行两位之间的传送,可以通过位运算器C来传送。
【例3-16】把片内RAM中位寻址区的20H位的内容传送到30H位。程序:
MOVC,20H MOV30H,C3.3.5.2位数据清零指令
CLRC ;C←0CLRbit ;(bit)←0§3.351系列单片机指令系统3.3.5.3位数据置1指令
SETBC ;C←1SETBbit ;(bit)←13.3.5.4位数据取反指令
CPLC ;C←/CCPLbit ;(bit)←(bit)§3.351系列单片机指令系统3.3.5.5位与指令
ANLC,bit ;C←C∧(bit)ANLC,/bit ;C←C∧(/bit)3.3.5.6位或指令ORLC,bit ;C←C∨(bit)ORLC,/bit ;C←C∨(/bit)§3.351系列单片机指令系统
【例3-17】利用位逻辑运算指令编程实现下面硬件逻辑电路的功能。与或或与P1.0P1.1P1.2P1.3P1.4P1.5§3.351系列单片机指令系统程序: MOVC,P1.0 ANLC,P1.1 CPLC ORLC,/P1.2 MOVF0,C MOVC,P1.3 ORLC,P1.4 ANLC,F0 CPLC MOVP1.5,C§3.351系列单片机指令系统2023/1/3176§3.451系列单片机汇编指令格式
[标号:]操作码助记符[目的操作数][,源操作数][;注释](1)操作码助记符表明指令的功能,不同的指令有不同的指令助记符,它一般用说明其功能的英文单词的缩写形式表示。(2)操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明。(3)标号是该指令的符号地址,后面须带冒号。(4)注释是对该指令的解释,前面须带分号。§3.551系列单片机汇编程序常用伪指令
有一些指令,如指定目标程序或数据存放的地址、给一些指定的标号赋值、表示源程序结束等指令,并不产生目标程序(机器码),也不影响程序的执行,仅仅产生供汇编用的某些命令,用来对汇编过程进行某种控制或操作,这类指令称为伪指令。如果是手工编译,这些伪指令将失去意义。3.5.1定义起始地址伪指令格式:ORG地址(十六进制表示)这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据从程序存储空间什么位置开始存放。ORG伪指令后的地址是程序或数据的起始地址。【例3-19】ORG1000HSTART:MOVA,#7FH指明后面的程序从程序存储器的1000H单元开始存放。3.5.2定义汇编结束伪指令格式:END该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到END伪指令时,汇编结束。END后面的指令,汇编程序都不予处理。一个源程序只能有一个END命令,否则就有一部分指令不能被汇编。§3.551系列单片机汇编程序常用伪指令3.5.3标号赋值伪指令格式:符号EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的符号。项可以是常数、地址标号或表达式。以后可以通过使用该符号使用相应的项。【例3-19】 TAB1EQU1000H TAB2EQU2000H汇编后TAB1、TAB2分别等于1000H、2000H。程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换。用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。§3.551系列单片机汇编程序常用伪指令3.5.4字节定义伪指令格式:[标号:]DB项或项表DB伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,定义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。§3.551系列单片机汇编程序常用伪指令12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H§3.551系列单片机汇编程序常用伪指令【例3-20】 ORG3000H TAB1:DB12H,34H DB'5','A','abc'汇编后,各个数据在存储单元中的存放情况如下:3.5.5字定义伪指令格式:[标号:]DW项或项表这条指令与DB相似,但用于定义字数据。项或项表指所定义的一个字在存储器中占两个字节。汇编时,机器自动按高字节在前低字节在后存放。【例3-21】 ORG3000H TAB2:DW1234H,5678H汇编后,各个数据在存储单元中的存放情况如左图:12H34H56H78H3000H3001H3002H3003H§3.551系列单片机汇编程序常用伪指令3.5.6存储区定义伪指令格式:[标号:]DS数值表达式该伪指令用在存储器中保留一定数量的字节单元。保留存贮空间主要为以后存放数据。保留的字节单元数由表达式的值决定。【例3-22】 ORG2000H TAB1:DB12H,34H DS4H DB'5'汇编后,存储单元中的分配情况如左图:12H34H----35H3000H3001H3002H3003H3004H3005H3006H§3.551系列单片机汇编程序常用伪指令3.5.7位定义伪指令格式:符号bit位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后面的位地址。【例3-23】 PLGbitF0 AIbit P1.0定义后,在程序中位地址F0、P1.0就可以通过FLG和AI来使用。§3.551系列单片机汇编程序常用伪指令3.5.8内部RAM地址赋值伪指令格式:符号DATA直接字节地址该伪指令用于给片内RAM字节单元地址赋予DATA前面的符号,赋值后可用该符号代替DATA后面的片内RAM字节单元地址。【例3-24】 RESULTDATA60H
MOVRESULT,A汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT。§3.551系列单片机汇编程序常用伪指令3.5.9外部RAM地址赋值伪指令格式:符号XDATA直接字节地址该伪指令与DATA伪指令基本相同,只是它针对的是片外RAM字节单元。【例3-25】 PORT1XDATA2000HMOVDPTR,PORT1 MOVX@DPTR汇编后,符号PORT1就表示片外RAM的2000H单元地址,程序后面可通过符号PORT1表示片外RAM的2000H单元地址。§3.551系列单片机汇编程序常用伪指令§3.651系列单片机汇编程序设计和大家熟悉的高级语言设计一样,汇编程序的设计也常采用以下几种基本结构:顺序结构、分支结构和循环结构,再加上广泛使用的子程序和中断服务子程序。任何复杂的程序都是由这几种基本结构复合而成的。3.6.1顺序结构程序设计顺序结构是最简单的一种基本结构,是指完全按顺序逐条执行的指令序列。解:由于X>Y,所以X-Y>0,不需要借位;(X-Y)*Z的结果最多占用两个字节。首先将X-Y结果放入A寄存器中,将Z的内容放入B寄存器中,然后将A和B相乘,其结果的高低字节分别置于B和A寄存器中,然后将它们分别放入34H和35H存储单元中。
§3.651系列单片机汇编程序设计例3-26:已知X、Y、Z分别为片内RAM30H、31H、32H单元的内容,设X>Y,试编程完成下式的算术运算:S=(X-Y)*Z,并将计算结果S存入片内RAM34H(高字节)、35H(低字节)单元中。
程序如下: ORG 0030HSTART:MOV A,30H ;A←X CLRC SUBB A,31H ;A←(A)-Y MOV B,32H ;B←Z MUL AB MOV 34H,B ;34H←A*B的高字节 MOV 35H,A;35H←A*B的低字节 SJMP $3.6.2分支结构程序设计分支结构可以有两种形式,单分支结构和多分支结构,如下图所示:单分支结构多分支结构§3.651系列单片机汇编程序设计在51指令系统的编程中,单分支程序使用条件转移指令来实现,即根据条件对程序的执行进行判断,满足条件就进行程序跳转,否则按顺序执行。例3-27:假设外部RAM中有三个8位无符号数据,它们的地址分别为7111H、5687H和8766H,找出它们之中最大的数放入寄存器A中。解:先将地址为7111H、5687H的两个数相比较,将其中较大的数放置于R0。然后将R0和地址为8766H的数相比较,将其中较大数置于A中。§3.651系列单片机汇编程序设计 ORG 0000H MOVDPTR,#7111H MOVXA,@DPTR MOVR0,A MOVDPTR,#5687H MOVXA,@DPTR MOVR1,A CLRC SUBBA,R0 JCBIG1; R0>R1转BIG1 MOVA,R1 MOVR0,A§3.651系列单片机汇编程序设计BIG1:MOVDPTR,#8766H MOVXA,@DPTR MOVR2,A CLRC SUBBA,R0 JCBIG2;R0>R2转BIG2 MOVA,R2 SJMPLABLASTBIG2:MOVA,R0LABLAST:SJMP$ END§3.651系列单片机汇编程序设计多分支结构的特点是判定条件有n种可能的值,根据不同值,程序执行不同的程序段。在图中,这些程序段分别为A1、A2、...、An。和某些高级语言不一样,51指令系统中没有专门的多分支指令,要实现多分支结构,一般采用多条条件转移指令的方法来实现。这种方法的优点是层次很清晰,程序简单易懂。缺点是分支速度较慢。特别是分支很多时,由于每个分支都有可能被判断,因此执行效率大大降低。
§3.651系列单片机汇编程序设计例3-28:寄存器A中存放了一个成绩值(0≤A≤100),编写一程序,判定该成绩所属的级别,放入寄存器B中。判定标准是:1级(100≤A≤90)、2级(89≤A≤80)、3级(79≤A≤70)、4级(69≤A≤60)、5级(A≤59)。解:按照题意,该程序的流程图如下:
§3.651系列单片机汇编程序设计§3.651系列单片机汇编程序设计 ORG 0000H MOVR0,A;将A寄存器保存到R0中 CLRC SUBA,#90 JNCLONEGREE;如果大于等于90,则跳转到LONEGREE MOVXA,@DPTR MOVA,R0 CLRC SUBBA,#80 JNCLTWOGREE;如果大于等于80,则跳转到LTWOGREE MOVA,R0
§3.651系列单片机汇编程序设计 CLRC SUBBA,#70 JNCLTHREEGREE;如果大于等于70,则跳转到THREEGREE MOVA,R0 CLRC SUBBA,#60 JNCLFOURGREE;如果大于等于60,则跳转到LFOURGREE MOVB,#5;否则就是第五等级LEND:SJMP$
§3.651系列单片机汇编程序设计LONEGREE:MOVB,#1 SJMPLENDLTWOGREE:MOVB,#2 SJMPLENDLTHREEGREE:MOVB,#3 SJMPLENDLFOURGREE:MOVB,#4 SJMPLEND END从以上的程序可以看出,如果A寄存器的成绩值小于60,那么要做四个减法和条件判断才能最后得到所需要的等级值,所以这种多分支的程序结构的效率是比较低的。为了提高多分支程序的效率,往往采用地址表查询等方式来实现,这将在后面进行分析。§3.651系列单片机汇编程序设计3.6.3循环结构程序设计循环是为了重复执行一个程序段。在51指令系统的汇编语言中,循环次数固定的循环常常采用DJNZ指令来实现。在循环初始化时,将循环次数放置于某个通用寄存器中或某个内部RAM单元中;在循环结束处放置一条DJNZ,可同时完成对循环计数单元的减1和条件跳转功能(如果循环计数单元不为0,则跳转到循环程序段的起始处)。对于循环次数依赖于循环体中执行结果的循环程序,则需要其他类型的有条件跳转指令。§3.651系列单片机汇编程序设计例3-29:外部RAM中,从地址2000H开始存放了100个有符号字节数据,编写一程序,统计其中小于0的数据个数,将其存放在R0寄存器中。解:很显然,该程序是一个循环次数固定的程序,循环次数是100次。将R1作为循环计数寄存器,其初始值为100。在循环体中是一个分支结构,用于判定一个数是否小于0的依据是该数的最高位是否为1。程序流程图如下:§3.651系列单片机汇编程序设计§3.651系列单片机汇编程序设计 程序如下: ORG0000H MOVR0,#0 MOVR1,#100 MOVDPTR,#2000HLOOP: MOVXA,@DPTR INCDPTR JNBACC.7,NEXT;如果A最高位为0,则;大于等于0,不计入 INCR0
§3.651系列单片机汇编程序设计NEXT:DJNZR1,LOOP;将R1减1,如果大于0表明循环继续 SJMP$END §3.651系列单片机汇编程序设计例3-30:一个字符串存放在外部RAM中,起始地址为3000H,求这个字符串的长度,放入R0寄存器中。解:根据字符串的原理,将字符串的每个字符所对应的ASCII码按顺序存放在存储器中,字符串的结尾是一个ASCII码为0的结尾符。很显然,该程序是一个循环次数不固定的程序,该循环的结束条件是从外部RAM中得到的当前字符的ASCII码是否为0。如果是0,表明该字符串到此结束。
程序流程图如下:§3.651系列单片机汇编程序设计§3.651系列单片机汇编程序设计
ORG0000H MOVR0,#-1;在循环中,至少要进行一次加法,所以计数值初始值为-1 MOVDPTR,#3000HL00P: MOVXA,@DPTR;将当前字符的ASCII码送入A寄存器 INCDPTR INCR0 CJNEA,#0,LOOP;如果当前字符的ASCII码不为0,循环继续LEND:SJMP$ END§3.651系列单片机汇编程序设计3.6.4查表程序设计在程序设计中,查表功能是一项非常重要的功能。查表就是根据自变量x,在表格中寻找y,使y=f(x)。自变量x的范围一般是一个连续变化的整数,比如0~99之间的整数。因此,可以将所对应的y值按自变量x的顺序排列在一起,就得到了一个线性表。根据x的值求取y值,只需要在这个线性表中查询相应的单元即可,称之为查表功能。指令“MOVCA,@A+DPTR”完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。§3.651系列单片机汇编程序设计
例3-31:在一个以MCS-51为核心的温度控制器中,温度传感器输出的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年企业与员工劳动协议示范文本
- 2025年策划合作项目合作方解除协议书
- 2025年建筑行业策划合伙人合同样本
- 2025年预防用生物制品项目规划申请报告
- 2025年中等职业技术学校教务主任合同
- 2025年仓储短期租赁策划合同范本
- 2025年公共交通改善合同协议
- 2025年公司员工股权合作合同指南
- 2025年标准融资协调合同
- 2025年医院医师综合雇佣协议
- 2024年安全生产网络知识竞赛题库及答案(共五套)
- 2024年实验小学大队委竞选笔试试题题库
- 学校办公室卫生制度
- 医学生理学智慧树知到答案2024年德州学院
- GB/T 44412-2024船舶与海上技术液化天然气燃料船舶加注规范
- 小学三年级数学上册口算题卡(加换算)
- 小学数学二年级《数图形》练习题
- 机械制造HSE协议书
- 2024-2030年中国静脉血栓栓塞症(VTE)防治行业市场全景监测及投资策略研究报告
- 财务审计服务投标方案(技术方案)
- 2024年国家保密法知识竞赛经典题库及完整答案【必刷】
评论
0/150
提交评论