
单片机汇编程序设计.ppt
74页第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.1 MCS-51系列单片机汇编指令格式及标识系列单片机汇编指令格式及标识 MCS-51系列单片机指令系统功能强、指令短、执行快从功能上可分成五大类:数据传送指令、算术运算指令、逻辑操作指令、控制转移指令和位操作指令3.1.1 指令格式指令格式[标号:标号:] 操作码助记符操作码助记符 [目的操作数目的操作数][,源操作数,源操作数] [;注释;注释](1)操作码助记符表明指令的功能,不同的指令有不同的指令助记符,它一般用说明其功能的英文单词的缩写形式表示 (2)操作数用于给指令的操作提供数据、数据的地址或指令的地址,操作数往往用相应的寻址方式指明3)标号是该指令的符号地址,后面须带冒号4)注释是对该指令的解释,前面须带分号第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.1.2 指令中用到的标识符指令中用到的标识符为便于后面的学习,在这里先对指令中用到的一些符号的约定意义作以说明:(1)Ri和Rn:表示当前工作寄存器区中的工作寄存器,i取0或1,表示R0或R1n取0~7,表示R0~R72)#data:表示包含在指令中的8位立即数。
3)#data16:表示包含在指令中的16位立即数 (4)rel:以补码形式表示的8位相对偏移量,范围为-128~127,主要用在相对寻址的指令中5)addr16和addr11:分别表示16位直接地址和11位直接地址6)direct:表示直接寻址的地址7)bit:表示可位寻址的直接位地址第第3 3章章 单片机汇编程序设计单片机汇编程序设计(8)(X):表示X单元中的内容9)((X)):表示以X单元的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用((X))表示10)/ 和→符号:“/”表示对该位操作数取反,但不影响该位的原值→”表示操作流程,将箭尾一方的内容送入箭头所指一方的单元中去 第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.2 MCS-51系列单片机寻址方式系列单片机寻址方式 MCS-51单片机的寻址方式按操作数的类型,可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址, 3.2.1 常数寻址(立即寻址)常数寻址(立即寻址)操作数是常数,常数又称为立即数,使用时直接出现在指令中,紧跟在操作码的后面,作为指令的一部分。
在汇编指令中,立即数前面以“#”符号作前缀在程序中通常用于给寄存器或存储器单元赋初值,例如:MOV A,#20H其功能是把立即数20H送给累加器A,其中源操作数20H就是立即数指令执行后累加器A中的内容为20H 第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.2.2 寄存器数寻址(寄存器寻址)寄存器数寻址(寄存器寻址)操作数在寄存器中,使用时在指令中直接提供寄存器的名称,这种寻址方式称为寄存器寻址在MCS-51系统中,这种寻址方式针对的寄存器只能是R0~R7 8个通用寄存器和部分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR等)中的数据,对于其它的特殊功能寄存器中的内容的寻址方式不属于它在汇编指令中,寄存器寻址在指令中直接提供寄存器的名称,如R0、R1、A、DPTR等例如:MOV A,R0其功能是把R0寄存器中的数送给累加器A,在指令中,源操作数R0为寄存器寻址,传送的对象为R0中的数据如指令执行前R0中的内容为20H,则指令执行后累加器A中的内容为20H 3.2.3 存储器数寻址存储器数寻址 存储器数寻址针对的数据是存放在存储器单元中,对于存储器单元的内容通过提供存储器单元地址使用。
根据存储器单元地址的提供方式,存储器数的寻址方式有:直接寻址、寄存器间接寻址、变址寻址第第3 3章章 单片机汇编程序设计单片机汇编程序设计一.直接寻址一.直接寻址直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元的地址在MCS-51系统中,这种寻址方式针对的是片内数据存储器和特殊功能寄存器在汇编指令中,指令中直接以地址数的形式提供存储器单元的地址例如:MOV A,20H其功能是把片内数据存储器20H单元的内容送给累加器A如指令执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A的内容为30H指令中20H是地址数,它是片内数据存储单元的地址在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前面要加符号“#”对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的符号地址,因此它们是直接寻址例如:MOV A,P0其功能是把P0口的内容送给累加器AP0是特殊功能寄存器P0口的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.寄存器间接寻址二.寄存器间接寻址寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用对应的存储单元。
形式为:@寄存器名例如:MOV A,@R1该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单元的数据传送到累加器A中去指令的源操作数是寄存器间接寻址若R1中的内容为80H,片内RAM地址为80H的单元中的内容为20H,则执行该指令后,累加器A的内容为20H寄存器间接寻址示意图如图所示80H20H20HA80HR1第第3 3章章 单片机汇编程序设计单片机汇编程序设计 在MCS-51单片机中,寄存器间接寻址用到的寄存器只能是通用寄存器R0、R1和数据指针寄存器DPTR,它能访问的数据是片内数据存储器和片外数据存储器其中,片内数据存储器只能用R0和R1作指针间接访问;片外数据存储器,低端的256字节单元,既可以用两位十六进制地址以R0或R1作指针间接访问,也可用四位十六进制地址以DPTR作指针间接访问,而高端的字节单元则只能以DPTR作指针间接访问对于片内RAM和片外RAM的低端256字节都可以用R0和R1作指针访问,它们之间用指令来区别片内RAM访问用MOV指令,片外RAM访问用MOVX指令 三.变址寻址三.变址寻址 变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器的地址得到。
在MCS-51系统中,它是以数据指针寄存器DPTR或程序计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所访问的存储器为程序存储器 第第3 3章章 单片机汇编程序设计单片机汇编程序设计例如:MOVC A,@A+DPTR其功能是将数据指针寄存器DPTR的内容和累加器A中的内容相加作为程序存储器的地址,从对应的单元中取出内容送累加器A中指令中,源操作数的寻址方式为变址寻址,设指令执行前数据指针寄存器DPTR的值为2000H,累加器A的值为05H,程序存储器2005H单元的内容为30H,则指令执行后,累加器A中的内容为30H示意图如图所示2000H30H30HDPTRA2005H05HA+第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.2.4 位寻址位寻址位寻址是指操作数是二进制位的寻址方式在MCS-51单片机中有一个独立的位处理器,有多条位处理指令,能够进行各种位运算在MCS-51系统中,位处理的操作对象是各种可位寻址位对于它们的访问是通过提供相应的位地址来处理在MCS-51系统中,位地址的表示可以用以下几种方式:1.直接位地址(00H~0FFH)例如:20H2.字节地址带位号。
例如:表示20H单元的3位3.特殊功能寄存器名带位号例如:表示P0口的1位4.位符号地址例如:TR0是定时/计数器T0的启动位3.2.5 指令寻址指令寻址一.绝对寻址一.绝对寻址绝对寻址是在指令的操作数中直接提供目的位置的地址或地址的一部份在MCS-51系统中,长转移和长调用提供目的位置的16位地址,绝对转移和绝对调用提供目的位置的16位地址的低11位,它们都为绝对寻址第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.相对寻址二.相对寻址相对寻址是以当前程序计数器PC值加上指令中给出的偏移量rel得到目的位置的地址在MCS-51系统中,相对转移指令的操作数属于相对寻址在使用相对寻址时要注意以下两点:(1)当前PC值是指转移指令执行时的PC值,它等于转移指令的地址加上转移指令的字节数实际上是转移指令的下一条指令的地址例如:若转移指令的地址为2010H,转移指令的长度为2字节,则转移指令执行时的PC值为2012H2)偏移量rel是8位有符号数,以补码表示,它的取值范围为-128~+127当为负值时,向前转移,当为正数时向后转移相对寻址的目的地址为:目的地址=当前PC+rel=转移指令的地址+转移指令的字节数+rel第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3 MCS-51系列单片机指令系统系列单片机指令系统3.3.1 数据传送指令数据传送指令数据传送指令有29条,是指令系统中数量最多、使用也最频繁的一类指令。
这类指令可分为三组:普通传送指令、数据交换指令、堆栈操作指令一.普通传送指令一.普通传送指令 普通传送指令以助记符MOV为基础分成片内数据存储器传送指令、片外数据存储器传送指令和程序存储器传送指令1.片内数据存储器传送指令.片内数据存储器传送指令MOV指令格式:MOV 目的操作数,源操作数其中:源操作数可以为A、Rn、@Ri、direct、#data,目的操作数可以为A、Rn、@Ri、direct,组合起来总共16条,按目的操作数的寻址方式划分为五组:第第3 3章章 单片机汇编程序设计单片机汇编程序设计(1)以A为目的操作数MOV A,Rn;A← RnMOV A,direct ;A←(direct)MOV A,@Ri;A←(Ri)MOV A,#data ;A← #data(2)以Rn为目的操作数MOV Rn,A;Rn ← AMOV Rn,direct;Rn ←(direct)MOV Rn,#data;Rn ← #data(3)以直接地址direct为目的操作数MOV direct,A ;(direct) ← AMOV direct,Rn;(direct) ←RnMOV direct,direct;(direct) ←(direct)MOV direct,@Ri;(direct) ←(Ri)MOV direct,#data;(direct) ← #data(4)以间接地址@Ri为目的操作数MOV @Ri,A ;(Ri) ← AMOV @Ri,direct;(Ri) ←(direct)MOV @Ri,#data;(Ri) ← #data(5)以DPTR为目的操作数MOV DPTR,#data16 ;DPTR ← #data16第第3 3章章 单片机汇编程序设计单片机汇编程序设计注意,源操作数和目的操作数中的Rn和@Ri不能相互配对。
如不允许有“MOV Rn,Rn”,“MOV @Ri,Rn”这样的指令,在MOV指令中,不允许在一条指令中同时出现工作寄存器,无论它是寄存器寻址还是寄存器间接寻址 2.片外数据存储器传送指令.片外数据存储器传送指令MOVX 在MCS-51系统中只能通过累加器A与片外数据存储器进行数据传送,访问时,只能通过@Ri和@DPTR以间接寻址方式进行MOVX指令共有四条:MOVX A,@DPTR;A ← (DPTR)MOVX @DPTR,A;(DPTR) ← AMOVX A,@Ri;A ← (Ri)MOVX @Ri,A;(Ri)← A 其中前两条指令通过DPTR间接寻址,可以对整个64K片外数据存储器访问后两条指令通过@Ri间接寻址,只能对片外数据存储器的低端的256字节访问,访问时将低8位地址放于Ri中第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.程序存储器传送指令.程序存储器传送指令MOVC 程序存储器传送指令只有两条,一条用DPTR基址变址寻址一条用PC基址变址寻址MOVC A,@A+DPTR ;A ← (A+DPTR)MOVC A,@A+PC;A ← (A+PC)这两条指令通常用于访问表格数据,因此以称为查表指令。
例如:查表指令MOVC A,@A+PC所在的地址为2000H,表格的起始单元地址为2035H,表格的第4个元素(位移量为03H)的内容为45H,则查表指令的处理过程如下: MOV A,#03H ;表格元素相对于表首的位移量送累加器A ADD A,#34H ;当前程序计数器PC相对于表首的差值加到累加器A中 MOVC A,@A+PC ;查表,查得第4个元素内容45H送累加器A 注意:查表指令的长度为1个字节,当前程序计数器PC的值应为查表指令的地址加1第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-1】写出完成下列功能的程序段写出完成下列功能的程序段1)将R0的内容送R6中程序为:MOV A,R0MOV R6,A(2)将片内RAM 30H单元的内容送片外60H单元中程序为:MOV A,30HMOV R0,#60HMOVX @R0,A(3)将片处RAM 1000H单元的内容送片内20H单元中程序为:MOV DPTR,#1000HMOV A,@DPTRMOV 20H,A(4)将ROM 2000H单元的内容送片内RAM的30H单元中程序为:MOV A,#0MOV DPTR,#2000HMOVC A,@A+DPTRMOV 30H,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.数据交换指令二.数据交换指令 普通传送指令实现将源操作数的数据传送到目的操作数,指令执行后源操作数不变,数据传送是单向的。
数据交换指令数据作双向传送,传送后,前一个操作数原来的内容传送到后一个操作数中,后一个操作数原来的内容传送到前一个操作数中 数据交换指令要求第一个操作数须为累加器A,共有5条XCH A,Rn;A<=> RnXCH A ,direct ;A<=>(direct)XCH A,@Ri;A<=>(Ri)XCHD A,@Ri ;A0~3<=>(Ri)0~3SWAP A;A0~3<=>A4~7【例【例3-2】若】若R0的内容为30H,片内RAM 30H单元的内容为23H,累加器A的内容为45H,则执行XCH A,@R0指令后片内RAM 30H单元的内容为45H,累加器A中的内容为23H若执行SWAP A指令,则累加器A的内容为54H第第3 3章章 单片机汇编程序设计单片机汇编程序设计三.堆栈操作指令三.堆栈操作指令 堆栈是在片内RAM中按“先进后出,后进先出”原则设置的专用存储区数据的进栈和出栈由指针SP统一管理在MCS-51系统中,堆栈操作指令有两条:PUSH direct;SP←(SP+1),(SP)←(direct)POP direct;(direct)←(SP),(SP) ← (SP-1) 其中PUSH指令入栈,POP指令出栈。
操作时以字节为单位入栈时SP指针先加1,再入栈出栈时内容先出栈,SP指针再减1用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈 【例3-3】若入栈保存时入栈的顺序为:PUSH APUSH B则出栈的顺序为:POP BPOP A第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.2 算术运算指令算术运算指令一.加法指令一.加法指令1.一般的加法指令.一般的加法指令ADDADD A,Rn ;A← A + RnADD A,direct;A← A +(direct)ADD A,@Ri;A← A +(Ri)ADD A,#data;A← A + #data2.带进位加指令.带进位加指令ADDCADDC A,Rn;A← A + Rn + CADDC A,direct;A← A +(direct)+ CADDC A,@Ri;A← A +(Ri)+ CADDC A,#data;A← A + #data + C3.加.加1指令指令INC A;A← A + 1INC Rn;Rn← Rn + 1INC direct;(direct)← (direct)+ 1INC @Ri;(Ri)←(Ri)+ 1INC DPTR;DPTR← DPTR + 1第第3 3章章 单片机汇编程序设计单片机汇编程序设计其中,ADD和ADDC指令在执行时要影响CY、AC、OV和P标志位。
而INC指令除了INC A要影响P标志位外,对其它标志位都没有影响在MCS-51单片机中,常用ADD和ADDC配合使用实现多字节加法运算例【例3-4】】试把存放在R1R2和R3R4中的两个16位数相加,结果存于R5R6中 处理时,R2和R4用一般的加法指令ADD,结果放于R6中,R1和R3用带进位的加法指令ADDC,结果放于R5中,程序如下:MOV A,R2ADD A,R4MOV R6,AMOV A,R1ADDC A,R3MOV R5,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.减法指令二.减法指令1.带借位减法指令.带借位减法指令SUBBSUBB A,Rn;A← A - Rn - CSUBB A,direct;A← A -(direct)- CSUBB A,@Ri;A← A -(Ri)- CSUBB A,#data;A← A - #data – C2.减.减1指令指令DECDEC A;A← A - 1DEC Rn;Rn← Rn - 1DEC direct;direct← (direct)- 1DEC @Ri;(Ri)←(Ri)- 1 在MCS-51单片机中,只提供了一种带借位的减法指令,没有提供一般的减法指令,一般的减法操作可以通过先对CY标志清零,然后再执行带借位的减法来实现。
其中,SUBB指令在执行时要影响CY、AC、OV和P标志位而DEC指令除了DEC A要影响P标志位外,对其它标志位都没有影响 第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-5】】求R3← R2 - R1程序为:MOV A,R2CLR CSUBB A,R1MOV R3,A3.乘法指令.乘法指令MUL 在MCS-51单片机中,乘法指令只有一条:MUL AB 该指令执行时将对存放于累加器A中的无符号被乘数和放于B寄存器中的无符号乘数相乘,积的高字节存于B寄存器中,低字节存于累加器A中 指令执行后将影响CY和OV标志,CY复位,对于OV:当积大于255时(即B中不为0),OV为1;否则,OV为0第第3 3章章 单片机汇编程序设计单片机汇编程序设计4.除法指令.除法指令DIV 在MCS-51单片机中,除法指令也只有一条:DIV AB 该指令执行时将用存放在累加器A中的无符号被除数与存放在B寄存器中的无符号除数相除,除得的结果,商的存于累加器A中,余数存于B寄存器中 指令执行后将影响CY和OV标志,一般情况CY和OV都清0,只有当B寄存器中的除数为0时,CY和OV才被置1。
5.十进制调整指令.十进制调整指令 在MCS-51单片机中,十进制调整指令只有一条:DA A 它只能用在ADD或ADDC指令后面,用来对两个二位的压缩的BCD码数通过用ADD或ADDC指令相加后存于累加器A中的结果进行调整,使得它得到正确的十进制结果通过该指令可实现两位十进制BCD码数的加法运算第第3 3章章 单片机汇编程序设计单片机汇编程序设计它的调整过程为:(1)若累加器A的低四位为十六进制的A~F或辅助进位标志AC为1,则累加器A中的内容作加06H调整2)若累加器A的高四位为十六进制的A~F或进位标志CY为1,则累加器A中的内容作加60H调整例【例3-6】】在R3中有十进制数67,在R2中有十进制数85,用十进制运算,运算的结果放于R5中程序为:MOV A,R3ADD A,R2DA AMOV R5,A 程序中DA指令对ADD指令运算出来的放于累加器A中的结果进行调整,调整后,累加器A中的内容为52H,CY为1,则结果为152,最后放于R5中的内容为52H(十进制数52)第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.3 逻辑操作指令逻辑操作指令一.逻辑与指令一.逻辑与指令ANLANL A,Rn A← A RnANL A,direct A← A (direct)ANL A,@Ri A← A ((Ri))ANL A,#data A← A dataANL direct,A (direct)← (direct) AANL direct,#data (direct)← (direct) data二.逻辑或指令二.逻辑或指令ORLORL A,Rn A← A RnORL A,direct A← A (direct)ORL A,@Ri A← A ((Ri))ORL A,#data A← A dataORL direct,A (direct)← (direct) AORL direct,#data (direct)← (direct) data第第3 3章章 单片机汇编程序设计单片机汇编程序设计三.逻辑异或指令三.逻辑异或指令XRLXRL A,Rn A← A RnXRL A,direct A← A (direct)XRL A,@Ri A← A ((Ri))XRL A,#data A← A dataXRL direct,A (direct)← (direct) AXRL direct,#data (direct)← (direct) data 在使用中,逻辑与用于实现对指定位清0,其余位不变;逻辑或用于实现对指定位置1,其余位不变;逻辑异或用于实现指定位取反,其余位不变。
例【例3-7】】写出完成下列功能的指令段1.对累加器A中的1、3、5位清0,其余位不变ANL A,#11010101B2.对累加器A中的2、4、6位置1,其余位不变ORL A,#01010100B3.对累加器A中的0、1位取反,其余位不变XRL A,#00000011B第第3 3章章 单片机汇编程序设计单片机汇编程序设计四.清零和求反指令四.清零和求反指令1.清零指令:CLR A A← 02.求反指令:CPL A A← Ā 在MCS-51系统中,只能对累加器A中的内容进行清零和求反,如要对其它的寄存器或存储单元进行清零和求反,则须放在累加器A进行,运算后再放回原位置例【例3-8】】写出对R0寄存器内容求反的程序段程序为:MOV A,R0CPL AMOV R0,A五.循环移位指令五.循环移位指令 MCS-51系统有四条对累加器A的循环移位指令,前两条只在累加器A中进行循环移位,后两条还要带进位标志CY进行循环移位每一次移一位分别如下:1.累加器A循环左移RL A2.累加器A循环右移RR A第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.带进位的循环左移RLC A4.带进位的循环右移RRC A【例【例3-9】】若累加器A中的内容为10001011B,CY=0,则执行RLC A指令后累加器A中的内容为00010110,CY=1。
第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.4 控制转移指令控制转移指令共有17条,包括无条件转移指令、条件转移指令、子程序调用及返回指令一.无条件转移指令一.无条件转移指令 无条件转移指令是指当执行该指令后,程序将无条件地转移到指令指定的地方去无条件转移指令包括长转移指令、绝对转移指令、相对转移指令和间接转移指令1.长转移指令.长转移指令LJMP 指令格式:LJMP addr16;PC ← addr16 指令后面带目的位置的16位地址,执行时直接将该16位地址送给程序指针PC,程序无条件地转到16位目标地址指明的位置去指令中提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,故得名为“长转移”该指令不影响标志位,使用方便缺点是:执行时间长,字节数多第第3 3章章 单片机汇编程序设计单片机汇编程序设计2.绝对转移指令.绝对转移指令指令格式:AJMP addr11;PC 10~0 ← addr11 AJMP指令后带的是目的位置的低11位直接地址,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地址addr11送给程序指针PC的低11位,而程序指针的高5位不变,执行后转移到PC指针指向的新位置。
由于11位地址addr11的范围是,即2KB范围,而目的地址的高5位不变,所以程序转移的位置只能是和当前PC位置(AJMP指令地址加2)在同一2KB范围内转移可以向前也可以向后,指令执行后不影响状态标志位例【例3-10】】若AJMP指令地址为3000HAJMP后面带的11位地址addr11为123H,则执行指令AJMP addr11后转移的目的位置是多少? AJMP指令的PC值加2=3000H+2=3002H=00110 000 00000010B 指令中的addr11=123H=001 00100011B 转移的目的地址为0011 0001 0010 0011B=3123H第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.相对转移指令.相对转移指令指令格式:SJMP rel ;PC ← PC + 2 + rel SJMP指令后面的操作数rel是8位带符号补码数,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后再将程序指针PC的值与指令中的位移量rel相加得转移的目的地址即:转移的目的地址= SJMP指令所在地址+2+rel 因为8位补码的取值范围为-128~+127,所以该指令的转移范围是:相对PC当前值向前128字节,向后127字节。
例【例3-11】】在2100H单元有SJMP指令,若rel = 5AH(正数),则转移目的地址为215CH(向后转);若rel = F0H(负数),则转移目的地址为20F2H(向前转) 用汇编语言编程时,指令中的相对地址rel往往用目的位置的标号(符号地址)表示机器汇编时,能自动算出相对地址值;但手工汇编时,需自己计算相对地址值relrel的计算方法如下: rel = 目的地址-(SJMP指令地址+2) 如目的地址等于2013H,SJMP指令的地址为2000H,则相对地址rel为11H第第3 3章章 单片机汇编程序设计单片机汇编程序设计注意:在单片机程序设计中,通常用到一条SJMP指令:SJMP $ 该指令的功能是在自己本身上循环,进入等待状态其中符号 $ 表示转移到本身,它的机器码为80 FEH在程序设计中,程序的最后一条指令通常用它,使程序不再向后执行以避免执行后面的内容而出错 4.间接转移指令.间接转移指令 指令格式:JMP @A+DPTR;PC ← A + DPTR 它MCS-51系统中唯一一条间接转移指令,转移的目的地址是由数据指针DPTR的内容与累加器A中的内容相加得到,指令执行后不会改变DPTR及A中原来的内容。
数据指针DPTR的内容一般为基址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移 该指令的特点是转移地址可以在程序运行中加以改变DPTR一般为确定值,根据累加器A的值来实现转移到不同的分支在使用时往往与一个转移指令表一起来实现多分支转移第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-12】】下面的程序能根据累加器A的值0、2、4、6转移到相应的TAB0~TA6分支去执行MOV DPTR,#TABLE ;表首地址送DPTRJMP @A+DPTR ;根据A值转移TABLE:AJMP TAB0 ;当(A)=0时转TAB0执行AJMP TAB2 ;当(A)=2时转TAB2执行AJMP TAB4 ;当(A)=4时转TAB4执行AJMP TAB6 ;当(A)=6时转TAB6执行二.条件转移指令二.条件转移指令 条件转移指令是指当条件满足时,程序转移到指定位置,条件不满足时,程序将继续顺次执行在MCS-51系统中,条件转移指令有三种:累加器A判零条件转移指令、比较转移指令、减1不为零转移指令。
1.累加器.累加器A判零条件转移指令判零条件转移指令判0指令:JZ rel ;若A=0,则PC ← PC + 2 + rel,否则,PC ← PC + 2判非0指令:JNZ rel ;若A0,则PC ← PC + 2 + rel,否则,PC ← PC + 2 第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-13】】把片外RAM的30H单元开始的数据块传送到片内RAM的40H开始的位置,直到出现零为止 片内、片外数据传送以累加器A过渡每次传送一个字节,通过循环处理,直到处理到传送的内容为0结束程序如下:MOV R0,#30HMOV R1,#40HLOOP:MOVX A,@R0MOV @R1,AINC R1INC R0JNZ LOOPSJMP $第第3 3章章 单片机汇编程序设计单片机汇编程序设计2.比较转移指令.比较转移指令比较转移指令用于对两个数作比较,并根据比较情况进行转移,比较转移指令有四条:CJNE A,#data,rel ;若A=data,则PC ← PC + 3,不转移,继续执行若A>data,则C=0,PC ← PC + 3 + rel,转移若Adata,则C=0,PC ← PC + 3 + rel,转移若(Rn)data,则C=0,PC ← PC + 3 + rel,转移若((Ri))direct,则C=0,PC ← PC + 3 + rel,转移若A 指令有两条:DJNZ Rn,rel ;先Rn中的内容减1,再判断Rn中的内容是否等于零,若不为零,则转移DJNZ direct,rel ;先(direct)中的内容减1,再判断(direct)中的内容是否等于零,若不为零,则转移在MCS-51系统中,通常用DJNZ指令来构造循环结构,实现重复处理第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-14】】统计片内RAM中30H单元开始的20个数据中0个数,放于R7中 用R2作循环变量,最开始置初值为20;作R7作计数器,最开始置初值为0;用R0作指针访问片内RAM单元,最开始置初值为30H;用DJNZ指令对R2减1转移进行循环控制,在循环体中用指针R0依次取出片内RAM中的数据,判断,如为0,则R7中的内容加1程序:MOV R0,#30HMOV R2,#20MOV R7,#0LOOP:MOV A,@R0CJNE A,#0,NEXTINC R7NEXT:INC R0DJNZ R2,LOOP第第3 3章章 单片机汇编程序设计单片机汇编程序设计三.子程序调用及返回指令三.子程序调用及返回指令这类指令有四条。 两条子程序调用指令,两条返回指令1.长调用指令.长调用指令指令格式:LCALL addr16执行过程:(PC)←(PC)+3(SP)←(SP)+1(SP)←(PC)7~0(SP)←(SP)+1(SP)←(PC)15~8(PC)←addr16 该指令执行时,先将当前的PC(指令的PC加指令的字节数3)值压入堆栈保存,入栈时先低字节,后高字节然后转移到指令中addr16所指定的地方执行由于后面带16位地址,因而可以转移到程序存储空间的任一位置第第3 3章章 单片机汇编程序设计单片机汇编程序设计2.绝对调用指令.绝对调用指令指令格式:ACALL addr11执行过程:(PC)←(PC)+2(SP)←(SP)+1(SP)←(PC)7~0(SP)←(SP)+1(SP)←(PC)15~8(PC)10~0←addr11 该指令执行过程与LCALL指令类似,只是该指令与AJMP一样只能实现2KB范围内转移,执行的最后是将指令中的addr11送给PC指针的低11位 对于LCALL和ACALL两条子程序调用指令,在汇编程序中,指令后面通常带转移位置的标号,用LCALL指令调用,转移位置可以是程序存储空间的任一位置,用ACALL指令调用,转移位置与ACALL指令的下一条指令必须在同一个2KB内,即它们的高5位地址相同。 第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.子程序返回指令.子程序返回指令指令格式:RET执行过程:(PC)15~8←((SP))(SP)←(SP)-1(PC)7~0←((SP))(SP)←(SP)-1 执行时将子程序调用指令压入堆栈的地址出栈,第一次出栈的内容送PC的高8位,第二次出栈的内容送PC的低8位执行完后,程序转移到新的PC位置执行指令由于子程序调用指令执行时压入的内容是调用指令的下一条指令的地址,因而RET指令执行后,程序将返回到调用指令的下一条指令执行 该指令通常放于子程序的最后一条指令位置,用于实现返回到主程序另外,在MCS-51程序设计中,也常用RET指令来实现程序转移,处理时先将转移位置的地址用两条PUSH指令入栈,低字节在前,高字节在后,然后执行RET指令,执行后程序转移到相应的位置去执行第第3 3章章 单片机汇编程序设计单片机汇编程序设计4.中断返回指令.中断返回指令指令格式:RETI执行过程:(PC)15~8←((SP))(SP)←(SP)-1(PC)7~0←((SP))(SP)←(SP)-1 该指令的执行过程与RET基本相同,只是RETI在执行后,在转移之前将先清除中断的优先级触发器。 该指令用于中断服务子程序后面,作为中断服务子程序的最后一条指令,它的功能是返回主程序中断的断点位置,继续执行断点位置后面的指令 在MCS-51系统中,中断都是硬件中断,没有软件中断调用指令,硬件中断时,由一条长转移指令使程序转移到中断服务程序的入口位置,在转移之前,由硬件将当前的断点地址压入堆栈保存,以便于以后通过中断返回指令返回到断点位置后继续执行第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.3.5 位操作指令位操作指令 在MCS-51系统中,有17条位处理指令,可以实现位传送、位逻辑运算、位控制转移等操作一.位传送指令一.位传送指令 位传送指令有两条,用于实现位运算器C与一般位之间的相互传送MOV C,bit;C←(bit)MOV bit,C;(bit)←C 指令在使用时必须有位运算器C参与,不能直接实现两位之间的传送如果进行两位之间的传送,可以通过位运算器C来传送例【例3-15】】把片内RAM中位寻址区的20H位的内容传送到30H位程序:MOV C,20HMOV 30H,C第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.位逻辑操作指令二.位逻辑操作指令位逻辑操作指令包括位清0、置1、取反、位与和位或,总共10位指令。 1.位清0CLR C;C←0CLR bit;(bit)←02.位置1SETB C;C←1SETB bit;(bit)←13.位取反CPL C;C←/CCPL bit;(bit)←(bit)4.位与ANL C,bit;C←C∧(bit)ANL C,/bit;C←C∧(/bit)5.位或ORL C,bit;C←C∨(bit)ORL C,/bit;C←C∨(/bit)第第3 3章章 单片机汇编程序设计单片机汇编程序设计利用位逻辑运算指令可以实现各种各样的逻辑功能例例3-16】】利用位逻辑运算指令编程实现下面硬件逻辑电路的功能与或或与P1.0P1.1P1.2P1.3P1.4P1.5第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:MOV C,ANL C,CPL CORL C,MOV F0,CMOV C,ORL C,ANL C,F0CPL C,C三.位转移指令三.位转移指令位转移指令有以C为条件的位转移指令和以bit为条件的位转移指令,共5条1.以.以C条件的位转移指令条件的位转移指令JC rel; 若C=1,则转移,PC←PC+2+rel;否则程序继续执行JNC rel; 若C=0,则转移,PC←PC+2+rel;否则程序继续执行第第3 3章章 单片机汇编程序设计单片机汇编程序设计2.以.以bit为条件的位转移指令为条件的位转移指令JB bit,rel; 若(bit)=1,则转移,PC←PC+3+rel;否则程序继续执行JNB bit,rel ; 若(bit)=0,则转移,PC←PC+3+rel;否则程序继续执行JBC bit,rel ; 若(bit)=1,则转移,PC←PC+3+rel,且(bit)←0;否则程序继续执行利用位转移指令可进行各种测试。 例【例3-17】】从片外RAM中30H单元开始有100个数据,统计当中正数、0、和负数的个数,分别放于R5、R6、R7中 设用R2作计数器,用DJNZ指令对R2减1转移进行循环控制,在循环体外设置R0指针,指向片外RAM 30H单元,对R5、R6、R7清零,在循环体中用指针R0依次取出片外RAM中的100个数据,判断,如大于0,则R5中的内容加1;如等于0,则R6中的内容加1;如小于0,则R7中的内容加1第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:MOV R2,#100MOV R0,#30HMOV R5,#0MOV R6,#0MOV R7,#0LOOP:MOVX A,@R0CJNE A,#0,NEXT1INC R6SJMP NEXT3NEXT1:CLR CSUBB A,#0JNC NEXT2INC R5SJMP NEXT3NEXT2:INC R7NEXT3:INC R0DJNZ R2,LOOPSJMP $第第3 3章章 单片机汇编程序设计单片机汇编程序设计四.空操作指令四.空操作指令NOP ;PC ← PC+1 这是一条单字节指令。 执行时,不作任何操作(即空操作),仅将程序计数器PC的内容加1,使CPU指向下一条指令继续执行程序它要占用一个机器周期,常用来产生时间延迟,构造延时程序第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.4 MCS-51系列单片机汇编程序常用伪指令系列单片机汇编程序常用伪指令1..ORG伪指令伪指令格式:ORG 地址(十六进制表示)这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据从程序存储空间什么位置开始存放ORG伪指令后的地址是程序或数据的起始地址例【例3-18】】 ORG 1000HSTART:MOV A,#7FH · · ·指明后面的程序从程序存储器的1000H单元开始存放第第3 3章章 单片机汇编程序设计单片机汇编程序设计2..DB伪指令伪指令格式:[标号:] DB 项或项表 DB伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。 在定义时前面可以带标号,定义的标号在程序中是起始单元的地址例【例3-19】】 ORG 3000HTAB1: DB 12H,34HDB '5','A','abc'汇编后,各个数据在存储单元中的存放情况如下:12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H第第3 3章章 单片机汇编程序设计单片机汇编程序设计3..DW伪指令伪指令格式:[标号:] DW 项或项表 这条指令与DB相似,但用于定义字数据项或项表指所定义的一个字在存储器中占两个字节汇编时,机器自动按高字节在前低字节在后存放例【例3-20】】 ORG 3000HTAB2:DW 1234H,5678H汇编后,各个数据在存储单元中的存放情况如下:12H 34H56H78H3000H3001H3002H3003H第第3 3章章 单片机汇编程序设计单片机汇编程序设计4..DS伪指令伪指令格式:[标号:] DS 数值表达式 该伪指令用在存储器中保留一定数量的字节单元保留存贮空间主要为以后存放数据保留的字节单元数由表达式的值决定。 例【例3-21】】 ORG 2000HTAB1: DB 12H,34HDS 4HDB '5'汇编后,存储单元中的分配情况如下:12H34H----35H3000H3001H3002H3003H3004H3005H3006H第第3 3章章 单片机汇编程序设计单片机汇编程序设计5..EQU伪指令伪指令格式:符号 EQU 项 该伪指令的功能是将指令中的项的值赋予EQU前面的符号项可以是常数、地址标号或表达式以后可以通过使用该符号使用相应的项例【例3-22】】 TAB1 EQU 1000HTAB2 EQU 2000H汇编后TAB1、TAB2分别等于1000H、2000H程序后面使用1000H、2000H的地方就可以用符号TAB1、TAB2替换用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能再改变6..bit伪指令伪指令格式:符号 bit 位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后面的位地址例【例3-23】】 PLG bit F0定义后,在程序中位地址F0、就可以通过FLG和AI来使用。 第第3 3章章 单片机汇编程序设计单片机汇编程序设计7. DATA伪指令格式:符号格式:符号 DATA 直接字节地址该伪指令用于给片内RAM字节单元地址赋予DATA前面的符号,赋值后可用该符号代替DATA后面的片内RAM字节单元地址例【例3-23】】 RESULT DATA 60H MOV RESULT,A汇编后,RESULT就表示片内RAM的60H单元,程序后面用片内RAM的60H单元的地方就可以用RESULT8. XDATA伪指令格式:符号格式:符号 XDATA 直接字节地址该伪指令与DATA伪指令基本相同,只是它针对的是片外RAM字节单元例【例3-24】】 PORT1 XDATA 2000H MOV DPTR,PORT1MOVX @DPTR,A汇编后,符号PORT1就表示片外RAM的2000H单元地址,程序后面可通过符号PORT1表示片外RAM的2000H单元地址第第3 3章章 单片机汇编程序设计单片机汇编程序设计9..END伪指令伪指令格式:END 该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到END伪指令时,汇编结束。 END后面的指令,汇编程序都不予处理一个源程序只能有一个END命令,否则就有一部分指令不能被汇编第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.5 MCS-51系列单片机汇编程序设计系列单片机汇编程序设计3.5.1 运算程序【例【例3-24】多字节无符号数加法】多字节无符号数加法 设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出) 处理过程: 用R0作指针指向30H单元,用R1作指针指向40H单元,用R2为循环变量,初值为16,在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加,加得的结果放回R0指向的单元,改变R0、R1指针指向下一个单元,循环16次,在第一次循环前应先将CY清零程序流程图和程序如下:第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序:ORG 1000HMOV R0,#30HMOV R1,#40HMOV R2,#16CLR CLOOP:MOV A,@R0ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R2,LOOPEND开始#30HR0#40HR1#16R20 C@R0+@R1@R0R0+1R0R1+1R1R2-1R2R2=0?结束否是第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-26】两字节无符号数乘法】两字节无符号数乘法设被乘数的高字节放在R7中,低字节放于R6中;乘数的高字节放于R5中,低字节放于R4中。 乘得的积有4个字节,按由低字节到高字节的次序存于片内RAM中以ADDR为首址的区域中 由于MCS-51单片机只有一条单字节无符号数乘法指令MUL,而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘得的结果高字节放于B寄存器中,低字节放于累加器A中因而两字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1,R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按下面的关系加起来R7R6R5R4B1A1B2A2B3A3B4A4C2C1C4C3+第第3 3章章 单片机汇编程序设计单片机汇编程序设计即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2由B1、A2和A3相加得到,乘积的第三字节C3由B2、B3、A4以及C2部分的进位相加得到,乘积的第四字节C4由B4和低字节的进位相加得到由于在计算机内部不能同时实现多个数相加,因而我们用累加的方法来计算C2、C3和C4部分,用R3寄存器来累加C2部分,用R2寄存器来累加C3部分,用R1寄存器来累加C4部分,另外用R0作指针来依次存放C1、C2、C3、C4入存储器。 程序如下:ORG 0100HMOV R0,#ADDRMUL1:MOV A,R6MOV B,R4MUL AB ;R6R4,结果的低字节直接存入积的第一字节单元MOV @R0,A ;结果的高字节存入R3中暂存起来MOV R3,BMUL2:MOV A,R7MOV B,R4MUL AB ;R7R4,结果的低字节与R3相加后,再存入R3中ADD A,R3MOV R3,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计MOV A,B ;结果的高字节加上进位位后存入R2中暂存起来ADDC A,#00MOV R2,AMUL3:MOV A,R6MOV B,R5MUL AB ;R6R5,结果的低字节与R3相加存入积的第二字节单元ADD A,R3INC R0MOV @R0,AMOV A,R2ADDC A,B ;结果的高字节加R2再加进位位后,再存入R2中MOV R2,AMOV A,#00ADDC A,#00 ;相加的进位位存入R1中MOV R1,A第第3 3章章 单片机汇编程序设计单片机汇编程序设计MUL4:MOV A,R7MOV B,R5MUL AB ;R7R5,结果的低字节与R2相加存入积的第三字节单元ADD A,R2INC R0MOV @R0,AMOV A,BADDC A,R1 ;结果的高字节加R1再加进位位后存入积的第四字节单元INC R0MOV @R0,AEND第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-27】多字节求补运算】多字节求补运算 设在片内RAM 30H单元开始有一个8字节数据,对该数据求补,结果放回原位置。 在MCS-51系统中没有求补指令,只有通过取反末位加1得到而当末位加1时,可能向高字节产生进位因而在处理时,最低字节采用取反加1,其余字节采用取反加进位,通过循环来实现程序:ORG 0100HMOV R2,#08HMOV R0,#30HMOV A,@R0CPL AADD A,#01MOV @R0,ADEC R2LOOP:INC R0MOV A,@R0CPL AADDC A,#00MOV @R0,ADJNZ R2,LOOPEND第第3 3章章 单片机汇编程序设计单片机汇编程序设计3.5.2 数据的拼拆和转换数据的拼拆和转换【例【例3-28】设在】设在30H和31H单元中各有一个8位数据:(30H)=x7x6x5x4x3x2x1x0 (3lH)=y7y6y5y4y3y2y1y0现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果送40H单元保存,并且规定:(40H)=y2y1y0x4x3x2x1x0 利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过程:将30H单元的内容高3位屏蔽;31H单元内容的低5位屏蔽,高低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到40H单元。 程序如下:ORG 0100HMOV A,30H ANL A,#00011111BMOV 30H,AMOV A,31HANL A,#00000111B SWAP A第第3 3章章 单片机汇编程序设计单片机汇编程序设计RL A ORL A,40HMOV 40H,AEND【例【例3-29】设片内】设片内RAM的20H单元的内容为:(20H)=x7x6x5x4x3x2x1x0 把该单元内容反序后放回20H单元,即为:(20H)=x0x1x2x3x4x5x6x7 可以通过先把原内容右移一位,低位移入CF中,然后左移一位,CF中的内容移入,通过8次处理即可,由于8次过程相同,可以通过循环完成,移位过程当中必须通过累加器来处理设20H单元原来的内容先通过R3暂存,结果先通过R4暂存,R2作循环变量第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序如下:ORG 0200HMOV R3,20HMOV R4,#0MOV R2,#8LOOP: MOV A,R3RRC AMOV R3,AMOV A,R4RLC AMOV R4,ADJNZ R2,LOOPMOV 20H,R4END 另外,由于片内RAM的20H单元在位寻址区,这一问题还可以通过位处理方式来实现,这种方法留给读者自己完成。 第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-29】一位十六进制数转换成】一位十六进制数转换成ASC1I码 一位十六进制数有十六个符号0~9、A、B、C、D、E、F其中,0~9的ASCII码为30H~39H,A~F的ASCII码为41H~46H,转换时,只要判断十六进制数是在0~9之间还是在A~F之间,如在0~9之间,加30H,如在A~F之间,加37H,就可得到ASCII码设十六进制数放于R2中,转换的结果放于R2中程序如下:ORG 0200HMOV A,R2 CLR CSUBB A,#0AH ;减去0AH,判断在0~9之间,还是在A~F之间MOV A,R2JC ADD30 ;如在0~9之间,直接加30HADD A,#07H ;如在A~F之间,先加07H,再加30HADD30:ADD A,#30HMOV R2,AEND第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例3-30】一位十六进制数转换8段式数码管显示码 一位十六进制数0~9、A、B、C、D、E、F的8段式数码管的共阴极显示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。 由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到 设数放在R2中,查得的显示码也放于R2中,用MOVC A,@A+DPTR查表程序如下:ORG 0200HCONVERT:MOV DPTR,#TAB ;DPTR指向表首址MOV A,R2 ;转换的数放于AMOVC A,@A+DPTR ;查表指令转换MOV R2,ARETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;显示码表 在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位第第3 3章章 单片机汇编程序设计单片机汇编程序设计【例【例3-31】】在一温度控制系统中,温度0~100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值现在R2中给出一个0~100C的温度值,取得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。 通过用MOVC A,@A+DPTR查表,两个字节分两次取得,由DPTR指向表首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到第一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中程序如下:ORG 0300HCHECK: MOV DPTR,#TAB ;指向表首MOV A,R2 ;温度值送ARL A ;乘2得位移量MOV R1,A ;位移量暂存于R1中MOVC A,@A+DPTRMOV R3,A ;第一次查得内容送R3MOV A,R1 ;取出暂存的位移量送A第第3 3章章 单片机汇编程序设计单片机汇编程序设计INC A ;指向高字节MOVC A,@A+DPTRMOV R4,A ;第二次查得内容送R4RETTAB: DW 0056H,0059H,0067H,0076H……;电压值表3.5.3 多分支转移(散转)程序多分支转移(散转)程序一.用多分支转移指令一.用多分支转移指令JMP @A+DPTR实现的多分支转移程序实现的多分支转移程序【例【例3-32】现有】现有128路分支,分支号分别为0~127,要求根据R2中的分支信息转向各个分支的程序。 即当(R2)=0,转向OPR0(R2)=1,转向OPRl…(R2)=127,转向OPR127第第3 3章章 单片机汇编程序设计单片机汇编程序设计 先用无条件转移指令(“AJMP”或“LJMP”)按顺序构造一个转移指令表,执行转移指令表中的第n条指令,就可以转移到第n个分支,将转移指令表的首地址装入DPTR中,将R2中的分支信息装入累加器A形成变址值然后执行多分支转移指令JMP @A+DPTR实现转移程序清单如下:MOV A,R2RL A ;分支信息乘2MOV DPTR,#TAB ;DPTR指向转移指令表首址JMP @A+DPTR ;转向形成的散转地址TAB:AJMP OPR0 ;转移指令表AJMP OPR1…AJMP OPR127转移指令表中的转移指令是由转移指令表中的转移指令是由LJMP指令构成指令构成 第第3 3章章 单片机汇编程序设计单片机汇编程序设计程序如下:ORG 0200HMOV DPTR,#TAB ;DPTR指向转移指令表首址MOV A,R2 ;分支信息放累加器A中MOV B,#3MUL AB ;分支信息乘3XCH A,BADD A,DPH ;高字节调整到DPH中MOV DPH,AXCH A,BJMP @A+DPTR ;转向形成的散转地址TAB:LJMP OPR0 ;转移指令表LJMP OPR1LJMP OPR2…LJMP OPR127第第3 3章章 单片机汇编程序设计单片机汇编程序设计转移指令表中的转移指令是由AJMP指令构成,如果分支数大于128个,如分支数有256个 ORG 0200HMOV DPTR,#TAB ;DPTR指向转移指令表首址MOV A,R2 ;分支信息放累加器A中RL A ;分支信息乘2JNC NEXTINC DPH ;高字节调整到DPH中NEXT: JMP @A+DPTR ;转向形成的散转地址TAB: AJMP OPR0 ;转移指令表AJMP OPR1AJMP OPR2…AJMP OPR255第第3 3章章 单片机汇编程序设计单片机汇编程序设计二.采二.采RET指令实现的多分支程序指令实现的多分支程序用RET指令实现多分支程序的方法是:先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的地址,按先低字节,后高字节的顺序压入堆栈,然后执行RET指令,执行后则转到对应的目的位置。 例【例3-33】用】用RET指令实现根据R2中的分支信息转到各个分支程序的多分支转移程序 设各分支的目的地址分别为addr00、addr01、addr02、…addrFF程序如下:MOV DPTR,#TAB3 ;DPTR指向目的地址表MOV A,R2 ;分支信息放累加器A中RL A ;分支信息乘2JNC NEXTINC DPH ;高字节调整到DPH中NEXT: MOV R3,A ;变址放于R3中暂存MOVC A,@A+DPTR ;取目的地址低8位PUSH ACC ;低8位地址入栈第第3 3章章 单片机汇编程序设计单片机汇编程序设计MOV A,R3 ;取出R3中变址到累加器AINC A ;加1得到目的地址高8位单元的变址MOVC A,@A+DPTR ;取转向地址低8位PUSH ACC ;高8位地址入栈RET ;转向目的地址TAB3: DW addr00 ;目的地址表DW addrD0l…DW addrFF 上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。
