
电子科大单片机4.ppt
61页第三讲:指令与编程本讲重点:本讲重点: 寻址方式;寻址方式; MCS-51MCS-51指令集;指令集; 伪指令;伪指令; 汇编语言与简单程序设计汇编语言与简单程序设计. .第三部分 指令系统及程序设计5151系列单片机指令集含有系列单片机指令集含有111111条指令条指令 每条指令在执行时要花去一定的每条指令在执行时要花去一定的时间时间,以机器,以机器周期为单位按指令周期为单位按指令执行时间执行时间分类:分类:单周期单周期(64(64条条););双周期双周期(45(45条条););4 4周期周期(2(2条条) )按指令的按指令的功能功能分类,可分为分类,可分为5 5大类:大类:数据传送类数据传送类((2929条);条);算术运算类算术运算类((2424条)条)逻辑运算及移位类逻辑运算及移位类((2424););控制转移类控制转移类((1717条)条)位操作类位操作类((1717条)条)每条指令在程序存储器每条指令在程序存储器ROMROM中占据一定的中占据一定的空间空间,,以字节为单位按指令以字节为单位按指令所占字节数所占字节数分类:分类:单字节单字节(49(49条条););双字节双字节(46(46条条););3 3字节字节(16(16条条) )ASM-51指令的格式 P46¨方括符方括符[ ][ ]表示可选项表示可选项¨标标号号代代表表指指令令所所在在地地址址,,1-81-8个个字字母母/ /数数字字,,“: :”结尾结尾¨操作码操作码就是指令功能助记符,指令实体就是指令功能助记符,指令实体¨目的操作数目的操作数¨源操作数源操作数¨注释注释,以,以“; ;”开头开头[ [标号标号: :] ]操作码操作码 [ [目的操作数目的操作数][][, ,源操作数源操作数][][; ;注释注释] ]51单片机指令的寻址方式 P48¨寄存器寻址寄存器寻址¨立即寻址立即寻址¨寄存器间接寻址寄存器间接寻址¨直接寻址直接寻址¨变址寻址变址寻址( (基址寄存器基址寄存器+ +变址寄存器间接寻址变址寄存器间接寻址) )¨相对寻址相对寻址¨位寻址位寻址寻址方式:寻址方式:指令按地址获得操作数的方式指令按地址获得操作数的方式七种寻址方式七种寻址方式, ,一条指令可能含多种寻址方式一条指令可能含多种寻址方式寄存器寻址寄存器寻址从从寄存器寄存器中读取操作数中读取操作数或或存放操作数进存放操作数进寄存器寄存器例:例:MOV AMOV A,,B B ;; ((A A)) ← ←((B B)) MOV 30HMOV 30H,,R0R0 ;;((30H30H))←←((R0R0)) MOV AMOV A,,R1 R1 ;; ((A A)) ← ←((R1R1))立即寻址立即寻址操作数直接就出现在指令中操作数直接就出现在指令中例:例:MOV AMOV A,,#64H #64H ;;(A)← (A)← 立即数立即数 64H64H ADD AADD A,,#05H#05H ;;(A)(A)←(A)+←(A)+立即数立即数 05H05H注意:注意:符号符号“# #”表明其后跟的是表明其后跟的是立即数立即数, , 立即数立即数——就是数字量本身。
就是数字量本身寄存器间接寻址寄存器间接寻址寄存器中的寄存器中的内容内容是一个是一个地址地址,由该,由该地址地址单元单元寻址到所需的寻址到所需的操作数操作数注意注意::1 1))“间间接接”表表示示某某寄寄存存器器中中的的“内内容容”只只是是一一个个“单单元元地地址址”,,这这个个地地址址单单元元中中存存放放的的数数据据才才是是要找的要找的“操作数操作数”2 2))符符号号“@ @”表表示示“在在…”,,其其含含义义与与读读音音皆皆同同“atat”例:例:[ [ MOV R1MOV R1,,#30H ;(R1)← #30H ;(R1)← 立即数立即数30H30H ] ] [ [ MOV R1MOV R1,,#30H ;(R1)← #30H ;(R1)← 立即数立即数30H30H ] ] MOV @R1MOV @R1,,#0FH ;#0FH ;(30H)←(30H)←立即数立即数0FH0FH MOV AMOV A,,@R1 ;@R1 ;(A)←((30H))=#0FH(A)←((30H))=#0FH直接寻址直接寻址指令中指令中直接直接给出了操作数所在给出了操作数所在单元的地址或名称单元的地址或名称 例:例:MOV R1MOV R1,,1FH1FH ;;(R1) ←(R1) ←((1FH1FH)) MOV 30HMOV 30H,,4AH4AH ;;(30H)←(30H)←((4AH4AH))在本单片机中规定:访问特殊功能寄存器在本单片机中规定:访问特殊功能寄存器SFRSFR只只能能采用直接寻址方式。
例如:采用直接寻址方式例如:MOV A, SP MOV A, SP ;; (A) ←(SP) (A) ←(SP) MOV A, 81H MOV A, 81H ;; (A) ←(SP)(A) ←(SP) MOV P1, #5AH MOV P1, #5AH ;; (P1)←(#5AH) (P1)←(#5AH) MOV 90H,#5AH MOV 90H,#5AH ;; (P1)←(#5AH)(P1)←(#5AH) MOV B, 30H MOV B, 30H ;; (B) ←(30H) (B) ←(30H) SFRSFR的地址见的地址见 P.39P.39表表2-62-6相同相同相同相同在本单片机中访问特殊功能寄存器在本单片机中访问特殊功能寄存器SFRSFR只能只能采用直采用直接寻址方式的接寻址方式的原因:原因:SFRSFR分布在分布在80H80H~~0FFH0FFH范围内范围内,,而而5252系列系列单片机有单片机有256256字节的片内字节的片内RAM,RAM,其中的其中的80H80H~~0FFH0FFH的的RAMRAM与与SFRSFR所占所占地址重叠地址重叠。
MOV A, 90HMOV A, 90H 等效于等效于 MOV A,MOV A, P1 P1 属直接寻址属直接寻址 MOV A, MOV A, @ @R0R0 ;;[ [事先已知事先已知 (R0) = #90H(R0) = #90H ] ] 执行的操作:执行的操作:A ←(90H)A ←(90H) 属寄存器间接寻址属寄存器间接寻址, , 随意写的指令如:随意写的指令如:MOV A, 85HMOV A, 85H 则是非法的!则是非法的! 于是规定:于是规定: 80H80H~~0FFH0FFH范围内的范围内的RAMRAM只能用只能用寄存器寄存器间接寻址间接寻址方式,而方式,而SFRSFR只能用只能用直接寻址直接寻址方式从而从而解决了地址冲突的问题例如:解决了地址冲突的问题例如:存储器配置(片内RAM)l89C89C5151片内片内RAMRAM 128128字节字节((00H00H—7FH7FH))l89C89C5252片内片内RAMRAM 256256字节字节((00H00H—0FFH0FFH))00H00H20H20H2FH2FH7FH7FH1FH1FH30H30H80H80HFFHFFH52子系列才有子系列才有的的RAM区区普通普通RAM区区位寻址区位寻址区工作寄存器区工作寄存器区SFR分布在分布在80H-FFH其中其中92个位个位可位寻址可位寻址80H80HFFHFFH89C51 128128字节字节89C52 256256字节字节只能直接寻址只能直接寻址只能寄存器间接寻址只能寄存器间接寻址相对寻址相对寻址当当前前PCPC值值加加上上指指令令中中规规定定的的偏偏移移量量 relrel,,构构成成实实际际的操作数地址的操作数地址例:例: SJMP relSJMP rel 操作:跳转到的操作:跳转到的目的地址目的地址 = = 当前当前1616位位PCPC值值 + + rel rel注意注意::1 1))“当前当前PCPC值值”指程序中指程序中下一条指令所在的首地址下一条指令所在的首地址,, 是一个是一个1616位数;位数;2 2))符符号号“relrel”表表示示“偏偏移移量量”, ,是是一一个个带带符符号号的的单单字字 节数节数, ,范围是范围是: :-128-128—+127+127(80H(80H—7FH), 7FH), 在实际编程中,在实际编程中,“relrel” 通常用标号代替通常用标号代替变址寻址变址寻址也称为也称为: : 基址寄存器基址寄存器+ +变址寄存器变址寄存器间接寻址间接寻址以以1616位的位的地址指针寄存器地址指针寄存器DPTRDPTR或或 1616位的位的PCPC寄存器为寄存器为基址寄存器基址寄存器,以,以累加器累加器 A A 为变址寄存器为变址寄存器,两者中的,两者中的“内容内容”形成一个形成一个1616位的位的“地址地址”,该,该“地址地址”所所指的存储单元中的内容才是操作数。
指的存储单元中的内容才是操作数例例: :[ [设:设:A A中已存有中已存有#A4H#A4H,,DPTRDPTR中已存有中已存有#1234H#1234H] ] MOVC AMOVC A,,@ @A+DPTRA+DPTR;;((A A))←←((A)+(DPTR))((A)+(DPTR))操作:操作:将将A4HA4H+ +1234H1234H= =12D8H12D8H单元中的单元中的数数放进累加器放进累加器A A位寻址位寻址指令中直接给出了操作数所在的指令中直接给出了操作数所在的位地址位地址例:例: CLR P1.0CLR P1.0 ;;(P1.0) ← 0(P1.0) ← 0 SETB ACC.7SETB ACC.7 ;;(ACC.7)← 1(ACC.7)← 1 CPL CCPL C ;;( C )← NOT( C )( C )← NOT( C )注意注意:: 1 1))位地址里的数据只可能是位地址里的数据只可能是一个一个 0 0 或或 1 1 2 2))有的位地址十分明确有的位地址十分明确, ,如如 P1.0, ACC.7P1.0, ACC.7等等, , 有的位地址则有的位地址则“不太明确不太明确”,如:,如: [ [MOV AMOV A,,17H17H ; (A)←(17H),17H ; (A)←(17H),17H是是字节地址字节地址] ] MOV ACC.0MOV ACC.0,,17H 17H ;(ACC.0)←(;(ACC.0)←(17H17H),),这里这里ACC.0ACC.0 是是位地址位地址所以该指令中的所以该指令中的17H17H是是2222H H单元的第单元的第7 7位位l片内片内RAMRAM中有中有128128个位个位可可按位寻址的位,按位寻址的位,位地位地址:址:00H00H——7FH7FH分布在:分布在:20H20H——2FH2FH单元;单元;l另外,在另外,在SFRSFR中还有中还有9292个位个位可按位寻址可按位寻址00H00H20H20H2FH2FH7FH7FH1FH1FH30H30H80H80HFFHFFH52子系列才有子系列才有的的RAM区区普通普通RAM区区位寻址区位寻址区工作寄存器区工作寄存器区27H22H21H20H26H24H25H23H28H07 06 05 04 03 02 01 000F 0E 0D 0C 0B 0A 09 0817 16 15 14 13 12 11 101F 1E 1D 1C 1B 1A 19 1827 26 25 24 23 22 21 202F 2E 2D 2C 2B 2A 29 2837 36 35 34 33 32 31 303F 3E 3D 3C 3B 3A 39 3847 46 45 44 43 42 41 402FH7F 7E 7D 7C 7B 7A 79 78位地址位地址总共总共128个可个可按位按位寻址寻址的位的位单元地址单元地址17D7 D6 D5 D4 D3 D2 D1 D0MCS-51指令集功能分五类,共111条指令MCS-51MCS-51指令集指令集(五大类功能)(五大类功能)数据数据传送传送类指令:类指令: ((2929条条))算术算术运算类指令:运算类指令: ((2424条条))逻辑逻辑运算及移位类指令:运算及移位类指令: ((2424条条))控制控制转移转移类指令:类指令: ((1717条条))位位操作(布尔操作)类指令:(操作(布尔操作)类指令:(1717条条))内部存储器间传送:内部存储器间传送: ((MOVMOV——1616条)条)外部数据存储器与累加器间传送外部数据存储器与累加器间传送: : ((MOVXMOVX——4 4条)条)程序存储器向累加器传送:程序存储器向累加器传送: ((MOVCMOVC——2 2条)条)数据交换:(数据交换:(XCHXCH,,XCHDXCHD,,SWAPSWAP——5 5条)条)堆栈操作:堆栈操作: ((PUSHPUSH,,POPPOP——2 2条)条)(一)数据传送类指令(5种/29条) P51Acc 累加器累加器Direct 直接寻址直接寻址@Ri 间接寻址间接寻址Rn 寄存器寄存器#data 立即数立即数RnRn:: R0R0—R7R7@Ri@Ri:: @R0@R0,,@R1@R1#data#data::8 8位立即数位立即数#data16#data16::1616位立即数位立即数directdirect::直接地址直接地址relrel:: 8 8位带符号偏移量位带符号偏移量(一)数据传送类指令(5种/29条)内部存储器间传送指令内部存储器间传送指令 (16(16条条) ):: MOV MOV 类指令的类指令的操作方向操作方向总是总是后面后面的的操作数操作数 指向指向前面前面的操作数的操作数!!例例: :MOV AMOV A,,30H 30H ——((A A))((30H30H)) 数据传送类指令(续)外部数据存储器与累加器间传送外部数据存储器与累加器间传送 (4(4条条):):MOVXMOVX类指令可在类指令可在累加器累加器与以与以@ @DPTRDPTR或或@ @RiRi所代表的所代表的外部外部 RAMRAM 之间进行数据传送。
之间进行数据传送例如例如: : MOVX AMOVX A,, @ @DPTR DPTR ——(A)(A) ((DPTR((DPTR))))MOVX AMOVX A,, @ @Ri Ri ——(A)(A) ((Ri)) ((Ri)) MOVX MOVX @ @DPTR, A DPTR, A ——((DPTR((DPTR)) )) ( (A) A) MOVX MOVX @ @Ri, A Ri, A ——((Ri)) ((Ri)) ( (A)A)例题参见例例题参见例5.35.3和例和例5.45.4程序存储器向累加器传送指令(程序存储器向累加器传送指令(2 2条):条): MOVC AMOVC A,,@ @A+DPTRA+DPTR MOVC AMOVC A,,@ @A+PCA+PC ——通常称为查表指令,寻址方式属通常称为查表指令,寻址方式属: : “基址寄存器基址寄存器 + + 变址寄存器变址寄存器间接寻址间接寻址”数据传送类指令(续)@ @A+DPTRA+DPTR或或@ @A+PCA+PC指向指向程序存储器程序存储器中的某单元。
拟中的某单元拟传送给累加器传送给累加器ACC ACC 的数据就是程序中事先写进去的数据就是程序中事先写进去的的表格数据表格数据这些表格数据往往用伪指令这些表格数据往往用伪指令 DB,DW DB,DW 等定义在程序中等定义在程序中例题参见例例题参见例5.55.5数据传送类指令(续)(续)数据交换指令数据交换指令(5(5条条):): XCH AXCH A,,direct direct ( (字节互换字节互换) )XCH AXCH A,,@Ri @Ri ( (字节互换字节互换) ) XCH AXCH A,,Rn Rn ( (字节互换字节互换) )((A A)) ((directdirect))[ [或或((Ri))((Ri)),或,或(Rn)](Rn)]XCHD AXCHD A,,@ @RiRi 累加器累加器 AccAcc的的低低4 4位位与与((Ri))((Ri))的的低低4 4位位互换,互换,各自的高各自的高4 4位不变位不变SWAP ASWAP A 累加器累加器 AccAcc的的低低4 4位位与自身的与自身的高高4 4位位互换互换堆栈操作指令堆栈操作指令(2(2条条):):PUSHPUSH——压栈指令压栈指令POP POP ——弹栈指令弹栈指令√√堆栈区由特殊功能寄存器堆栈区由特殊功能寄存器堆栈指针堆栈指针SPSP 管理管理√√堆栈区可以安排在堆栈区可以安排在 RAMRAM区任意位置,一般不安区任意位置,一般不安排在排在工作寄存器区工作寄存器区和和可按位寻址的可按位寻址的RAMRAM区区, ,而是放而是放在在RAMRAM区的区的靠后靠后的位置的位置√√堆栈总是指向堆栈总是指向栈顶栈顶√√通常通常PUSHPUSH与与POPPOP两条指令两条指令成对使用成对使用数据传送类指令(续)(续)例如:设例如:设(A)=7BH(A)=7BH; ; (35H)=11H(35H)=11H 并且知道(并且知道(SPSP)=)=60H60H PUSH ACC ;(61H) PUSH ACC ;(61H) #7BH#7BH PUSH 35H ;(62H) PUSH 35H ;(62H) (35H) (35H) 即:即:(62H) (62H) #11H#11H POP ACC POP ACC ;(A) ;(A) (62H) (62H) 即:即:(A)(A) #11H#11H POP 5AH POP 5AH ;(5AH) ;(5AH) (61H) (61H) 即:即:(5AH) (5AH) #7BH#7BH(二)算术运算类指令(6种/24条) P55加法运算:加法运算: ( (ADDADD——4 4条条) )带进位加法运算带进位加法运算: : ( (ADDCADDC——4 4条条) )带借位减法运算带借位减法运算: : ( (SUBBSUBB——4 4条条) )加加1/1/减减1 1操作:操作: ( (INCINC,,DECDEC——9 9条条) )单字节乘单字节乘/ /除法运算除法运算: (: (MULMUL,,DIVDIV——2 2条条) )十进制调整:十进制调整: ( (DA ADA A——1 1条条) )(二)算术运算类指令(续)加法运算:加法运算: ((ADDADD——4 4条)条)带进位加法运算带进位加法运算: : ((ADDCADDC——4 4条)条)带借位减法运算:带借位减法运算: ((SUBBSUBB——4 4条)条)所有的加法所有的加法( (ADDADD) )、带进位加法、带进位加法( (ADDCADDC) )、带借位减、带借位减法法( (SUBBSUBB) )运算都是以运算都是以 A A为一个加数或被减数为一个加数或被减数, ,最终最终结果也存进结果也存进 A A 。
加法加法( (ADDADD) )、带进位加法、带进位加法( (ADDCADDC) ) 以及带借位减法以及带借位减法( (SUBBSUBB) )运算中运算中, ,如果产生了进位或借位如果产生了进位或借位, ,将自动对将自动对PSWPSW中的中的CyCy标志位标志位置置“1 1” 带进位加法带进位加法( (ADDCADDC):(A)):(A)(A)+(A)+(Cy)(Cy)+(+(第二操作数第二操作数) )带借位减法带借位减法( (SUBBSUBB):(A)):(A)(A)-(A)-(Cy)(Cy)-(-(第二操作数第二操作数) )例题参见例例题参见例5.65.6(二)算术运算类指令(续)加加1/1/减减1 1操作:操作: ((INCINC,,DECDEC——9 9条)条)INC, DECINC, DEC与与用加用加/ /减法指令做减法指令做加加1/1/减减1 1 操作不同之操作不同之处在于处在于INCINC、、DECDEC不影响标志位不影响标志位. .单字节乘单字节乘/ /除运算除运算: (: (MULMUL,,DIVDIV——2 2条条) )两个单字节数的乘两个单字节数的乘/ /除法运算只在除法运算只在A A与与B B之间进行。
之间进行MUL ABMUL AB: (: (A A) )与与( (B B) )相乘相乘, , 积为积为1616位位数数, , ( (B B) )积的积的高高8 8位位; (; (A A) )积的积的低低8 8位位DIV ABDIV AB: (: (A A) )除以除以( (B B),),结果用结果用2 2字节表示字节表示, , ( (A A) )商的商的整数整数部分部分;(;(B B) )余数余数例题参见例例题参见例5.75.7和习题和习题5.95.9和和5.105.10(二)算术运算类指令(续) P.58BCDBCD码码是指是指“用二进制表达的十进制数用二进制表达的十进制数”如: 十进制数十进制数2020可以用二进制数可以用二进制数00010100B00010100B表示表示; ; 也可以用十六进制数也可以用十六进制数14H14H表示;表示; 还可以用还可以用BCDBCD码码 00100000B 00100000B 或或 20H 20H 表示。
表示4 4个二进制位就可以表示个二进制位就可以表示一位一位BCDBCD码:码: 00000000~~1001 1001 可表示十进制数可表示十进制数(BCD(BCD数数) 0) 0~~9;9; 8 8个二进制位就可以表示个二进制位就可以表示两位压缩的两位压缩的BCDBCD码:码:0000000000000000~~10011001 10011001 表示表示 0000~~9999十进制调整:十进制调整: ((DA ADA A——1 1条)条)用于两个用于两个BCDBCD码码之间的相加,这条指令之间的相加,这条指令只能跟在只能跟在 ADD ADD 或或 ADDC ADDC 之后之后若若(A)(A)3 3~~0 0 9 9或或(AC)=1(AC)=1则则(A)(A)3 3~~0 0(A)(A)3 3~~0 0++6 6;; 若若(A)(A)7 7~~4 4 9 9或或(CY)=1(CY)=1则则(A)(A)7 7~~4 4(A)(A)7 7~~4 4++6 6;;例:两个十进制数例:两个十进制数“6565”与与“5858”相加,根据常相加,根据常识,显然其和应当为识,显然其和应当为“123123”。
MOV A,#65H MOV A,#65H ADD A,#58HADD A,#58H DA ADA A结果结果:(A)= :(A)= 23H23H (CY)= (CY)= 1 1指令指令 “DA ADA A” 完成的操作完成的操作:: 6 5 0110 0101 6 5 0110 0101 5 8 0101 1000 5 8 0101 1000 +13 31818 19192 26 6 0110 01106 6 0110 0110高位调整时要加上低位调整后的进位高位调整时要加上低位调整后的进位若若(A)(A)3 3~~0 0 9 9或或(AC)=1(AC)=1则则(A)(A)3 3~~0 0(A)(A)3 3~~0 0++6 6;; 若若(A)(A)7 7~~4 4 9 9或或(CY)=1(CY)=1则则(A)(A)7 7~~4 4(A)(A)7 7~~4 4++6 6;;又如:两个十进制数又如:两个十进制数“3939”与与“5858”相加,根据相加,根据常识,显然其和应当为常识,显然其和应当为“9797”。
MOV A,#39H MOV A,#39H ADD A,#58HADD A,#58H DA ADA A结果结果:(A)= :(A)= 97H97H (CY)= (CY)= 0 0 3 9 0011 1001 3 9 0011 1001 5 8 0101 1000 5 8 0101 1000 +07 723239 9 6 0110 6 0110指令指令 “DA ADA A” 完成的操作完成的操作::( (三三) )逻辑运算及移位类指令逻辑运算及移位类指令((5 5种种/24/24条)条) —— P.58 P.58逻辑与运算:逻辑与运算: ((ANLANL——6 6条)条)逻辑或运算:逻辑或运算: ((ORLORL——6 6条)条)逻辑异或运算:逻辑异或运算: ((XRLXRL——6 6条)条)累加器清零累加器清零/ /取反:取反: ((CLRCLR,,CPLCPL——2 2条)条)累加器移位操作累加器移位操作: : ((RL,RLC,RR,RRCRL,RLC,RR,RRC—4 4条)条)逻辑运算及移位类指令逻辑运算及移位类指令(续)(续) P.59P.59逻辑与逻辑与( (ANLANL),),逻辑或逻辑或( (ORLORL),),逻辑异或逻辑异或( (XRLXRL):):累加器清零累加器清零/ /取反操作取反操作 ((CLR,CPLCLR,CPL——2 2条)条)CLR A CLR A ——对累加器清零对累加器清零 1 1 Byte Byte 1 1 个个Tm Tm CPL A CPL A ——对累加器按位取非对累加器按位取非 1 1 Byte Byte 1 1 个个TmTm指指 令令 形形 式式ByteByteTmTmANLANL(ORL(ORL,,XRL)XRL) direct direct,, A A2 21 1ANLANL(ORL(ORL,,XRL)XRL) direct direct,,#data#data3 32 2ANLANL(ORL(ORL,,XRL)XRL) A A,, #data#data2 21 1ANLANL(ORL(ORL,,XRL)XRL) A A,, directdirect2 21 1ANLANL(ORL(ORL,,XRL)XRL) A A,, @Ri@Ri1 11 1ANLANL(ORL(ORL,,XRL)XRL) A A,, RnRn1 11 1逻辑运算指令逻辑运算指令的常见用法的常见用法逻辑与逻辑与ANLANL用于用于清清0 0或者或者保留保留某些位:某些位:例例: : ANL A, #0FHANL A, #0FH; ; 则则(A) = (A) = 0A0AH H( ( 已知累加器已知累加器A A中已存有数:中已存有数:9A9AH )H )逻辑或逻辑或ORLORL用于用于置置1 1或者或者保留保留某些位:某些位:例例: : ORL A, #0FHORL A, #0FH; ; 则则(A) = (A) = 9F9FH H逻辑异或逻辑异或XRLXRL用于用于取反取反或者或者保留保留某些位:某些位:例例: : XRL A, #0FHXRL A, #0FH; ; 则则(A) = (A) = 9595H H (A) (A) 1001 1010 1001 1010 #0FH #0FH 0000 1111 0000 1111 9595H H 1001 0101 1001 0101例题参见例例题参见例5.85.8和例和例5.95.9逻辑运算及移位类指令逻辑运算及移位类指令(续)(续) P.61P.61累加器移位操作累加器移位操作: :((RL,RLC,RR,RRCRL,RLC,RR,RRC——4 4条)条)RL A RL A 左环移左环移累加器累加器 A A累加器累加器 A ACyCy累加器累加器 A ACyCy累加器累加器 A ARRC A RRC A 带进位位带进位位右环移右环移RR A RR A 右右环移环移RLC A RLC A 带进位位带进位位左环移左环移( (四四) )控制转移类指令控制转移类指令((4 4种种/17/17条)条) P.61P.61此类指令此类指令改变程序的执行顺序改变程序的执行顺序——改变当前改变当前PCPC值值无条件转移:无条件转移: ((LJMP,AJMP,SJMP,JMPLJMP,AJMP,SJMP,JMP——4 4条)条)条件转移(判断跳转):条件转移(判断跳转): ((JZ,JNZ,CJNE,DJNZJZ,JNZ,CJNE,DJNZ——8 8条)条)子程序调用及返回:子程序调用及返回: ((LCALL,ACALL,RET,RETILCALL,ACALL,RET,RETI——4 4条)条)空操作空操作: : ((NOPNOP——1 1条)条) “耗时耗时”一个机器周期。
一个机器周期 do nothing!do nothing!控制转移类指令控制转移类指令(续)(续) P.62P.62无条件转移:无条件转移: LJMP,AJMP,SJMP,JMPLJMP,AJMP,SJMP,JMP——4 4条条LJMP addr16 LJMP addr16 长跳转指令长跳转指令 ——可在可在64K64K范围内跳转范围内跳转AJMP addr11 AJMP addr11 绝对跳转指令绝对跳转指令 ——可在可在指令所在的指令所在的2K2K范围内跳转范围内跳转SJMP rel SJMP rel 相对跳转指令相对跳转指令 ——可在当前可在当前PCPC-128-128与与+127+127范围内跳转范围内跳转JMP JMP @ @A+DPTR A+DPTR 间接长跳转指令间接长跳转指令 ——可在以可在以DPTRDPTR为基址为基址 + + A A为偏移量为偏移量 之和所指向的之和所指向的64K64K程序范围内跳转程序范围内跳转控制转移类指令控制转移类指令(续)(续) P.63P.63条件转移条件转移:: JZ,JNZ,CJNE,DJNZJZ,JNZ,CJNE,DJNZ——8 8条条JZ relJZ relJNZ relJNZ rel——根据根据AccAcc的内容的内容是否为是否为0 0决定是否跳转决定是否跳转DJNZ DJNZ directdirect,,relrelDJNZ DJNZ RnRn,, relrel——将将directdirect( (或或Rn)Rn)里的内容减里的内容减 1 1,,结果不等结果不等于于0 0就跳转;等于就跳转;等于0 0则不跳转则不跳转继续往下走。
继续往下走条件转移条件转移(续)(续)CJNE CJNE A,A, #data, #data, relrelCJNE CJNE A,A, direct,direct,rel rel CJNE CJNE @ @Ri,Ri,#data, #data, relrelCJNE CJNE Rn,Rn, #data, #data, relrel ——将将A A( (或或@ @Ri,Ri,或或Rn)Rn)与与#data#data( (或或direct)direct)相比较,相比较,其值其值不相等就跳转;相等则不跳转不相等就跳转;相等则不跳转, ,继续往下走继续往下走控制转移类指令控制转移类指令(续)(续) P.65P.65LCALL addr16 LCALL addr16 子程序长调用指令子程序长调用指令——可在可在64K64K范围内调用子程序范围内调用子程序子程序调用及返回:子程序调用及返回: ((LCALLLCALL, ,ACALLACALL, ,RETRET, ,RETIRETI——4 4条)条) ACALL addr11 ACALL addr11 子程序绝对调用指令子程序绝对调用指令——可在指令所在的可在指令所在的2K2K范围内调用子程序范围内调用子程序RET RET 子程序返回指令子程序返回指令——子程序结束并返回调用的子程序结束并返回调用的下一条下一条指令指令RETI RETI 中断服务子程序返回指令中断服务子程序返回指令——中断结束中断结束/ /返回被打断处的下一条指令返回被打断处的下一条指令( (五五) )位操作类指令位操作类指令((1717条)条) P.66P.66位操作类指令位操作类指令 以位为单位进行逻辑运算及操作以位为单位进行逻辑运算及操作, ,可分为可分为4 4种:种: 位传送:位传送: ((MOVMOV——2 2条)条)位清零位清零/ /置位:置位: ((CLR,SETBCLR,SETB——4 4条)条)位逻辑与位逻辑与/ /或或/ /非运算:(非运算:(ANL,ORL,CPLANL,ORL,CPL——6 6条)条)位条件转移位条件转移: : ((JC,JNC,JB,JNB,JBCJC,JNC,JB,JNB,JBC——5 5条)条)位操作类指令位操作类指令(续)(续) P.67P.67位传送指令(位传送指令(2 2条):条): MOV CMOV C,, bit bit ——((C C))((bitbit)) MOV bitMOV bit,, C C ——((bitbit))((C C)) 注:注: bitbit表示位地址表示位地址位清零位清零/ /置位指令(置位指令(4 4条):条): CLR bitCLR bit(或(或C C))—— ((bitbit或或 C C))““0 0”” SETB bit SETB bit(或(或C C))—— ((bitbit或或 C C))““1 1”” 位逻辑与位逻辑与/ /或或/ /非指令(非指令(6 6条):条): ANL CANL C,,bitbit(或(或/bit/bit)) ORL CORL C,,bitbit(或(或/bit/bit)) CPL bit CPL bit (或(或 C C)) 注注: :““/bit/bit””表示对表示对bitbit位先取反然后再参加运算位先取反然后再参加运算位操作类指令位操作类指令(续)(续) P.67P.67判位判位条件转移条件转移指令指令((5 5条):条): JC rel JC rel——((CyCy))= =““1 1””就跳转;否则不跳转就跳转;否则不跳转 JNC rel JNC rel——((CyCy)) ““1 1””就跳转;否则不跳转就跳转;否则不跳转 JB bit JB bit,,relrel ——((bitbit))= =““1 1””就跳转;否则不跳转就跳转;否则不跳转JNB bitJNB bit,,relrel ——((bitbit)) ““1 1””就跳转;否则不跳转就跳转;否则不跳转JBJBC C bit bit,,relrel ——((bitbit))= =““1 1””就就先将其清零先将其清零 再跳转;再跳转; 否则,不动此位也不跳转。
否则,不动此位也不跳转例题参见例例题参见例5.105.10到例到例5.135.13任务一:控制一盏灯点亮任务一:控制一盏灯点亮任务二:红灯周期性地亮任务二:红灯周期性地亮/ /灭灭JOB3: JOB3: CLR P1.1CLR P1.1 ; ; P1.1 P1.1清清“0 0” ,,亮绿灯亮绿灯REDO: REDO: SETB P1.3SETB P1.3 ; ;将将P1.3P1.3置置“1 1”CHECK:CHECK:JNB P1.3,CHECKJNB P1.3,CHECK ; ;检测检测传感器是否被阻断传感器是否被阻断LOOP: LOOP: ………… ; ;有入侵者,有入侵者,报警!报警! AJMP REDO AJMP REDO ; ;再跳回去检测再跳回去检测JOB1:JOB1: CLR P1.0CLR P1.0 ; ;P1.0P1.0清清“0 0”,,亮红灯亮红灯HERE: AJMP HEREHERE: AJMP HERE ; ;原地等待,不做别的事原地等待,不做别的事JOB2: JOB2: CPL P1.0CPL P1.0 ; ;对对P1.0P1.0取反取反:红灯亮:红灯亮/ /灭灭 ACALL DELAY ;ACALL DELAY ;延时延时1 1秒秒 AJMP JOB2 ;AJMP JOB2 ;重复重复任务三:红外防盗报警任务三:红外防盗报警 前面的简单测控实例中的程序前面的简单测控实例中的程序前面的简单测控实例中的程序前面的简单测控实例中的程序::::位操作指令位操作指令任务一:控制一盏灯点亮任务一:控制一盏灯点亮任务二:红灯周期性地亮任务二:红灯周期性地亮/ /灭灭JOB3: CLR P1.1 ; P1.1JOB3: CLR P1.1 ; P1.1清清“0 0” ,亮绿灯,亮绿灯REDO:REDO: SETB P1.3 ; SETB P1.3 ;将将P1.3P1.3置置“1 1”CHECK:JNB P1.3,CHECK ;CHECK:JNB P1.3,CHECK ;检测传感器是否被阻断检测传感器是否被阻断LOOP: LOOP: ………… ; ;有入侵者,报警!有入侵者,报警! AJMP REDOAJMP REDO ; ;再跳回去检测再跳回去检测JOB1:JOB1: CLR P1.0 ;P1.0CLR P1.0 ;P1.0清清“0 0”,亮红灯,亮红灯HERE: AJMP HEREHERE: AJMP HERE ; ;原地等待,不做别的事原地等待,不做别的事JOB2:JOB2: CPL P1.0 ; CPL P1.0 ;对对P1.0P1.0取反:红灯亮取反:红灯亮/ /灭灭 ACALL DELAY ;ACALL DELAY ;延时延时1 1秒秒 AJMP AJMP JOB2JOB2 ; ;重复重复任务三:红外防盗报警任务三:红外防盗报警跳转指令跳转指令 前面的简单测控实例中的程序前面的简单测控实例中的程序前面的简单测控实例中的程序前面的简单测控实例中的程序::::小结:MCS-51指令集(五大类功能)数据数据传送传送类指令类指令 ((2929条条))算术算术运算类指令运算类指令 ((2424条条))逻辑逻辑运算及移位类指令运算及移位类指令 ((2424条条))控制控制转移转移类指令类指令 ((1717条条))位位操作操作( (布尔操作布尔操作) )类指令类指令 ((1717条条)) 小结小结内部存储器间传送:内部存储器间传送: ((MOVMOV——1616条)条)外部数据存储器外部数据存储器RAMRAM与累加器间传送与累加器间传送: : ((MOVMOVX X——4 4条)条)程序存储器程序存储器ROMROM向累加器传送:向累加器传送: ((MOVMOVC C——2 2条)条)数据交换:(数据交换:(XCHXCH,,XCHDXCHD,,SWAPSWAP——5 5条)条)堆栈操作:堆栈操作: ((PUSHPUSH,,POPPOP——2 2条)条)(一)数据传送类指令(5种/29条) 小结小结(二)算术运算类指令(6种/24条)加法运算加法运算 ( (ADDADD——4 4条条) )带进位加法运算带进位加法运算 ( (ADDCADDC——4 4条条) )带借位减法运算带借位减法运算 ( (SUBBSUBB——4 4条条) )加加1/1/减减1 1操作操作 ( (INC,DECINC,DEC——9 9条条) )单字节乘单字节乘/ /除法运算除法运算( (MUL,DIVMUL,DIV——2 2条条) )十进制调整十进制调整 ( (DA ADA A——1 1条条) ) 小结小结(三)逻辑运算及移位指令(5种/24条)逻辑与运算:逻辑与运算: ((ANLANL——6 6条)条)逻辑或运算:逻辑或运算: ((ORLORL——6 6条)条)逻辑异或运算:逻辑异或运算: ((XRLXRL——6 6条)条)累加器清零累加器清零/ /取反:取反: ((CLRCLR,,CPLCPL——2 2条)条)累加器移位操作累加器移位操作: :((RL,RLC,RR,RRCRL,RLC,RR,RRC—4 4条)条) 小结小结(四)控制转移类指令(4种/17条)无条件转移无条件转移:: ((LJMP,AJMP,SJMP,JMPLJMP,AJMP,SJMP,JMP——4 4条)条)条件转移(判断跳转):条件转移(判断跳转): ((JZ,JNZ,CJNE,DJNZJZ,JNZ,CJNE,DJNZ——8 8条)条)子程序调用及返回:子程序调用及返回: ((LCALL,ACALL,RET,RETILCALL,ACALL,RET,RETI——4 4条)条)空操作空操作: : ((NOPNOP——1 1条)条) 小结小结(五)位操作类指令(4种17条)位传送:位传送: ((MOVMOV——2 2条)条)位清零位清零/ /置位:置位: ((CLR,SETBCLR,SETB——4 4条)条)位逻辑与位逻辑与/ /或或/ /非运算:非运算: ((ANL,ORL,CPLANL,ORL,CPL——6 6条)条)位条件转移位条件转移: : ((JC,JNC,JB,JNB,JC,JNC,JB,JNB,JBCJBC——5 5条)条) 小结小结汇编语言与 简单程序设计汇编语言程序设计中的数计算机计算机只能只能识别二进制数识别二进制数——机器指令机器指令,它原本是,它原本是不认识不认识常用的常用的十六进制数十六进制数和和十进制数十进制数的。
的机器指令机器指令/ /目标代码:目标代码: 由由0/10/1代码组成的操作码与操作数代码组成的操作码与操作数十六进制数:十六进制数:便于读写记忆的二进制数的简写形式便于读写记忆的二进制数的简写形式 ((0 0~~9 9,,A A~~F F 后缀:后缀:H/hH/h))BCDBCD码:码:用二进制数表达的十进制数用二进制数表达的十进制数 ((0 0~~9 9表示为表示为:0000:0000~~1001B 1001B ))二进制数:二进制数:由由0/10/1组成、组成、““逢逢2 2进进1 1””的数制 如:如:01011110B 01011110B ((0 0~~1 1 后缀:后缀:B/bB/b))汇编语言编程基本规则汇编语言汇编语言: :用助记符描述的指令的集合用助记符描述的指令的集合√√指令中以指令中以 A A—F F 开头的十六进制数前必须添一个开头的十六进制数前必须添一个 “0 0”。
√√二进制数二进制数必须必须带后缀带后缀“B B”或或“b b”;十六进制数;十六进制数必须必须带后缀带后缀“H H”或或“h h”;十进制数的后缀是;十进制数的后缀是“D D”或或“d d”或或无无. .[标号:]操作码 [目的操作数][,源操作数][;注释]汇编程序汇编程序: :汇编语言编写的程序借助汇编语言编写的程序借助编译工具编译工具编译编译成为成为目标代码目标代码, ,计算机才能识别这个编译工具计算机才能识别这个编译工具称为汇编程序称为汇编程序汇编程序的伪指令汇编程序汇编程序 → → 软件软件→→ 工具工具→→工具软件工具软件:: 将程序员将程序员用汇编语言编写的程序用汇编语言编写的程序翻译成机器码翻译成机器码 ( (真真) )指令指令: :告诉告诉计算机计算机如何操作以及做何种操作如何操作以及做何种操作用汇编语言编写的程序用汇编语言编写的程序在此被称为在此被称为应用程序应用程序伪指令:伪指令:告诉告诉汇编程序汇编程序在翻译应用程序时在翻译应用程序时有何具有何具体约定体约定伪指令不进行具体的操作,那是真指令伪指令不进行具体的操作,那是真指令的事。
的事 比如:比如:从何处开始,何处结束,某些编程者自己从何处开始,何处结束,某些编程者自己规定的表述代表什么意思规定的表述代表什么意思…… 汇编程序的常用伪指令 P68ORG ORG addr16addr16——ASM51ASM51程序中一定要写!程序中一定要写!规定编译后的机器代码存放的规定编译后的机器代码存放的起始位置起始位置END END ——ASM51ASM51程序中一定要写!程序中一定要写!表示翻译到此表示翻译到此结束结束,其后的任何内容不予理睬其后的任何内容不予理睬符号名称符号名称 EQU EQU 表达式表达式将表达式的值赋予符号名称程序中凡出现该将表达式的值赋予符号名称程序中凡出现该符符号名称号名称就就等同于等同于该该表达式表达式。
$ ————““当前当前PCPC值值””也叫也叫位置计数器位置计数器 代表正在执行的指令所在位置代表正在执行的指令所在位置汇编程序的常用伪指令(续)符号名称符号名称 BITBIT 位地址位地址将位地址的值赋予符号名称程序中凡出现该将位地址的值赋予符号名称程序中凡出现该符号名称符号名称就就代表代表该该位地址位地址DWDW 双字节数据双字节数据[ [或双字节数据组或双字节数据组] ]将将双字节数据双字节数据[ [或双字节数据组或双字节数据组] ]顺序顺序存放在存放在此此后的后的存储单元中存储单元中占据相应存储空间占据相应存储空间DBDB 8 8位数据位数据[ [或或8 8位数据组位数据组] ]将将8 8位数据位数据[ [或或8 8位数据组位数据组] ]顺序顺序存放在存放在此后的此后的存存储单元中储单元中占相应数量的存储空间占相应数量的存储空间 ORG 2000H ORG 2000H VARVAR EQU EQU 30H 30H ; ;定义缓存单元定义缓存单元 FUNCFUNC EQU EQU 31H 31H ; ; BR1: MOV ABR1: MOV A,,VARVAR ; ;取出变量取出变量“X X” JZ COMP ; JZ COMP ;若若=0,=0,就就赋赋 0 0 JNB ACC.7,POS1 ; JNB ACC.7,POS1 ;判断判断 = = 正?正? MOV A,#0FFH ;(-1 = MOV A,#0FFH ;(-1 = +1+1取反加取反加1 1) ) SJMP COMP ; SJMP COMP ;输出输出 -1-1POS1POS1::MOV AMOV A,,#01H ;#01H ;输出输出 +1+1COMPCOMP::MOV MOV FUNCFUNC,,A ;A ;赋给函数赋给函数“Y Y”HEREHERE::AJMP HEREAJMP HERE END END例:1 (X>0) 1 (X>0) 0 (X=0) 0 (X=0) –1(X<0)1(X<0)Y=Y=程序的顺序/分支/循环三种基本结构 ORG 1000H ORG 1000HDELAYDELAY::MOV R6MOV R6,,#200 #200 ; 1Tm; 1TmLOOP1:MOV R7LOOP1:MOV R7,,#248 ; #248 ; 1Tm1Tm NOP ; NOP ; 1Tm1TmLOOP2:DJNZ R7LOOP2:DJNZ R7,,LOOP2 ; LOOP2 ; 2Tm2Tm DJNZ R6 DJNZ R6,,LOOP1 ; LOOP1 ; 2Tm2Tm RET RET ; 2Tm; 2Tm例例: :软件循环延时软件循环延时100mS(100mS(晶振晶振12MHz)12MHz)☆ ☆ 1Tm =1uS 100mS = 100000 uS1Tm =1uS 100mS = 100000 uS ☆☆ MOV Rn #data MOV Rn #data 和和 NOP NOP 是是单机器周期单机器周期指令指令 ☆☆ DJNZ RnDJNZ Rn,,relrel 是是双机器周期双机器周期指令指令 ☆ ☆ 200200 = 0C8H ; 248 = 0F8H= 0C8H ; 248 = 0F8H1+1+ 1+1+ 248x248x2 2 =498=498(498+(498+2 2)x200)x200程序的顺序/分支/循环三种基本结构l1.1.片内片内RAMRAM空间的低地址:空间的低地址:0X000X00—0X7F0X7F可以采用间可以采用间接和直接地址方式访问;高地址:接和直接地址方式访问;高地址:0X800X80—0XFF0XFF只只能采用间接地址方式访问;而特殊功能寄存器能采用间接地址方式访问;而特殊功能寄存器SFRSFR只能采用直接地址方式访问。
只能采用直接地址方式访问l2.2.本部分的汇编程序设计,要多实践,多编程,本部分的汇编程序设计,要多实践,多编程,才能熟练掌握各种寻址方式和指令集当你编写才能熟练掌握各种寻址方式和指令集当你编写了一个上千行的汇编程序后,才可以说对汇编语了一个上千行的汇编程序后,才可以说对汇编语言已经入门了言已经入门了l3.3.熟练掌握几个常见伪指令的用法,比如熟练掌握几个常见伪指令的用法,比如DB,EQU,BIT,DATADB,EQU,BIT,DATA等DBDB表示初始化某个地址的数表示初始化某个地址的数据;据;BITBIT表示对片内表示对片内RAMRAM的位寻址区重新命名;的位寻址区重新命名;DATADATA表示对片内表示对片内RAMRAM单元重新命名;单元重新命名; EQUEQU表示对常表示对常数的定义,也可以表示对片内数的定义,也可以表示对片内RAMRAM单元的重新命名单元的重新命名 实战经验l4 4. .对宏汇编应有一定的了解,具体的例子可以参对宏汇编应有一定的了解,具体的例子可以参考考KEIL C51KEIL C51自带的例子自带的例子 实战经验作业作业P72习题习题 2、、3、、4和和6 OVER !。
