资源预览内容
第1页 / 共112页
第2页 / 共112页
第3页 / 共112页
第4页 / 共112页
第5页 / 共112页
第6页 / 共112页
第7页 / 共112页
第8页 / 共112页
第9页 / 共112页
第10页 / 共112页
亲,该文档总共112页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第三章 51系列指令系统和程序设计方法本章要求:1了解指令格式2掌握寻址方式3熟悉各种操作指令及使用方法4掌握51汇编语言程序设计方法。13-1 指令系统概述一 汇编指令格式标号:操作码 (目的操作数),(源操作数);注释2双字节指令双字节指令n用一个字节表示操作码,另一个字节表用一个字节表示操作码,另一个字节表示操作数或操作数所在的地址。示操作数或操作数所在的地址。n格式为:格式为:操作码操作码立即数或地址立即数或地址3三字节指令三字节指令n一个字节操作码,两个字节操作数。一个字节操作码,两个字节操作数。n格式为:格式为:操作码操作码立即数或地址立即数或地址立即数或地址立即数或地址4二 伪指令1 定位伪指令 ORG mm指出在该伪指令后的指令的汇编地址2 汇编结束伪指令 END3 赋值伪指令 符号名 EQU 表达式(或寄存器名)4 位地址赋值伪指令 符号名 BIT 位地址55 定义字节伪指令 DB x1,x2,xn或字符串Xi为单字节数据,它为十进制数或十六进制数,也可为一个表达式。6定义字伪指令 DW Y1,Y2,YnYi为双字节数据,它为十进制数或十六进制数,也可为一个表达式6三三 常用缩写符号常用缩写符号(1) Ri和Rn:表示当前工作寄存器区中的工作寄存器,i取0或1,表示R0或R1。n取07,表示R0R7。(2)#data:表示包含在指令中的8位立即数。(3)#data16:表示包含在指令中的16位立即数。(4)rel:以补码形式表示的8位相对偏移量,范围为 -128127,主要用在相对寻址的指令中。7(5)addr16和addr11:分别表示16位直接地址和11位直接地址。(6) direct:表示直接寻址的地址。 (7) bit:表示可位寻址的直接位地址。 (8) (X):表示X寄存器中的内容。X为寄存器名。 (9) (X):表示以X寄存器的内容为地址的存储器单元内容,即(X)作地址,该地址单元的内容用(X)表示。 83-2 寻址方式寻址方式一一 寄存器寻址寄存器寻址 寄存器寻址是对由指令选定的工作寄存寄存器寻址是对由指令选定的工作寄存器器(R0R7)、ACC、B、DPTR、CY中中的数进行读的数进行读/写,其中写,其中R0R7由操作由操作码码低低3位表示,位表示,ACC、B、DPTR、CY则隐含在则隐含在操作操作码中码中。例:例:MOV A,R19二二 直接寻址直接寻址 直接寻址是指令直接给出操作数地址,直接寻址是指令直接给出操作数地址,该地址指出了参与运算或传送的数据所在的该地址指出了参与运算或传送的数据所在的字节单元或位的地址。字节单元或位的地址。 例:例:MOV A, 65H 可访问可访问SFR、内部数据存储器的低、内部数据存储器的低128字节,位地址空间。字节,位地址空间。注意:若直接寻址的地址是注意:若直接寻址的地址是SFR中的某一个时,中的某一个时,可用名称符号可用名称符号MOV A,TH0 MOV A,8CH10三三 寄存器间接寻址寄存器间接寻址 寄存器间接寻址寄存器间接寻址(用符号用符号表示表示)是将指定是将指定的寄存器内容为地址,由该地址所指定的单的寄存器内容为地址,由该地址所指定的单元内容作为操作数。元内容作为操作数。例:例:MOV A, R0 用用R0、R1来寻址内部来寻址内部RAM(000FFH),用用R0、R1、DPTR来访问外部来访问外部RAM。强调强调:寄存器中的内容不是操作数本身,而是操作数:寄存器中的内容不是操作数本身,而是操作数的地址,到该地址单元中才能得到操作数。寄存器的地址,到该地址单元中才能得到操作数。寄存器起地址指针的作用。起地址指针的作用。11若若R1中的内容为中的内容为80H,片内,片内RAM地址为地址为80H的单元中的内容为的单元中的内容为2FH,则执行该指令后,则执行该指令后,片内片内RAM 80H单元的内容单元的内容2FH被送到被送到A中。中。例:例:MOV A,R112四四 立即数寻址立即数寻址 立即寻址是由指令直接给出操作数来立即寻址是由指令直接给出操作数来寻址。即操作数包含在指令字节中。寻址。即操作数包含在指令字节中。例:例: MOV A,#62H(注:注:“#”为立即数指示符号为立即数指示符号)该寻址方式多为双字节指令。但有一条为该寻址方式多为双字节指令。但有一条为3字节字节MOV DPTR ,#3F6AH13五五 变址间接寻址变址间接寻址 以以PC或或DPTR作为基址寄存器,以累作为基址寄存器,以累加器加器A作为变址寄存器,这二者内容之和作为变址寄存器,这二者内容之和为程序存储器地址。多用于查表指令。为程序存储器地址。多用于查表指令。仅有仅有3条:条:MOVC A, A+DPTR(单字节单字节) MOVC A, A+PC JMP A+DPTR只能对只能对ROM进行寻址。进行寻址。 1415六六 相对寻址相对寻址 以以PC的当前值为基准的当前值为基准(实际为本指令实际为本指令之后的字节地址之后的字节地址),加上指令中给出的相,加上指令中给出的相对偏移量形成有效地址。用于访问对偏移量形成有效地址。用于访问ROM例:例: JC 80H 注意:偏移量是有符号数,在注意:偏移量是有符号数,在-128+127之间。之间。16七七 位寻址位寻址 对片内对片内RAM的位寻址区和某些的位寻址区和某些可进行位寻址的可进行位寻址的SFR中的任一二进中的任一二进制位进行位操作时的寻址方式。制位进行位操作时的寻址方式。例:例:SETB 3DH17n位地址和字节地址的区分通过指令区分:位地址和字节地址的区分通过指令区分:nMOV A,20HnMOV C,20Hn可供位寻址的区域可供位寻址的区域n片内片内RAM的的20H2FH为位寻址空间为位寻址空间(007FH)n某些某些SFR:凡是地址能被:凡是地址能被8整除的整除的SFRn位地址的表示方法位地址的表示方法nMOV C,ACC.7nMOV 20H,C nMOV 24H.0,CnSETB TR018 总结:总结:1 立即寻址立即寻址 : ROM2 直接寻址直接寻址 : 片内片内RAM低低128B和和SFR、位地址空间位地址空间3 寄存器寄存器寻址寻址 :工作:工作寄存器寄存器R0R7, A, B,C,DPTR4 寄存器间接寄存器间接寻址:寻址:片内片内RAM低低128B和片外和片外RAM195 变址间接寻址:变址间接寻址:ROM6 相对寻址:相对寻址: ROM 256B 范围范围7 位寻址:位寻址: 片内片内RAM的的20H2FHB地址和地址和 部分部分SFR203-3 指令类型指令类型 51系列汇编语言是用系列汇编语言是用42种操作码助记符描种操作码助记符描述述33种操作功能,一种功能可能有几种助种操作功能,一种功能可能有几种助记符,与寻址方式结合共产生记符,与寻址方式结合共产生111条指令。条指令。n数据传送类:数据传送类:29条条n算术运算类:算术运算类:24条条n逻辑运算类:逻辑运算类:24条条n控制转移类:控制转移类:17条条n位操作类:位操作类: 17条条213-4 数据传送指令数据传送指令22233-4-1 内部数据一般传送指令内部数据一般传送指令 该类指令的功能是实现数在片内该类指令的功能是实现数在片内RAM单单元之间、寄存器之间、寄存器与元之间、寄存器之间、寄存器与RAM单元之单元之间的传送。所有指令具有统一的格式:间的传送。所有指令具有统一的格式: MOV ,; 操作码助记符都是操作码助记符都是MOV,目的操作数,目的操作数和源操作数不同寻址方式的组合就派生出该类和源操作数不同寻址方式的组合就派生出该类的全部指令。记忆这类指令的关键在于掌握两的全部指令。记忆这类指令的关键在于掌握两个操作数的各种寻址方式的组合关系。个操作数的各种寻址方式的组合关系。24访问片内RAM的一般传送指令操作关系图访问片内访问片内RAM的一般传送指令操作关系图的一般传送指令操作关系图25一 累加器为目的操作数的指令MOV A,RnMOV A,directMOV A,RiMOV A,#data 26二 寄存器为目的操作数的指令MOV Rn, AMOV Rn, directMOV Rn, #data27三 直接地址为目的操作数的指令MOV direct, A 例: MOV 20H, AMOV direct, Rn MOV 20H, R1MOV direct1,direct2 MOV 20H, 30HMOV direct, Ri MOV 20H, R1MOV direct, #data MOV 20H, #34H28四 间接地址为目的操作数的指令 MOV Ri, A 例:MOV R0,A MOV Ri, direct MOV R1,20H MOV Ri, #data MOV R0,#34H五 16位数据传送指令 MOV DPTR,#data16 29例例1 设内部设内部RAM(30H)=40H,(40H)=10H,(10H)=00H (P1)=CAH,分析以下程序执行后各单元及寄存器、,分析以下程序执行后各单元及寄存器、P2口的内容。口的内容。MOV R0,#30H;(R0)30HMOV A,R0;(A)(R0)MOV R1,A;(R1)(A)MOV B,R1;(B)(R1)MOV R1,P1;(R1)(P1)MOV P2,P1;(P2)(P1)MOV 10H,#20H;(10H)20H 执行上述指令后的结果为:执行上述指令后的结果为:(R0)=30H,(R1)=(A)=40H,(B)=10H,(40H)=(P1)=(P2)=CAH,(10H)=20H。303-4-2片内特殊传送指令片内特殊传送指令 1堆栈操作指令堆栈操作指令 堆栈操作有进栈和出栈,即压入和弹出数据,常堆栈操作有进栈和出栈,即压入和弹出数据,常用于保存或恢复现场。进栈用于保存或恢复现场。进栈/出栈指令用于保存出栈指令用于保存/恢复恢复片内片内RAM单元单元(低低128字节字节)或特殊功能寄存器或特殊功能寄存器SFR的的内容。内容。 31 PUSH direct ;sp+1 sp,(direct) (sp) POP direct ; (sp) (direct), sp-1 sp注意:注意:1 留出足够的存储单元作栈区,避免数据重叠。留出足够的存储单元作栈区,避免数据重叠。 2 使用使用堆栈时,一般要重设堆栈时,一般要重设SP的初始值。由于压的初始值。由于压入堆栈的第一个数必须存放在入堆栈的第一个数必须存放在SP+1存储单元,故实际存储单元,故实际栈顶是在栈顶是在SP+1所指出的单元。所指出的单元。32例:已知片内例:已知片内RAM50H单元中存放数值单元中存放数值AAH,设,设堆栈指针为堆栈指针为30H,把此数值压入,把此数值压入堆栈,然后再弹出到堆栈,然后再弹出到40H单元中。单元中。 MOV SP,#30H;30H SP PUSH 50H; SP+1 SP, (50H) (31H) POP 40H ; (31H) (40H), SP-1 SP40单元内装入数值单元内装入数值AAH,SP终值为终值为30H33 2数据交换指令数据交换指令 数据传送指令一般都是将操作数自源地址单元传送到目数据传送指令一般都是将操作数自源地址单元传送到目的地址单元,指令的地址单元,指令 执行后,源地址单元的操作数不变,执行后,源地址单元的操作数不变,目的地址单元的操作数则修改为源地址单元的操作数。目的地址单元的操作数则修改为源地址单元的操作数。交换指令数据作双向传送,涉及传送的双方互为源地址、交换指令数据作双向传送,涉及传送的双方互为源地址、目的地址,指令执行后每方的操作数都修改为另一方的目的地址,指令执行后每方的操作数都修改为另一方的操作数。因此,两操作数均未冲掉、丢失。数据交换指操作数。因此,两操作数均未冲掉、丢失。数据交换指令共有如下令共有如下5条指令:条指令:3435例例3 设设(R0) = 30H,30H = 4AH,(A) = 28H,则执行,则执行XCH A, R0后,结果为后,结果为(A) = 4AH,(30H) = 28H。XCHD A,R0后,结果为后,结果为(A) = 2AH,(30H) = 48H。SWAP A后,结果为后,结果为(A) = 82H。363-4-3片外数据存储器数据传送指令片外数据存储器数据传送指令 CPU对外对外RAM的访问的访问只能只能用寄存器用寄存器间接寻址的方式,间接寻址的方式,通过累加器通过累加器A来完成,来完成,且仅有且仅有4条指令。条指令。 由于由于51系统中没有专门对外设的系统中没有专门对外设的I/O指令,而片外扩展的指令,而片外扩展的I/O口与片外口与片外RAM是统一编址,所以该指令可作为输入是统一编址,所以该指令可作为输入/输输出指令,用于和外部设备间传送。出指令,用于和外部设备间传送。37MOVX A, DPTRMOVX A, RiMOVX DPTR, AMOVX Ri, A (i=0,1)38例例1 把片内把片内6AH单元中数取出,传送单元中数取出,传送到外部到外部RAM单元单元3000H单元中。单元中。 MOV DPTR, #3000H MOV A, 6AH MOVX DPTR, A39例例2 现有一输入设备口地址现有一输入设备口地址E000H,在,在这个口中已有数字量这个口中已有数字量89H,欲将此值读,欲将此值读入入ACC。 MOV DPTR, #0E000H MOVX A, DPTR40 3-4-4访问程序存储访问程序存储 器的数据传送指令器的数据传送指令 又称作查表指令,采用基址寄存器加变又称作查表指令,采用基址寄存器加变址寄存器间接寻址方式,把程序存储器址寄存器间接寻址方式,把程序存储器中存放的表格数据读出,传送到累加器中存放的表格数据读出,传送到累加器A,两条指令均为单字节指令。,两条指令均为单字节指令。41一一 MOVC A,A+PC功能:将功能:将新新的的PC内容与累加器内容与累加器A内内8位无符位无符号数相加形成地址,取出该地址单元中的号数相加形成地址,取出该地址单元中的内容送累加器内容送累加器A。注意:注意:查表范围只能在查表范围只能在256个字节范围内个字节范围内二二 MOVC A, A+DPTR功能:以功能:以DPTR为基址寄存器进行查表。允为基址寄存器进行查表。允许数表存放在程序存储器的任意单元。许数表存放在程序存储器的任意单元。42例例 ORG 8000H MOV A, #30H MOVC A, A+PC ORG 8030H DB ABCDEFGHI 执行结果执行结果 (A)= ?43例例 ORG 1004H MOV A, #10H MOV DPTR, #7000H MOVC A, A+DPTR ORG 7010H DB 02,04,06,08执行结果执行结果:(A)=?, PC=?443-5 算术运算指令算术运算指令 加减法指令形式结构图加减法指令形式结构图(a) 加减法指令关系图;加减法指令关系图;(b) 加加1、减、减1指令关系图指令关系图 4546注意:注意:对对INC direct 和和DEC direct两条指两条指令,若直接地址是令,若直接地址是P0P3端口,则端口,则进行进行“读读改改写写”操作。其功能是修操作。其功能是修改输出口的内容。即先读入端口的改输出口的内容。即先读入端口的内容,然后在内容,然后在CPU中加中加(减减)1,再输,再输出到端口。出到端口。读入内容来自端口锁存读入内容来自端口锁存器而不是引脚器而不是引脚。47例:设例:设(A)=53H,(R0)=0FCH,执行指令:执行指令: ADD A, R0 0 1 0 1 0 0 1 1 +)1 1 1 1 1 1 0 0 (1)0 1 0 0 1 1 1 1结果结果(A)=4FH,CY=1,AC=0,OV=0,P=1注意:对标志注意:对标志AC、CY、OV、P位的影响位的影响48例:编写例:编写1234H+0FE7H的程序,和的高的程序,和的高8位存入位存入41H单元,低单元,低8位存入位存入40H单元。单元。 MOV A, #34H ADD A, #0E7H MOV 40H, A MOV A, #12H ADDC A, #0FH MOV 41H, A49 1 该指令功能是对该指令功能是对BCD码的加法结果进行调整的。码的加法结果进行调整的。它是一条单字节指令。它是一条单字节指令。 2 两个压缩两个压缩BCD码按二进制相加,必须在加法码按二进制相加,必须在加法指令指令ADD、ADDC后,经过本指令调整后才能后,经过本指令调整后才能得到正确的压缩得到正确的压缩BCD码和数,实现十进制的加码和数,实现十进制的加法运算。法运算。DA A 十进制调整指令十进制调整指令5051n十进制调整的修正方法:十进制调整的修正方法:1 当当A低低4位大于位大于9或半进位标志或半进位标志AC=1时,则进行低时,则进行低4位加位加6修正;修正;2 当当A高高4位大于位大于9或进位标志或进位标志CY=1时,时,则进行高则进行高4位加位加6修正。修正。52例例 对对BCD码加法码加法65 + 58BDH,进行十进制调整。,进行十进制调整。 参考程序如下:参考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十进制调整;十进制调整5354乘法指令乘法指令 MUL AB功能是把累加器功能是把累加器A和寄存器和寄存器B中的两个中的两个8位无符号数相乘,位无符号数相乘,将乘积将乘积16位数中的低位数中的低8位存放在位存放在A中,高中,高8位存放在位存放在B中。中。若乘积大于若乘积大于FFH(255),则溢出标志,则溢出标志OV置置1,否则,否则OV清零。清零。乘法指令执行后进位标志乘法指令执行后进位标志CY总是零,即总是零,即CY=0。55 DIV AB功能是把累加器功能是把累加器A中的中的8位无符号整数除以寄存器位无符号整数除以寄存器B中中的的8位无符号整数,所得商存于累加器位无符号整数,所得商存于累加器A中,余数存中,余数存于寄存器于寄存器B中,进位标志位中,进位标志位CY和溢出标志位和溢出标志位OV均被均被清零。若清零。若B中的内容为中的内容为0时,溢出标志时,溢出标志OV被置被置1,即,即OV=1,而,而CY仍为仍为0。除法指令除法指令563-6 逻辑运算及移位指令逻辑运算及移位指令逻辑指令形式结构图逻辑指令形式结构图 57 逻辑操作指令表逻辑操作指令表5859 例例 (P1)=C5H=11000101B,屏蔽,屏蔽P1口高口高4位而保留位而保留低低4位。位。 执行指令:执行指令:ANL P1,#0FH 结果为:结果为:(P1)=05H=00000101B。 逻辑逻辑“与与”指令常用来指令常用来屏蔽屏蔽(置置0)字节中某些位。字节中某些位。若清除某位,则用若清除某位,则用“0”和该位相与;若保留某位,和该位相与;若保留某位,则用则用“1”和该位相与。和该位相与。60例例 若若(A)=C0H,(R0)=3FH,(3FH)=0FH, 执行指令:执行指令:ORL A,R0 结果为:结果为:(A)=CFH=11001111B。 逻辑逻辑“或或”指令常用来使字节中某些指令常用来使字节中某些位置位置“1”,其它位保持不变。则欲置位的位用,其它位保持不变。则欲置位的位用“1”与与该位相或,保留不变的位用该位相或,保留不变的位用“0” 与该位相或。与该位相或。61 逻辑逻辑“异或异或”指令常用来使字节中指令常用来使字节中某些位进行某些位进行取反取反操作,其它位保持操作,其它位保持不变。欲某位取反该位与不变。欲某位取反该位与“1”相异或;相异或;欲某位保留则该位与欲某位保留则该位与“0” 相异或。相异或。62n例:把累加器例:把累加器A中数据的低中数据的低4位送入位送入外部数据存储器的外部数据存储器的3000H单元中。单元中。nMOV DPTR, #3000HnANL A, #0FHnMOVX DPTR,A结论:某位与结论:某位与“0”相与,则该位被屏蔽相与,则该位被屏蔽为为“0”。63例:将累加器例:将累加器A中低中低4位的状态通过位的状态通过P1口口的高的高4位输出。位输出。 ANL A,#0FH;屏蔽高屏蔽高4位位 SWAP A ;高、低半字节交换;高、低半字节交换 ANL P1,#0FH;清;清P1口高口高4位位 ORL P1,A643-7 位操作指令位操作指令 位操作也称布尔变量操作,它是以位位操作也称布尔变量操作,它是以位(bit)作作为单位来进行运算和操作的。为单位来进行运算和操作的。51单片机内部有一单片机内部有一个功能相对独立的布尔处理机,它有借用进位标个功能相对独立的布尔处理机,它有借用进位标志志CY作为位累加器,有位存储器作为位累加器,有位存储器(即位寻址区中即位寻址区中的各位的各位),指令系统中有,指令系统中有17条专门进行位处理的条专门进行位处理的指令集。位处理指令可以完成以位为对象的数据指令集。位处理指令可以完成以位为对象的数据转送、运算、控制转移等操作。转送、运算、控制转移等操作。653-7 位操作指令位操作指令位地址的表达方式:位地址的表达方式:1 直接地址方式:如直接地址方式:如 D4H2 字节寄存器名加位数方式:如字节寄存器名加位数方式:如 PSW.4 ,(D0).43 位名称方式:如位名称方式:如 RS16667一一 位变量传送指令位变量传送指令 MOV C, bit 或或 MOV bit, C注:两个操作数中必须有一个为位累注:两个操作数中必须有一个为位累加器加器C二二 位变量修改指令位变量修改指令1 CLR C 或或 CLR bit2 CPL C 或或 CPL bit3 SETB C 或或 SETB bit68三三 位变量逻辑操作指令位变量逻辑操作指令 1 ANL C, bit 2 ANL C,/bit 3 ORL C, bit 4 ORL C, /bit69例:设例:设P1口为输入口,口为输入口,P3.0为输出口,为输出口,执行下列命令:执行下列命令: MOV C, P1.0 ANL C, P1.1 ANL C, /P1.2 MOV P3.0, C 结果:结果:P3.0=(P1.0) (P1.1) (P1.2)703-8 控制转移指令控制转移指令4-8-1 无条件转移指令无条件转移指令一一 AJMP addrll (2字节指令字节指令)AJMP的机器码是由的机器码是由11位直接地址位直接地址addr11和指令和指令操作码操作码00001,按下列分布组成的:,按下列分布组成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a071 该指令执行后,程序转移的目的地址是由该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址指令所在位置的地址PC值加上该指令字节数值加上该指令字节数2,构成当前构成当前PC值。值。取当前取当前PC值的高值的高5位与指令中提位与指令中提供的供的11位直接地址形成转移的目的地址位直接地址形成转移的目的地址,即,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0转移目的转移目的地址地址(PC)72 例:若例:若AJMP指令地址指令地址(PC)=2300H。执行指令。执行指令 AJMP 0FFH后,结果:转移目的地址后,结果:转移目的地址(PC)=20FFH,程序向前转到,程序向前转到20FFH单元开始执行。单元开始执行。 又如:若又如:若AJMP指令地址指令地址(PC)=2FFFH。执行指令。执行指令AJMP 0FFH后,结果为:转移目的地址后,结果为:转移目的地址(PC)=30FFH,程序向后转到,程序向后转到30FFH单元开始执行。单元开始执行。73二二 SJMP rel (2字节指令字节指令) rel为为8位带符号数位带符号数例:例:2100 SJMP 7FH 程序转到程序转到PC=2102+7F=2181H 若若 rel=F0H,则转移的,则转移的PC=20F2H。(用符号位扩展的方法计算用符号位扩展的方法计算) 74三三 LJMP addr 16 (3字节指令字节指令) 该指令执行后,程序无条件地转向该指令执行后,程序无条件地转向16位目标地址位目标地址(addr16)处执行,不影响标志处执行,不影响标志位。这条指令可以使程序从当前地址转移位。这条指令可以使程序从当前地址转移到到64 KB程序存储器地址空间的任意地址,程序存储器地址空间的任意地址,故得名为故得名为长转移长转移。该指令的缺点是执行。该指令的缺点是执行时间长,字节多。时间长,字节多。75四四 JMP A+DPTR(散转指令散转指令) 累加器中累加器中8位无符号数与数据指针位无符号数与数据指针DPTR中的中的16位数相加,作为下条指令位数相加,作为下条指令地址送入地址送入PC。该指令的特点是转移地址该指令的特点是转移地址可以在程序运行中加以改变。可以在程序运行中加以改变。76例:累加器例:累加器A中存放待处理命令编号中存放待处理命令编号(0-7),ROM中存放着标号为中存放着标号为PMTB的转移表,根据的转移表,根据A内命内命令编号转向相应的命令处理程序。令编号转向相应的命令处理程序。 MOV R1, A RL A ADD A, R1 MOV DPTR, #PMTB JMP A+DPTRPMTB: LJMP PM0;转向命令转向命令0处理入口处理入口 LJMP PM1;转向命令转向命令1处理入口处理入口 773-8-2 条件转移指令条件转移指令 该该 类指令是当某种条件满足时,程序类指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺转移执行;条件不满足时,程序仍按原来顺序执行。由于该类指令采用相对寻址,因此序执行。由于该类指令采用相对寻址,因此程序可在以当前程序可在以当前PC值为中心的值为中心的-128+127范围内转移。范围内转移。一一 测试条件符合转移指令测试条件符合转移指令 1 JZ rel ;若;若(A)=0,则转移,则转移 2 JNZ rel ;若;若(A)不为不为0,则转移,则转移 3 JC rel ;若;若(C)=1,则转移,则转移 4 JNC rel ;若;若(C)=0,则转移,则转移 785 JB bit, rel ;若若(bit)=1,则转移,则转移 6 JNB bit, rel ;若;若(bit)=0,则转移,则转移 7 JBC bit, rel ;若;若(bit)=1,则转移,则转移 且清且清“0”直接寻址的位。直接寻址的位。79二二 比较不相等转移指令比较不相等转移指令 CJNE A, direct, rel CJNE A, #data, rel CJNE Rn, #data, rel CJNE Ri, #data, rel 先对两个规定的操作数进行比较,根据比先对两个规定的操作数进行比较,根据比较的结果来决定是否转移。若两个操作数相等,较的结果来决定是否转移。若两个操作数相等,则不转移,程序顺序执行;若两个操作数不等,则不转移,程序顺序执行;若两个操作数不等,则转移。如果第一操作数小于第二操作数,则则转移。如果第一操作数小于第二操作数,则置位进位标志置位进位标志CY,否则清,否则清0CY。80 例:温度控制系统,例:温度控制系统,A中存采样温度值中存采样温度值Ta,(20)=温度下限值温度下限值T20,(30)=温度上限温度上限值值T30, 若若TaT30程序转程序转降温降温JW,若,若T30 Ta T20程序转至程序转至FH81 CJNE A, 30H, LOOP AJMP FHLOOP: JNC JW CJNE A, 20H, LOOP1 AJMP FHLOOP1: JC SW FH:. JW: SW:82三三 减一不为减一不为0转移指令转移指令 DJNZ Rn, rel DJNZ direct, rel 每执行一次指令,就把第一操作数减每执行一次指令,就把第一操作数减1,并把结果仍保存在第一操作数中,然,并把结果仍保存在第一操作数中,然后判断是否为零。若不为零,则转移到后判断是否为零。若不为零,则转移到指定的地址单元,否则顺序执行指定的地址单元,否则顺序执行.83n例:延时程序例:延时程序START: SETB P1.1 DL: MOV 30H, #03H DL0: MOV 31H, #0F0H DL1: DJNZ 31H, DL1 DJNZ 30H, DL0 CPL P1.1 AJMP DL843-8-3 调用和返回指令调用和返回指令 子程序调用指令有长调用和子程序调用指令有长调用和绝对调用两条,它们都是双周期绝对调用两条,它们都是双周期指令。指令。85一一 短调用指令短调用指令 ACALL addr1186 ACALL与与AJMP一样提供一样提供11位地址,位地址,只能调用与只能调用与PC在同一在同一2 KB范围内的范围内的子程序。由于该指令为子程序。由于该指令为2字节指令,字节指令,所以执行该指令时应执行所以执行该指令时应执行(PC)(PC)+2以获得下一条指令地以获得下一条指令地址,并把该地址压入堆栈作为返回址,并把该地址压入堆栈作为返回地址。地址。87二长调用指令二长调用指令 LCALL addrl688LCALL与与LJMP一样提供一样提供16位地址,可调位地址,可调用用64 KB范围内的子程序。由于该指令为范围内的子程序。由于该指令为3字节,所以执行该指令时首先应执行字节,所以执行该指令时首先应执行(PC)(PC)+3,以获得下一条指令地址,以获得下一条指令地址,并把此时的并把此时的PC内容压入堆栈内容压入堆栈(先压入低字先压入低字节,后压入高字节节,后压入高字节)作为返回地址,堆栈作为返回地址,堆栈指针指针SP加加2指向栈顶,然后把目的地址指向栈顶,然后把目的地址addr16送入送入PC。89n例:如图所示,在例:如图所示,在P1.0P1.3分别分别装有两个红灯和两个绿灯,写出对应装有两个红灯和两个绿灯,写出对应的红绿灯定时切换程序。的红绿灯定时切换程序。90MAIN: MOV A, #03HML: MOV P1, A ACALL DLMXCH: CPL A AJMP MLDL: MOV R7, #0A3HDL1: MOV R6, #0FFH DL6: DJNZ R6, DL6 DJNZ R7, DL1 RET91返回指令返回指令 返回指令共两条:一条是子程序返回指令返回指令共两条:一条是子程序返回指令RET,另一条是从中断服务程序返回指令,另一条是从中断服务程序返回指令RETI。92从上述两条指令的功能操作看,都是从堆栈中弹出返回从上述两条指令的功能操作看,都是从堆栈中弹出返回地址送地址送PC,堆栈指针减,堆栈指针减2,但它们下面两点不同:,但它们下面两点不同: (1) 从使用上,从使用上,RET指令必须作子程序的最后一条指令;指令必须作子程序的最后一条指令;RETI必须作中断服务程序的最后一条指令。必须作中断服务程序的最后一条指令。 (2) RETI指令除恢复断点地址外,还恢复指令除恢复断点地址外,还恢复CPU响应中断响应中断时硬件自动保护的现场信息。执行时硬件自动保护的现场信息。执行RETI指令后,将清指令后,将清除中断响应时所置位的优先级状态触发器,使得已申除中断响应时所置位的优先级状态触发器,使得已申请的同级或低级中断申请可以响应;而请的同级或低级中断申请可以响应;而RET指令只能指令只能恢复返回地址。恢复返回地址。93 空操作指令空操作指令 NOP ;(PC)(PC)+1 该指令是一条单字节单周期指令。它控制该指令是一条单字节单周期指令。它控制 CPU不不做任何操作,仅仅是消耗这条指令执行所需要的一做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志位,故称为空个机器周期的时间,不影响任何标志位,故称为空操作指令。操作指令。NOP指令在设计延时程序、拼凑精确延指令在设计延时程序、拼凑精确延时时间及在程序等待或修改程序等场合是很有用的。时时间及在程序等待或修改程序等场合是很有用的。 943-9 程序设计方法程序设计方法3-9-1 程序设计的步骤程序设计的步骤n分析问题n确定算法n设计程序框图n确定数据格式、分配工作单元,细化程序框图n编写汇编语言程序n程序测试n程序优化953-9-2 程序框图和程序结构程序框图和程序结构程序框图n执行框执行框:以矩形框表示,框内写上某些操作。n判断框判断框:以 或 表示,框内写上判断的条件,根据条件是否满足控制执行不同的操作。n开始框开始框:以 表示,表示程序的开始。n结束框结束框:以 表示,表示程序的结束。963-9-3 循环程序设计1 循环初态循环初态n即设置循环过程中工作单元的初始值。例如:设置循环次数计数器、地址指针初值等。2 循环体循环体n即重复执行的程序段部分。完成主要的计算或操作任务,也包括对地址指针的修改。3 循环终止控制循环终止控制n当循环次数已知时,循环终止控制一般采用计数方法,即用一个寄存器寄存器(R0R7或内部RAM单元)作为循环次数计数器。用DJNZ指令实现计数方法的循环终止控制。97例:如果Xi为单字节数,并按i顺序存放在内部RAM从50H开始的单元中,n放在R2中,现在要求它们的和(双字节),放在R3R4中,编制相应的程序。NSUN:MOV R3,#0 MOV R4,#0 MOV R0,#50HLOOP :MOV A, R4 ADD A, R0 MOV R4, A CLR A ADDC A, R3MOV R3, AINC R0DJNZ R2, LOOPRET98n当循环次数未知时,需要根据某种条件来判断是否应该终止循环。常用条件转条件转移指令移指令来控制循环的结束。99例:设在外部RAM中有一个ASCII字符串,它的首地址在DPTR中,字符串以0结尾。现在要求用串行口把它发送出去。在串行口已经初始化(TI置1)的条件下,写出程序。SOUT:MOVX A,DPTR JNZ SOT1 RETSOT1: JNB TI,SOT1 CLR TI MOV SBUF,A INC DPTR SJMP SOUT100多重循环 例:编写50ms的延时子程序DEL: MOV R7,#200DEL1:MOV R6,#125DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET精确延时DEL: MOV R7,#200DEL1:MOV R6,#123 NOPDEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET101注意:n循环程序的执行是有条件的,要避免避免从循环体外直接转到循环体内部。n在多重循环嵌套程序中,不要在外层循环中用转移指令直接转到内层循环体中。n循环体内可以直接转到循环体外或外层循环中,可实现一个循环由多个条件控制结束的结构。102循环程序的优化n一般从改进算法、选用合适的指令和工作单元等考虑,以达到缩短执行时间缩短执行时间的要求。1033-9-4 子程序设计和参数传递方法编写子程序时注意以下几点:n给每个子程序赋一个名字(即入口地址代号)n正确传递参数要有入口条件、出口条件n保护现场和恢复现场104参数传递常用方法一用工作寄存器或累加器来传递n将入口参数或出口参数放在工作寄存器或累加器中。n程序最简单、运算速度最高n传递数据有限,主程序必须先将数据送到工作寄存器,参数个数固定。105二用指针寄存器传递n参数在内部RAM中,可R0或R1做指针;参数在外部RAM或ROM,可用DPTR做指针。n用指针指示数据的位置,节省传递数据的工作量,实现可变长度运算。106三用堆栈传递参数n调用时,主程序用PUSH指令把参数压入堆栈。子程序按栈指针间接访问堆栈中参数。n返回主程序后,用POP指令得到结果。n该方法简单,能传递大量参数,不需为特定的参数分配存储单元。107四 程序段参数传递n需要传递大量参数,且参数为常数时适用。n调用时,常数作为程序代码的一部分,紧跟在调用子程序后面。108课堂练习课堂练习一判断下列指令正误:一判断下列指令正误: 1 INC R1 2 DEC DPTR 3 MOV 40H, R1 4 MOV P1.0, 0 5 MOV 20H, 21H 6 ANL 20H, #0F0H109二二 设设(R1)=20H,(20H)=AAH,则下则下面程序执行完后面程序执行完后A的内容是多少。的内容是多少。 MOV A, #55H ANL A, #0FFH ORL 20H, A XRL A, R1 CPL A110三三 写出程序功能写出程序功能 ORG 0000H MAIN: MOV DPTR, #TAB MOV R1, #06H LP: MOVX A, DPTR MOV P1, A LCALL DELAY 0.5S INC DPTR DJNZ R1, LP111 AJMP MAINTAB: DB 01H, 03H, 02H, 06H, 04H, 05HDELAY 0.5S:. RET END四四 编写一个程序段,将内部编写一个程序段,将内部30H3FH内容,传送到外部内容,传送到外部RAM的的8000H800FH之中。之中。112
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号