资源预览内容
第1页 / 共76页
第2页 / 共76页
第3页 / 共76页
第4页 / 共76页
第5页 / 共76页
第6页 / 共76页
第7页 / 共76页
第8页 / 共76页
第9页 / 共76页
第10页 / 共76页
亲,该文档总共76页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第3章章MCS-51单片机指单片机指令系统及编程举例令系统及编程举例对于任何一台计算机,必须有软件(程序)对于任何一台计算机,必须有软件(程序)的支持,才能工作。计算机所进行的全部的支持,才能工作。计算机所进行的全部操作都是执行程序的结果,而程序是计算操作都是执行程序的结果,而程序是计算机所能识别的命令的集合。机所能识别的命令的集合。 指令系统是一种指令系统是一种CPUCPU所能直接执行的所有所能直接执行的所有命令的集合,命令的集合,CPUCPU的主要功能是由它的指令的主要功能是由它的指令系统来体现的。任何计算机语言编写的任系统来体现的。任何计算机语言编写的任何程序,都必须转换为指令系统中相应指何程序,都必须转换为指令系统中相应指令代码的有序集合,令代码的有序集合,CPUCPU才能执行才能执行 。介绍介绍MCS-51MCS-51汇编语言的指令系统。汇编语言的指令系统。3.1 3.1 指令系统概述指令系统概述 MCS-51MCS-51的的基基本本指指令令共共111111条条,按按指指令令在在程程序序存存储储器器所所占占的字节来分,其中:的字节来分,其中: (1) (1) 单字节指令单字节指令4949条;条; (2) (2) 双字节指令双字节指令4545条;条; (3) (3) 三字节指令三字节指令1717条。条。按指令的执行时间来分,其中:按指令的执行时间来分,其中:(1) 1(1) 1个机器周期(个机器周期(1212个时钟振荡周期)的指令个时钟振荡周期)的指令6464条;条;(2) 2(2) 2个机器周期(个机器周期(2424个时钟振荡周期)的指令个时钟振荡周期)的指令4545条;条; (3) 只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。 在12MHz晶振的条件下,每个机器周期为1s。有一个位变量的指令子集,在进行位变量处理的程序设计时十分有效、方便。MCS-51MCS-51指令系统的功能十分强大,它把体指令系统的功能十分强大,它把体现单片机的各种功能的寄存器组织在统一现单片机的各种功能的寄存器组织在统一的地址空间中,的地址空间中,MCS-51MCS-51指令系统在其存储指令系统在其存储空间、时间的利用率及工作效率方面都是空间、时间的利用率及工作效率方面都是较高的。较高的。2.指令格式两部分组成,即操作码和操作数。 操作码用来规定指令进行什么操作。操作数则是指令操作的对象。有单字节指令、双字节指令、三字节不同长度的指令,指令长度不同,格式也就不同。(1)单字节指令:指令只有一个字节,操作码和操 作数同在一个字节中。(2)双字节指令:一个字节为操作码,另一个字节 是操作数。(3)三字节指令:操作码占一个字节,操作数占二 个字节。其中操作数既可能是数据,也可能是 地址。2.2.指令格式指令格式MCS-51MCS-51指令系统中的每一条指令都有两级指指令系统中的每一条指令都有两级指令格式:令格式: CPUCPU可直接识别并执行的机器语言指令。可直接识别并执行的机器语言指令。 汇编语言指令(简称汇编指令)。汇编语言指令(简称汇编指令)。MCS-51MCS-51汇编语言指令格式,由以下几个部分汇编语言指令格式,由以下几个部分组成:组成: 标号标号: : 操作码操作码 目的操作数目的操作数 , ,源操作数源操作数 ;注释;注释 3.2 3.2 寻址方式寻址方式所谓寻址方式就是寻找或获得操作数的方式。所谓寻址方式就是寻找或获得操作数的方式。指令的一个重要组成部分是操作数。由寻址方式指指令的一个重要组成部分是操作数。由寻址方式指定参与运算的操作数或操作数所在单元的地址。定参与运算的操作数或操作数所在单元的地址。MCS-51MCS-51指令系统的寻址方式有以下指令系统的寻址方式有以下7 7种:种:1.1.立即寻址立即寻址2.2.直接寻址直接寻址3.3.寄存器寻址寄存器寻址4.4.寄存器间接寻址寄存器间接寻址5.5.变址寻址变址寻址6.6.相对寻址相对寻址7.7.位寻址位寻址1.立即寻址方式 操作数在指令中直接给出,需在操作数前面加前缀标志“#”。操作数可以是8位或16位数。例如: MOV A,#40H ;(A)=40H MOV DPTR, #2000H; (DPH)=20H,(DPL)=00H2直接寻址方式 操作数直接以单元地址的形式给出 MOV A,40H ; (A)=(40H) 寻址范围: (1) 内部RAM的128个单元(2) 特殊功能寄存器。除了以单元地址的形式外,还可以用寄存器符号的形式给出。例如: MOV A,80H 与 MOV A,P0是等价的。 直接寻址方式是访问特殊功能寄存器的唯一 寻址方式。3.寄存器寻址方式 操作数在寄存器中 MOV A,Rn ;(Rn)A,n=07 表示把寄存器Rn的内容传送给累加器A 寻址范围包括:(1)4组通用工作寄存区共32个工作寄存器(2)部分特殊功能寄存器,例如A、B 以及数据指针 寄存器DPTR等。4、寄存器间接寻址方式 寄存器中存放的是操作数的地址, 在寄存器的名称前面加前缀标志“” 访问内部RAM或外部数据存储器的低256个字节时,只能采用R0或R1作为间址寄存器。例如: MOV A,Ri ;i=0或1 其中Ri中的内容为40H,把内部RAM中40H单元的内容送到A。寻址范围:(1)访问内部RAM低128个单元,其通用形式为Ri(2)对片外数据存储器的64K字节的间接寻址,例 如: MOVX A,DPTR(3)片外数据存储器的低256字节 例如:MOVX A,Ri(4)堆栈区 堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)作间址寄存器5、变址寻址(基址寄存器加变址寄存器间接寻址) 本寻址方式是以DPTR或PC作基址寄存器,以累加器A作为变址寄存器。两者内容相加形成16位的操作数地址,主要用于访问固化在程序存储器中的某个字节。例如:指令 MOVC A,A+DPTR 其中A的原有内容为05H,DPTR的内容为0400H,该指令执行的结果是把程序存储器0405H单元的内容传送给A。说明: (1)本寻址方式是专门针对程序存储器的寻址方 式,寻址范围可达到64KB。(2)本寻址方式的指令只有3条:MOVC A,A+DPTRMOVC A,A+PCJMP A+DPTR6、相对寻址方式 在相对寻址的转移指令中,给出了地址偏移量,以“rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址: 目的地址=转移指令所在的地址 + 转移指令的字节数 + rel 偏移量rel是一个带符号的8位二进制数补码数范围是:128 +127 向地址增加方向最大可转移(127+转移指令字节)个单元地址,向地址减少方向最大可转移(128-转移指令字节)个单元地址。7、位寻址方式 MCS-51有位处理功能,可以对数据位进行操作,例如: MOV C,40H;是把位40H的值送到进位位C。寻址范围包括:(1)内部RAM中的位寻址区。位有两种表示方法,例如,40H;另一种是单元地址加上位,例如,(28H).0,指的是28H单元中的最低位。它们是等价的。(2)特殊功能寄存器中的可寻址位 在指令中有如下4种的表示方法:a.直接使用位地址。例如PSW.5的位地址为0D5H。b.位名称的表示方法。例如PSW.5是F0标志位,可使用F0表示该位。c.单元地址加位数的表示方法。例如 :(0D0H).5。d.特殊功能寄存器符号加位数的表示方法。例如:PSW.5。操作数的寻址方式和寻址空间操作数的寻址方式和寻址空间寻址方式寻址方式寻址空间寻址空间立即寻址立即寻址程序存储器程序存储器寄存器寻址寄存器寻址工作寄存器工作寄存器R0-R7,A,B,CY,DPTR,ABR0-R7,A,B,CY,DPTR,AB直接寻址直接寻址片内片内RAM低低128字节、专用寄存器字节、专用寄存器寄存器间接寻址寄存器间接寻址片内片内RAM低低128字节(字节(R0,R1,SP)片外片外RAM(R0,R1,DPTR)变址寻址变址寻址程序存储器(程序存储器(A+PC、A+DPTR)相对寻址相对寻址程序存储器程序存储器256字节范围(字节范围(PC偏移量)偏移量)位寻址位寻址片内片内RAM寻址区寻址区(20H-2FH)和和可寻址的可寻址的SFR3.3 3.3 指令系统指令系统111条指令,按功能分类,可分为下面5大类: (1)数据传送类(28条) (2)算术操作类(24条 (3)逻辑运算类(25条) (4)控制转移类(17条) (5)位操作类(17条)指令的一些符号的意义指令的一些符号的意义: :Rn Rn 当前寄存器区的当前寄存器区的8 8个工作寄存器个工作寄存器R0R0R7(n=0R7(n=07)7)。Ri Ri 当前选中的寄存器区中可作间接寻址寄存器的当前选中的寄存器区中可作间接寻址寄存器的2 2个个 寄存器寄存器 R0R0、R1(i=0,1)R1(i=0,1)。Direct Direct 直接地址,即直接地址,即8 8位的内部数据存储器单元或特位的内部数据存储器单元或特 殊功能寄存器的地址。殊功能寄存器的地址。#data #data 包含在指令中的包含在指令中的8 8位立即数。位立即数。#data16#data16 包含在指令中的包含在指令中的1616位立即数。位立即数。relrel 相对转移指令中的偏移量,为相对转移指令中的偏移量,为8 8位的带符号补位的带符号补 码数。码数。DPTRDPTR 数据指针,可用作数据指针,可用作1616位的地址寄存器。位的地址寄存器。bitbit 内部内部RAMRAM或特殊功能寄存器中的直接寻址位。或特殊功能寄存器中的直接寻址位。/ / 位操作数前缀位操作数前缀, ,表示对该位操作数取反表示对该位操作数取反, ,如如:/bit:/bitC C 或或 CyCy 进位标志位或位处理机中的累加器。进位标志位或位处理机中的累加器。addr11 addr11 1111位目的地址位目的地址addr16 addr16 1616位目的地址位目的地址 间接寻址寄存器前缀,如间接寻址寄存器前缀,如 RiRi, A+DPTRA+DPTR$ $ 当前指令的首地址当前指令的首地址(X)(X) X X中的内容。中的内容。(X)(X) 由由X X寻址的单元中的内容。寻址的单元中的内容。 箭头右边的内容被箭头左边的内容所取代。箭头右边的内容被箭头左边的内容所取代。3.3.1 3.3.1 数据传送类指令数据传送类指令 使用最频繁的一类指令,通用格式: MOV ,数据传送类指令不影响标志位, Cy、Ac和OV,但不包括奇偶标志位P。1以累加器为目的操作数的指令 MOV A,Rn ; (Rn)A,n=07 MOV A,Ri ; (Ri)A,i=0,1 MOV A,direct ;(direct)A MOV A,#data ; #dataA例如: MOV A,R6 ;(R6)A,寄存器寻址 MOV A,70H ;(70H)A,直接寻址 MOV A,R0 ;(R0)A,间接寻址 MOV A,#78H ;78HA,立即寻址 2.以Rn为目的操作数的指令 MOV Rn,A ; (A)Rn,n=07 MOV Rn,direct ;(direct)Rn,n=07 MOV Rn,#dat ; #dataRn,n=07 这组指令的功能是把源操作数的内容送入当前一组 工作寄存器区的R0R7中的某一个寄存器。3.以直接地址direct为目的操作数的指令 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的地址。4.以寄存器间接地址为目的操作数的指令 MOV Ri,A ;(A)(Ri),i=0,1 MOV Ri,direct; (direct)(Ri) MOV Ri,#data ; #data(Ri)5.16位数传送指令 MOV DPTR,#data16 ; #data16DPTR唯一的一条16位数据的传送指令 ,立即数的高8位送入DPH,立即数的低8位送入DPL。6堆栈操作指令在MCS-51内部RAM中可以设定一个后进先出(LIFO-Last In First Out)的区域称作堆栈。堆栈指针SP指出堆栈的栈顶位置。(1)进栈指令 PUSH direct先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示的内部RAM单元中。例如:当(SP)=60H,(A)=30H,(B)=70H时,执行 下列指令 PUSH ACC; (SP)+1=61HSP,(A)61H PUSH B; (SP)+1=62HSP,(B)62H 结果:(61H)=30H,(62H)=70H,(SP)=62H (2)出栈指令 POP directSP指示的栈顶(内部RAM单元)内容送入direct字节单元中,栈指针SP减1.例如: 当 (SP)=62H,(62H)=70H,(61H)=30H,执行下 列指令: POP DPH ;(SP)DPH,(SP)-1SP POP DPL ;(SP)DPL,(SP)-1SP 结果:(DPTR)=7030H,(SP)=60H7.累加器A与外部数据存储器传送指令 MOVX A,DPTR ;(DPTR)A,读外部RAM/IO MOVX A,Ri ;(Ri)A,读外部RAM/IO MOVX DPTR,A;(A)(DPTR),写外部RAM/IO MOVX Ri,A ;(A)(Ri),写外部RAM/IO功能是读外部RAM存储器或I/O中的一个字节的数据到 累加器A中,或从累加器A中的一个字节的数据写到外部RAM存储器或I/O中。采用DPTR作可寻址64KB片外数据存储器,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出。采用Ri(i=0,1)作间接寻址,可寻址片外256个单元的数据存储器。8位地址和数据均由P0口输出,可选用其它任何输出口线来输出高于8位的地址(一般选用P2口输出高8位的地址)。MOV的后面 “X”表示单片机访问的是片外RAM存储器或I/O。8.查表指令 共两条,用于读程序存储器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方式。 (1) MOVC A,A+PC 以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16位的地址该地址指出的程序存储单元的内容送到累加器A。例如: (A)=30H,执行地址1000H处的指令 1000H: MOVC A,A+PC本指令占用一个字节,下一条指令的地址为1001H,(PC)=1001H再加上A中的30H,得1031H,结果将程序存储器中1031H的内容送入A。优点是不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点是表格只能存放在该条查表指令后面的256个单元之内,表格的大小受到限制,而且表格只能被一段程序所利用。 (2) MOVC A,A+DPTR以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位的地址,把由该地址指出的程序存储器单元的内容送到累加器A. 例如 (DPTR)=8100H (A)=40H 执行指令 MOVC A,A+DPTR结果将程序存储器中8140H单元内容送入累加器A中。这条查表指令的执行结果只和指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64K程序存储器中任意安排,一个表格可以为各个程序块公用。两条指令是在MOV的后面加C,“C”是CODE的第一个字母,即代码的意思。 9字节交换指令 XCH A,Rn XCH A,direct XCH A,Ri例如: (A)=80H,(R7)=08H,(40H)=F0H (R0)=30H,(30H)=OFH执行下列指令: XCH A,R7 ;(A)与(R7)互换 XCH A,40H ;(A)与(40H)互换 XCH A,R0 ;(A)与(R0)互换结果:(A)=0FH,(R7)=80H,(40H)=08H,(30H)=F0H 10半字节交换指令 XCHD A,Ri 累加器的低4位与内部RAM低4位交换。例如: (R0)=60H,(60H)=3EH,(A)=59H执行完 XCHD A,RO 指令,则(A)=5EH,(60H)=39H。3.3.2 3.3.2 算术操作类指令算术操作类指令单字节的加、减、乘、除法指令,都是针对8位二进制无符号数。执行的结果将使PSW中的进位(Cy),辅助进位(Ac),溢出(OV)3种标志位置“1”或清“0”,但是增1和减1指令不影响这些标志。1加法指令 共有4条加法运算指令: ADDA,Rn;(A)+(Rn)A, n=07 ADD A,direct ; (A)+(direct)A ADD A,Ri ; (A)+(Ri)A,i=0,1 ADD A,#data ; (A)+#dataA这4条8位二进制数加法指令的一个加数总是来自累加器A,而另一个加数可由寄存器寻址、直接寻址、寄存器间接寻址和立即寻址等不同的寻址方式得到。其相加的结果总是放在累加器A中。使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存器中的一位)(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置“1”,否则清“0”OV。溢出标志位OV的状态,只有在带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围 例 (A)=53H,(R0)=FCH,执行指令 ADD A,R0结果为: (A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的运算中,由于位6和位7同时有进位,所以标志位OV=0。 例 (A)= 85H,(R0)=20H,(20H)=AFH,执行指令: ADD A,R0 结果为:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有进位,而位6无进位,所以标志位OV=1 2带进位加法指令进位标志位Cy参加运算,因此是三个数相加。共4条: ADDCA,Rn;(A)+(Rn)+CA, n=07 ADDCA,direct;(A)+(direct)+CA ADDCA,Ri ;(A)+(Ri)+CA,i=0,1 ADDCA,#data ;(A)+#data+CA 例:(A)=85H,(20H)=FFH,Cy=1,执行指令 ADDC A,20H结果为:(A)=85H,Cy=1,Ac=1,OV=0,P=1 (A中1 的位数为奇数) 3增1指令 5条增1指令: INC A INC Rn ;n=07INC direct INC Ri ;i=0,1 INC DPTR不影响程序状态字PSW中的任何标志。若变量原来为FFH,加1后将溢出为00H(指前4条指令),标志也不会受到影响。第5条指令INC DPTR,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1的操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。4十进制调整指令用于对BCD码十进制数加法运算结果的内容修正。 指令格式: DA A两个BCD码按二进制相加之后,必须经本指令的调整 才能得到正确的压缩BCD码的和数。二进制数的加法运算原则并不能适用于十进制数的加法运算,有时会产生错误结果。例如:(a)3+6=9 0011+0101=1001 运算结果正确(b)7+8=15 0111+1000=1111 运算结果不正确(c)9+8=17 1001+1000=00001 C=1 结果不正确二进制数加法指令不能完全适用于BCD码十进制数的加法运算,对结果作有条件的修正 十进制调整 (2)出错原因和调整方法 BCD码只用了了其中的10个,6个没用到的编码。(1010,1011,1100,1101,1110,1111)为无效码 ,凡结果进入或者跳过无效码编码区时,其结果就是错误的。调整的方法是把结果加6调整,即所谓十进制调整修正。修正方法应是:(a)累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。(b)累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。(c)加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。具体是通过执行指令:DA A 来自动实现的 。例 (A)=56H,(R5)=67H,把它们看作为两个压缩的BCD数,进行BCD数的加法。执行指令: ADD A,R5 DA A由于高、低4位分别大于9,所以要分别加6进行十进制调整对结果进行修正。结果为: (A)=23H,Cy=1 可见,56+67=123,结果是正确的。5带借位的减法指令 4条指令: SUBB A,Rn ; (A)-(Rn)- CyA,n=07 SUBB A,direct ; (A)-(direct)- CyA SUBB A,Ri;(A)-((Ri))- CyA, i=0,1 SUBB A,#data ;(A)-#data - CyA从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。如果位7需借位则置“1” Cy,否则清“0”Cy; 如果位3需借位则置“1”Ac,否则清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,则置“1”溢出标志位OV,否则清“0”OV。例 (A)=C9H ,(R2)=54H,Cy=1,执行指令: SUBB A,R2 结果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位) 6减1指令 4条指令:DEC A;(A)-1ADEC Rn ;(Rn)-1Rn,n=07DEC direct;(direct)-1directDEC Ri ;(Ri)-1(Ri),i=0,1减1指令不影响标志位。 7乘法指令 MUL AB ;ABBA如果积大于255,则置“1”溢出标志位OV8除法指令 DIV AB ;A/B A(商),余数 B如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并置“1”溢出标志位OV。3.3.3 3.3.3 逻辑运算指令逻辑运算指令1.1.简单逻辑操作指令简单逻辑操作指令 (1) CLR A(1) CLR A功能是累加器功能是累加器A A清清“0 0”。不影响。不影响CyCy、AcAc、OVOV等标志。等标志。 (2) CPL A(2) CPL A功能是将累加器功能是将累加器A A的内容按位逻辑取反,不影响标志。的内容按位逻辑取反,不影响标志。 2左环移指令 RL A功能是累加器A的8位向左循环移位,位7循环移入位0,不影响标志。3带进位左环移指令 RLC A功能是将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其它标志。4右环移指令 RR A功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。 5带进位位环移指令移指令 RRC ARRC A这条指令的功能是累加器这条指令的功能是累加器A A的内容和进位标志的内容和进位标志CyCy一起一起向右环移一位,向右环移一位,Acc.0Acc.0进入进入CyCy,CyCy移入移入Acc.7Acc.7。6累加器半字节交换指令 SWAP A将累加器A的高半字节(Acc.7Acc.4)和低半字节(Acc.3Acc.0)互换。例 (A)=0C5H,执行指令: SWAP A 结果:(A)=5CH7逻辑与指令 ANL A,Rn ; (A)(Rn)A,n=07 ANL A,direct ; (A)(direct)A ANL A,#data ; (A)#dataA ANL A,Ri; (A)((Ri))A,i=01 ANL direct,A; (direct)(A)direct ANL direct,#data; (direct)#datadirect例 (A)=07H,(R0)=0FDH,执行指令: ANL A,R0 结果:(A)=05H8.逻辑或指令 ORL A,Rn ;(A)(Rn)A ,n=07 ORL A,direct ;(A)(direct)A ORL A,#data ;(A) dataA ORL A,Ri ; (A)(Ri)A,i=0,1 ORL direct,A ;(direct)(A)direct ORL direct,#data;(direct)#datadirect 例 (P1)=05H,(A)=33H,执行指令 ORL P1,A结果:(P1)=37H 9逻辑异或指令 XRL A,Rn ;(A) (Rn)A XRL A,direct ;(A) (direct)A XRL A,Ri ;(A)((Ri))A ,i=0,1 XRL A,#data ;(A)#dataA XRL direct,A ;(direct)(A)direct XRL direct,#data ;(direct) #data direct例 (A)=90H,(R3)=73H 执行指令: XRL A,R3结果:(A)=E3H 3.3.4 3.3.4 控制转移类指令控制转移类指令 1无条件转移指令 AJMP addrll2K字节范围内的无条件跳转指令, 64K程序存储器空间分为32个区,每区2K字节,目标地址必须与AJMP下一条指令的第一个字节在同一2K个字节区范围内(即转移的目标地址必须与AJMP下一条指令的地址的高5位地址码A15A11相同)。执行指令时,先PC加2,然后把addrll送入PC.10PC.0,PC.15PC.11保持不变,程序转移到目标地址。本指令是为能与MCS-48的JMP指令兼容而设的。2相对转移指令 SJMP rel实现的程序转移是双向的。在编写程序时,直接写上要转向的目标地址标号就可以。例如: LOOP:MOV A,R6 SJMP LOOP 程序在汇编时,由汇编程序自动计算和填入偏移量。手工汇编时,偏移量rel的值则需程序设计人员自己计算。 3长跳转指令 LJMP addr16指令执行时把指令的第二和第三字节分别装入PC的高位和低位字节中,无条件地转向addr16指出的目标地址。目标地址可以在64K程序存储器地址空间的任何位置。4间接跳转指令 JMP A+DPTR由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内容作为基址,A的内容作变址。给A赋予不同的值,即可实现程序的多分支转移。 5条件转移指令程序的转移是有条件的。规定的条件满足,则进行转移,条件不满足则顺序执行下一条指令。当条件满足时,把PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出目标地址。JZ rel;如果累加器为“0”,则转移JNZ rel;如果累加器非“0”,则转移 6比较不相等转移指令CJNE A,direct,relCJNE A,#data,relCJNE Rn,#data,relCJNE Ri,#data,rel比较前面两个操作数的大小,如果它们的值不相等则转移 。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则置进位标志位Cy,否则清“0”Cy。7减1不为0转移指令这是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:DJNZ Rn,rel;n=07DJNZ direct,rel 将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中去。如果结果不为0则转移。允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。8调用子程序指令(1)短调用指令ACALL addrll与AJMP指令相类似,是为了与MCS-48中的CALL指令兼容而设的。(2)长调用指令LCALL addr169子程序的返回指令RET 执行本指令时:(SP)PCH,然后(SP)-1SP(SP)PCL,然后(SP)-1SP功能是从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值开始继续执行程序。10中断返回指令RETI这条指令的功能和RET指令相似,两条指令的不同之处,是本指令清除了中断响应时,被置“1”的MCS-51内部中断优先级寄存器的优先级状态。11空操作指令NOP 3.3.5 位操作指令 1.数据位传送指令 MOV C,bit MOV bit,C 例 MOV C,06H ;(20H).6Cy06H是内部RAM 20H字节位6的位地址。 MOV P1.0,C ;CyP1.0 2位变量修改指令 CLR C;清“0”Cy CLR bit;清“0”bit位 CPL C;Cy求反 CPL bit;bit位求反 SETB C;置“1” Cy SETB bit;置“1” bit位这组指令将操作数指出的位清“0”、求反、置“1”,不影响其它标志。 例 CLR C ;0Cy CLR 27H ;0(24H).7位 CPL 08H ;(21H).0位 SETB P1.7 ;1P1.7位 3位变量逻辑与指令 ANL C,bit ;bitCyCy ANL C,/bit; ;/bit CyCy 4位变量逻辑或指令 ORL C,bit ORL C,/bit 5条件转移类指令JC rel ;如果进位位Cy=1,则转移JNC rel ;如果进位位Cy=0,则转移JB bit,rel ;如果直接寻址位=1,则转移JNB bit,rel ;如果直接寻址位=0,则转移JBC bit,rel ;如果直接寻址位=1, 则转移,并清0直接寻址位附录A(P231)列出了按指令功能排列的全部指令及功能的简要说明,以及指令长度、执行的时间以及指令代码(机器代码)。读者可根据指令助记符,迅速查到对应的指令代码(手工汇编)。也可根据指令代码迅速查到对应的指令助记符(手工反汇编)。应熟练地掌握这些指令表的使用,因为这是使用MCS-51汇编语言进行程序设计的基础。 3.4 3.4 汇编语言程序设计基础汇编语言程序设计基础 汇编语言是一种采用助记符表示的机器汇编语言是一种采用助记符表示的机器语言,即用助记符号来代表指令的操作码和语言,即用助记符号来代表指令的操作码和操作数,用标号或符号代表地址、常数或变操作数,用标号或符号代表地址、常数或变量。而助记符一般都是英文单词的缩写,因量。而助记符一般都是英文单词的缩写,因此使用方便。这种用助记符编写的程序称为此使用方便。这种用助记符编写的程序称为源程序,汇编语言源程序必须翻译成机器语源程序,汇编语言源程序必须翻译成机器语言的目标代码,亦称目标程序,计算机才能言的目标代码,亦称目标程序,计算机才能执行。其翻译工作可由汇编程序自动完成,执行。其翻译工作可由汇编程序自动完成,汇编程序的功能就是将用助记符号编写的源汇编程序的功能就是将用助记符号编写的源程序翻译成用机器语言表示的目标程序。程序翻译成用机器语言表示的目标程序。3.4.1汇编语言程序的组成:汇编语言程序的组成: 汇编语言源程序是由汇编语句组成的,一般情汇编语言源程序是由汇编语句组成的,一般情况下,汇编语言语句可分为:指令性语句(即汇况下,汇编语言语句可分为:指令性语句(即汇编指令)和指示性语句(即伪指令)。编指令)和指示性语句(即伪指令)。 指令性语句(可简称指令)是进行汇编语言程序指令性语句(可简称指令)是进行汇编语言程序设计的可执行语句,每条指令都产生相应的机器设计的可执行语句,每条指令都产生相应的机器语言的目标代码。源程序的主要功能是由指令性语言的目标代码。源程序的主要功能是由指令性语句去完成的。语句去完成的。 指示性语句(伪指令)又称汇编控制指令。它是指示性语句(伪指令)又称汇编控制指令。它是控制汇编(翻译)过程的一些命令,程序员通过控制汇编(翻译)过程的一些命令,程序员通过伪指令通知汇编程序在进行汇编时的一些指示。伪指令通知汇编程序在进行汇编时的一些指示。因此,伪指令不产生机器语言的目标代码,是进因此,伪指令不产生机器语言的目标代码,是进行汇编语言程序设计的不可执行语句。行汇编语言程序设计的不可执行语句。3.4.23.4.2伪指令伪指令常用的伪指令: 1.ORG(ORiGin)汇编起始地址命令在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。如不用ORG规定,则汇编得到的目标程序将从0000H开始。例如: ORG 2000HSTART:MOV A,#00H规定标号START代表地址为2000H开始。在一个源程序中,可多次使用ORG指令,来规定不同的程序段的起始地址。但是,地址必须由小到大排列,地址不能交叉、重叠。例如:ORG 2000H ORG 2500H ORG 3000H 2. END(END of assembly)汇编终止命令汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。3. EQU(EQUate)赋值命令用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:TEST EQU 2000H表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。 4. DB(Define Byte)定义字节命令在程序存储器的连续单元中定义字节数据。 ORG 2000HTAB:DB 30H,40H,24,“C”,“B”汇编后:(2000H)=30H(2001H)=40H(2002H)=18H(10进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)DB功能是从指定单元开始定义(存储)若干个字节,10进制数自然转换成16进制数,字母按ASCII码存储。5DW(Define Word)定义数据字命令从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。高8位存入低地址字节,低8位存入高地址字节。例如:ORG 2000HDW 1246H,7BH,10汇编后:(2000H)=12H;第1个字(2001H)=46H(2002H)=00H;第2个字(2003H)=7BH(2004H)=00H;第3个字(2005H)=0AH(2005H)=0AH DB和DW定义的数表中,数的个数不能超过80个。若数据的数目较多,则可以使用多个命令定义。6.DS(定义存储单元)(定义存储单元)格式:格式:标号:标号:DS数字数字从标号所指示的单元开始,根据数字的值保留一定数从标号所指示的单元开始,根据数字的值保留一定数量的字节存储单元,留给以后存储数据用。例如量的字节存储单元,留给以后存储数据用。例如SPACE:DS10从从SPACE开始保留开始保留10个存储单元,下一条指令将从个存储单元,下一条指令将从SPACE10处开始汇编。处开始汇编。7.BIT(地址符号命令)(地址符号命令)格式:格式:标识符标识符BIT位地址位地址将位地址赋予标识符(不是标号)。例如将位地址赋予标识符(不是标号)。例如A1BITP1.0A2BIT20H.1MOVC,A1MOVA2,C3.4.3 3.4.3 汇编语言程序设计实例汇编语言程序设计实例1 1、简单程序、简单程序将片内将片内RAMRAM的的30H30H和和31H31H的内容相加,结果存入的内容相加,结果存入32H32H。 ORG 8000HORG 8000H MOV R0, #30H ; R030H MOV R0, #30H ; R030H MOV A, MOV A, R0 ; R0(30H)R0 ; R0(30H) INC R0 ; INC R0 ; 指向下一个单元指向下一个单元 ADD A, ADD A, R0 R0 ; ; 两个操作数相加两个操作数相加 INC R0 ; INC R0 ; 指向下一个单元指向下一个单元 MOV MOV R0, A ; R0, A ; 存放结果存放结果 ENDEND将外部数据存储器将外部数据存储器3000H和和3001H的低的低4位取出拼位取出拼成一个字,送成一个字,送3002H单元中。单元中。ORG2000HMOVDPTR,#3000HMOVXA,DPTR;取取3000H单元数据单元数据ANLA,#0FH;屏蔽高屏蔽高4 4位位SWAPA;高低高低4 4位交换位交换MOVR1,AINCDPTR;取取3001H单元数据单元数据MOVXA,DPTRANLA,#0FH;屏蔽高屏蔽高4 4位位ORLA,R1;拼字拼字INCDPTRMOVXDPTR,ASJMP$;等价于等价于 HEREHERE:SJMP HERE,SJMP HERE,实现停机实现停机END$表示该转移指令操作码所在的地址。表示该转移指令操作码所在的地址。2、分支程序分支程序将片外将片外RAM首地址为首地址为10H开始存放的数据块,传开始存放的数据块,传送给片内送给片内RAM首地址为首地址为20H开始的数据块中去,开始的数据块中去,如果数据为如果数据为”0”,则停止传送。则停止传送。ORG2000HMOVR0,#10HMOVR1,#20HLOOP:MOVXA,R0HERE:JZHEREMOVR1,AINCR0INCR1SJMPLOOPEND求符号函数的求符号函数的值。 ORG2000HXEQU30HYEQU31HMOVA,XJZLOOP0JBACC.7LOOP1MOVA,#01HSJMPLOOP0LOOP1:MOVA,#0FFHLOOP0:MOVY,ASJMP$END当当 X0 Y=X0 Y=1 X=0 Y=X=0 Y= 0 X0 Y=X0 Y= -1设设X X、Y Y分别为分别为30H30H和和31H31H单元单元3 3、循环程序、循环程序内部内部RAMRAM以以42H42H开始的连续单元中存放一组开始的连续单元中存放一组8 8位无符号数,位无符号数,长度长度n n(n=3DHn=3DH)存放在)存放在41H41H中,找出这组数中的最大数,中,找出这组数中的最大数,并存入内部并存入内部RAMRAM的的40H40H单元。单元。 ORG2000HMOVR0,#42HMOV40H,R0DEC41HLOOP:INCR0MOVA,R0CJNEA,40H,COMPCOMP:JCNEXT; 若(A)(40H),则转移至NEXTMOV40H,A;否则,存大数NEXT:DJNZ41H,LOOPSJMP$END延时子程序机器周期DELAY:MOVR7,#0FFH1LOOP1:MOVR6,#0FFH1LOOP2:NOP1NOP1DJNZR6,LOOP22DJNZR7,LOOP12RET2内循环一次所需机器周期数(内循环一次所需机器周期数(1 11 12 2)4 4内循环内循环255255次所需机器周期数次所需机器周期数4 425525510201020外循环一次所需机器周期数(外循环一次所需机器周期数(4 4255+1+2255+1+2)=1023=1023外循环外循环255255次所需机器周期数次所需机器周期数255255102310231 12 2260868260868一个机器周期为一个机器周期为1212个时钟周期,该子程序延时时间为:个时钟周期,该子程序延时时间为:2608682608681212f foscosc注意注意: :软件延时,不允许有中断,否则严重影响定时准确性。软件延时,不允许有中断,否则严重影响定时准确性。 代码转换例:例:8 8位二进制转换成位二进制转换成BCDBCD码。码。( (用十进制表达的二进制码)用十进制表达的二进制码);程序名:;程序名:BINBCD1;功能:;功能:0FFH内的二进制数转换为内的二进制数转换为BCD数数;入口:;入口:A存要转换的二进制数存要转换的二进制数;出口;出口:R0存放存放BCD数数百、十、个位数的地址百、十、个位数的地址BINBCD1:MOVB,#100DIVAB; A; A百位数百位数,B,B余数余数MOVR0,A;(;(R0R0)百位数百位数INCR0MOVA,#10XCHA,B;(A)(A)原(原(B B),),(B)=10(B)=10DIVAB; AA十位数十位数,B,B个位数个位数MOVR0,AINCR0XCHA,BMOVR0,ARET转换后为非压缩型转换后为非压缩型BCD码,书码,书P67例例345转换后为压缩型转换后为压缩型BCD码码将将A中的中的ASCII码转换为码转换为16进制数。进制数。十六进制数十六进制数09的的ASCII码为码为30H39H,差值为差值为30H;十六进制数;十六进制数AF的的ASCII码为码为41H46H,差值为差值为37H。ASCH:CLRCSUBBA,#30HCJNEA,#0AH,NEXTNEXT:JCDONE;若;若CyCy1 1(ASCIIASCII码为码为30H-39H30H-39H),), 减减30H,30H,返回返回SUBBA,#07H;若;若CyCy0 0(ASCIIASCII码为码为41H- 41H- 46H 46H),减),减37H37HDONE:RET查表程序查表程序1.用用DPTR查表(查查表(查09平方表)平方表)1000C083TA:PUSHDPH1002C082PUSHDPL1004902000MOVDPTR,#TAB100793MOVCA,A+DPTR1008D082POPDPL100AD083POPDPH100C22RETORG2000HTAB:DB00H,01H,04H,09H,2000002001012002042003092.用用PC查表(查查表(查09平方表)平方表)ORG1000H1000C083TA:ADDA,#01H;#01H为偏移量100283MOVCA,A+PC100322RET100400DB00H,01H,04H,09H,100501END100604100709偏移量表首地址(查表指令下一条指令地址)偏移量表首地址(查表指令下一条指令地址)1004H1003H01H本例中偏移量的设定至关重要,否则查表结果出错;设本例中偏移量的设定至关重要,否则查表结果出错;设A为为02H,执行查表指令,执行查表指令,(当前当前PC为为1003H,加加(A)02H后,后,PC跳至跳至1005H),取得,取得01H结果(结果(1的平方),而非的平方),而非04H。运算程序运算程序编写一子程序,实现多字节加法。两个多字节数分别存放在编写一子程序,实现多字节加法。两个多字节数分别存放在起始地址为起始地址为FIRSTFIRST和和SECONDSECOND的连续单元中(从低位字节开始的连续单元中(从低位字节开始存放),两个数的字节数存放在存放),两个数的字节数存放在NUMBERNUMBER单元中,求得的和存单元中,求得的和存放在放在FIRSTFIRST开始的区域。开始的区域。SUBAD:MOVR0,#FIRSTMOVR1,#SECOND;置起始地址MOVR2,NUMBER;置计数初值CLRC;清CyLOOP:MOVA,R0ADDCA,R1;加法运算MOVR0,A;存结果INCR0INCR1;修改地址指针DJNZR2,LOOP;计数及循环控制RET输入输出输入输出循环闪烁灯程序。用循环闪烁灯程序。用P1P1口分别控制口分别控制8 8个发光二极管的个发光二极管的阴极(共阳极接高电平),每次其中某个灯闪烁点阴极(共阳极接高电平),每次其中某个灯闪烁点亮亮1010次,依次进行,循环不止。次,依次进行,循环不止。 MOV A, #0FEH; MOV A, #0FEH; 第一盏灯亮第一盏灯亮SHIFT: LCALL FLASHSHIFT: LCALL FLASH;调用闪烁;调用闪烁1010次子程序次子程序 RR A RR A ;右移一次;右移一次 SJMP SHIFT SJMP SHIFT ;循环;循环FLASH: MOV R2, #0AH FLASH: MOV R2, #0AH ;闪烁十次;闪烁十次FLASH1:MOV P1, A FLASH1:MOV P1, A ;点亮某灯;点亮某灯 LCALL DELAY LCALL DELAY ;延时;延时 MOV P1,#00H MOV P1,#00H ;熄灭;熄灭 LCALL DELAYLCALL DELAY DJNZ R2, FLASH1 DJNZ R2, FLASH1 ;循环十次;循环十次 RETRET本本章章结结束束
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号