资源预览内容
第1页 / 共89页
第2页 / 共89页
第3页 / 共89页
第4页 / 共89页
第5页 / 共89页
第6页 / 共89页
第7页 / 共89页
第8页 / 共89页
第9页 / 共89页
第10页 / 共89页
亲,该文档总共89页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
指令系统与汇编语言程序设计指令系统与汇编语言程序设计指令和助记符指令和助记符 指令本身是一组二进制数代码,为了便于记忆,将这些代码用具有一定含义的指令助记符来表示,助记符一般采用英文单词的缩写 。例:例: 指令代码指令代码 助记符助记符 功能功能 740A MOV A,#0AH 将十六进制数将十六进制数0AH放放 入累加器入累加器A中中 指令的字节数指令的字节数 一条指令由操作码和操作数组成。操作码指明执行什么操作,例如数的传送、加法、减法等。操作数则表示这条指令所完成的操作对象,即是对谁进行操作。操作数可以是一个数,或者是一个数所在的内存地址。指令由指令字节组成,不同的指令,指令的字节数不相同。有单字节指令、双字节指令和三字节指令。 寻址方式寻址方式1 寄存器寻址2 直接寻址3 立即寻址4 寄存器间接寻址5 变址寻址6 相对寻址7 位寻址1寄存器寻址寄存器寻址 以通用寄存器的内容为操作数的寻址方式。通用寄存器为A、B 、DPTR以及R0R7 。 例:例: CLR A ;A0 INC DPTR ;DPTRDPTR+1 ADDR5,# 20H ;R5#20H+R52直接寻址直接寻址 指令中直接给出操作数地址的寻址方式,能进行直接寻址的存储空间有SFR寄存器和内部数据RAM。 例:例: MOVPSW,# 20H ;PSW#20H MOVA,30H ;A(30H)3立即寻址立即寻址 指令中直接给出操作数的寻址方式。立即操作数用前面加有#号的8位或16位数来表示。 例:例: MOVA,# 60H ;A#60H MOVDPTR,# 3400H ;DPTR#3400H MOV30H,# 40H;30H单元单元#40H 4寄存器间接寻址寄存器间接寻址 以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。间接寻址的存储器空间包括内部数据RAM和外部数据RAM。能用于寄存器间接寻址的寄存器有R0,R1和DPTR。在寄存器名称前面加一个符号来表示寄存器间接寻址。 例:例: MOV A , R0 ;A (R0) MOVX DPTR,A ;外部;外部RAM(DPTR)A 片内片内RAM30HR034HA30H34H MOV A ,R0 操作示意图操作示意图片外片外RAM2000HDPTR30HA2000H30HMOVX DPTR,A 操作示意图操作示意图5 5 变址寻址变址寻址 变址寻址是以某个寄存器的内容为基本地址,然后在这个基址上加以地址的偏移量,才是真正的操作数地址。 例:例: MOVC A, A+DPTR ;A(A+DPTR) MOVC A, A+PC ;A(A+PC) MOVC A, A+DPTR 操作示意图操作示意图程序存储器程序存储器02F1HDPTRA0302H1EH11HA执行前执行前1EHA执行后执行后+6 6相对寻址相对寻址 以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式。相对寻址用于修改PC值,主要用于实现程序的分支转移。 例:例: SJMP 08H ;PCPC+2+08H SJMP 08H 操作示意图操作示意图程序存储器程序存储器SJMP200AH08H2000H+208H执行前执行前PC2000H执行后执行后PC7 7 位寻址位寻址 位寻址只能对有位地址的单元作位寻址操作。位寻址其实是一种直接寻址方式,不过其地址是位地址。 例:例: SETB 10H ;将;将10H位置位置1 MOV 32H,C ;32H进位位进位位C CLR PSW.4 ;将;将RS1位清位清0指令分类说明指令分类说明1 算术运算类指令2 逻辑运算与循环类指令3 数据传送类指令4 程序转移类指令5 子程序调用及返回指令6 位操作指令算术运算类指令算术运算类指令 主要用于主要用于8 8位无符号数运算;也可用于带符号数运位无符号数运算;也可用于带符号数运算。包括:加、减、乘、除、加算。包括:加、减、乘、除、加1 1、减、减1 1运算指令,运算指令,指令操作将影响指令操作将影响PSWPSW中有关状态位。中有关状态位。 1 加法指令ADD AADD A,#data #data ADD AADD A,direct direct ADD AADD A,RnRn ADD AADD A, RiRi 用途:将用途:将A A中的值与源操作数所指内容相加,最终结果中的值与源操作数所指内容相加,最终结果 存在存在A A中。中。(1)不带进位位的加法指令(4 4条)条)例例1 1:ADD AADD A,#47H#47HADD AADD A,34H34HADD AADD A,R7R7ADD AADD A,R0R0例例2 2:MOV AMOV A,#0AEH ;-82#0AEH ;-82ADD AADD A,#81H ;-127#81H ;-127则执行完本条指令后,则执行完本条指令后,A A中的值为中的值为2FH2FHPSWPSW中状态位中状态位 C=1C=1, ,AC=0AC=0, ,OV=1OV=1, ,P=1P=1对无符号数:结果为对无符号数:结果为12FH;12FH;对带符号数:对带符号数:OV=1OV=1,有错有错。(2)带进位位的加法指令(4 4条)条)ADDC AADDC A,RnRn; A ARnRnCYCYAAADDC AADDC A,directdirect ; A A(direct )(direct )CYACYAADDC AADDC A, RiRi; A A( (RiRi) )CYACYAADDC AADDC A,#data#data; A AdatadataCYACYA用途:将用途:将A A中的值和其后面的值以及进位位中的值和其后面的值以及进位位C C中的值相加,中的值相加, 最终结果存在最终结果存在A A,常用于多字节数运算中。,常用于多字节数运算中。例: 先做先做67H+A0H=107H67H+A0H=107H,而而1 107H07H显然超过了显然超过了0FF0FFH H,因此最终保存在因此最终保存在A A中的是中的是07H07H,而,而1 1则到了则到了PSWPSW中中的的CYCY位了。换言之,位了。换言之,CYCY就相当于是就相当于是100H100H。 然后再做然后再做10H + 30H + 10H + 30H + CYCY,结果是结果是41H41H,所以所以最终的结果是最终的结果是4107H4107H。1067H+30A0H1067H+30A0H0001 0000 0110 0111 0011 0000 1010 0000 0100 0001 0000 0111 1067H1067H30A0H30A0H4107H4107H又例: 先做先做67H+20H=87H67H+20H=87H,没有超过,没有超过0FF0FFH H,因此最终因此最终保存在保存在A A中的是中的是87H87H,而,而PSWPSW中的中的CY=0CY=0。 然后再做然后再做10H + 30H + 10H + 30H + CYCY,结果是结果是40H40H,所以所以最终的结果是最终的结果是4087H4087H。1067H+3020H1067H+3020H0001 0000 0110 0111 0011 0000 0010 0000 0100 0000 1000 0111 1067H1067H3020H3020H4087H4087H(3) 加1指令(5 5条)条)INC AINC A;A+1A+1AA,影响影响P P标志标志INC INC RnRn;Rn+1RnRn+1RnINC directINC direct;(direct)+1(direct)(direct)+1(direct)INC INC RiRi;(Rn)+1(Rn)(Rn)+1(Rn)INC DPTRINC DPTR;DPTR+1DPTRDPTR+1DPTR功能很简单,就是将后面目标中的值加功能很简单,就是将后面目标中的值加1 1。例:例:A=12HA=12H,R0=33HR0=33H,(21H)=32H(21H)=32H, (34H)=22H(34H)=22H,DPTR=1234HDPTR=1234H。连续执行下面的指令:连续执行下面的指令: INC AINC A INC R0 INC R0 INC 21H INC 21H INC R0 INC R0 INC DPTR INC DPTR; A=13H; R0=34H;(21H)=33H;(34H)=23H; DPTR=1235HDA ADA A在进行在进行BCDBCD码加法运算时,跟在码加法运算时,跟在ADDADD和和ADDCADDC指令指令之后,用来对之后,用来对BCDBCD码加法运算结果进行码加法运算结果进行自动修正自动修正。例:例:A=00010101A=00010101(代表十进制数(代表十进制数1515) ADD AADD A,#8#8(4) 十进制调整指令(1 1条)条); ; A=1DHA=1DH,按二进制规律加按二进制规律加; ; A=23HA=23H,按十进制规律加按十进制规律加DA ADA A2 减法指令(8 8条)条)SUBB ASUBB A,RnRn ; A ARnRnCYCYAASUBB ASUBB A,direct direct ; A A(direct )(direct )CYACYASUBB ASUBB A, RiRi ; A A( (RiRi) )CYCYAASUBB ASUBB A,#data#data; A AdatadataCYACYA将将A A中的值减去源操作数所指内容以及进位位中的值减去源操作数所指内容以及进位位C C中的中的值,最终结果存在值,最终结果存在A A中。中。说明:没有不带借位的减法指令,如果需要做不带位说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将的减法指令(在做第一次相减时),只要将CY清零即可。清零即可。(1) 带借位的减法指令(4 4条)条)(2) 减1指令(4 4条)条)DEC ADEC A ;A-1A-1A,A,DEC DEC RnRn;Rn-1RnRn-1RnDEC directDEC direct ;(direct)-1(direct)(direct)-1(direct)DEC DEC RiRi;(Rn)-1(Rn)(Rn)-1(Rn) 与加与加1 1指令类似。指令类似。 3 乘法指令(1 1条)条)MUL ABMUL AB ;A AB BBABA此指令的功能是将此指令的功能是将A A和和B B中的两个中的两个8 8位无符号数相乘,位无符号数相乘,结果将为结果将为1616无符号数。其中高无符号数。其中高8 8位放在位放在B B中,低中,低8 8位放在位放在A A中。中。在乘积大于在乘积大于FFHFFH时,时,0V0V置置1 1,否则,否则OVOV为为0 0;而;而CYCY总是总是0 0。例:例: A=4EHA=4EH,B=5DHB=5DH,执行执行MUL ABMUL AB指令后,乘积是指令后,乘积是1C561C56H H,所以在所以在B B中放的是中放的是1CH1CH,而,而A A中放的则是中放的则是56H56H。 4 除法指令(1 1条)条)DIV ABDIV AB;A AB B的商的商A A,余数余数B B此指令的功能是将此指令的功能是将A A中的中的8 8位无符号数除位无符号数除B B中的中的8 8位位无符号数,商放在无符号数,商放在A A中,余数放在中,余数放在B B中。中。如果在做除法前如果在做除法前B B中的值是中的值是00H00H,也就是除数为,也就是除数为0 0,那,那么么0V=10V=1。例:例:A=11HA=11H,B=04HB=04H,执行执行DIV ABDIV AB指令后,结果为:指令后,结果为:A=04HA=04H,B=1B=1。逻辑运算与循环类指令逻辑运算与循环类指令主要用于对主要用于对2 2个操作数按位进行逻辑操作,结果送到个操作数按位进行逻辑操作,结果送到A A或直接寻址单元。或直接寻址单元。v 主要操作主要操作 与、或、异或、移位、取反、清零等。与、或、异或、移位、取反、清零等。v 对标志位的影响对标志位的影响 除了目的操作数为除了目的操作数为ACCACC的指令影响奇偶标志的指令影响奇偶标志P P外,外,一般不影响标志位。一般不影响标志位。1 1 逻辑或指令逻辑或指令(6 6条)条)ORL A,Rn ;ARnAORL A,direct ;A(direct)AORL A,Ri ;A(Ri)AORL A,#data ;AdataAORL direct,A ;(direct)A(direct)ORL direct,#data ;(direct)data(direct)影响影响P P标志标志例:例:71H和和56H相或:相或:01110001 (71H) ) 01010110 (56H) 01110111 即即77H后两条指令,若直接地址为后两条指令,若直接地址为I/OI/O端口,则为端口,则为“读改读改写写”操作。操作。2 逻辑与指令 (6 6条)条)ANL A,Rn ;ARnAANL A,direct ;A(direct)AANL A,Ri ;A(Ri)AANL A,#data ;AdataAANL direct,A ;(direct)A(direct)ANL direct,#data ;(direct)data(direct)影响影响P P标志标志例:例:71H71H和和56H56H相与:相与:01110001 01110001 (71H71H) )01010110 01010110 (56H56H) 01010000 01010000 即即50H50H后两条指令,后两条指令,若直接地址为若直接地址为I/OI/O端口,则为端口,则为“读读改改写写”操作。操作。例:例:71H71H和和56H56H相异或:相异或: 01110001 01110001 (71H71H) ) 01010110 ) 01010110 (56H56H) 3 逻辑异或指令(6 6条)条)XRL A,Rn ;A RnAXRL A,direct ;A (direct)AXRL A,Ri ;A (Ri)AXRL A,#data ;A dataAXRL direct,A ;(direct) A(direct)XRL direct,#data ;(direct) data(direct)影响影响P标志标志00100111 00100111 即即27H27H后两条指令,若直接地址为后两条指令,若直接地址为I/OI/O端口,则为端口,则为“读改读改写写”操作。操作。 4 取反与清与清0 0指令(2 2条)条)取反:取反:CPL A CPL A ;/AA/AA例:若例:若A=5CHA=5CH, 执行执行CPL ACPL A 结果:结果:A=A3HA=A3H清清0 0:CLR ACLR A ;0A0A5 循环移位指令(4 4条)条)RL ARR ARLC ARRC AA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0后两条指令,影响后两条指令,影响P P和和CYCY标志。标志。例:若若A=5CHA=5CH,CY=1CY=1,执行执行RLC ARLC A后,后,v 对对RLCRLC、RRCRRC指令,在指令,在CY=0CY=0时时RLCRLC相当于相当于乘乘以以2 2RRCRRC相当于相当于除除以以2 2结果:结果:A=B9HA=B9H,CY=0CY=0,P=1P=10101 11000101 11001 11011 10011011 10010 0综合举例:综合举例:ANL AANL A,#0FH#0FH ;屏蔽;屏蔽A A的高的高4 4位位SWAP ASWAP AANL P1ANL P1,#0FH#0FH ;清;清P1P1口高口高4 4位位ORL P1ORL P1,A A ;P1P1口高口高4 4位输出位输出A A的低的低4 4位;位; 把累加器把累加器A A中的低中的低4 4位状态,通过位状态,通过P1P1口的高口的高4 4位输位输出,出, P1P1口的低口的低4 4位状态不变。位状态不变。数据传送类指令数据传送类指令 助记符助记符 说明说明 MOVMOV、MOVXMOVX、MOVC MOVC 传送操作传送操作 XCHXCH、XCHDXCHD、SWAP SWAP 交换操作交换操作 PUSHPUSH、POP POP 堆栈操作堆栈操作v 源操作数寻址方式源操作数寻址方式: 立即寻址、直接寻址、寄存器寻址、立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。寄存器间接寻址、变址寻址。v 目的操作数寻址方式目的操作数寻址方式: 直接寻址、寄存器寻址、寄存器间接寻址直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为除了目的操作数为ACCACC的指令影响奇偶标志的指令影响奇偶标志P P外,一般不影外,一般不影 响标志位。响标志位。直接地址直接地址direct累加器累加器A直接地址直接地址direct间接地址间接地址Ri寄存器寄存器Rn立即数立即数#data寄存器寄存器DPTR8051单片机片内数据传送图单片机片内数据传送图1 1 以累加器为目的操作数的指令(以累加器为目的操作数的指令(4 4条)条) MOV AMOV A,RnRn MOV AMOV A,directdirectMOV AMOV A, RiRiMOV AMOV A,#data#data 这组指令功能将这组指令功能将源操作数指定内容源操作数指定内容送到送到A A中。中。 2 2 以寄存器以寄存器RnRn为目的操作数的指令为目的操作数的指令 (3 3条)条) MOV MOV RnRn,A A MOV MOV RnRn,directdirect MOV MOV RnRn,#data#data 这组指令功能是把这组指令功能是把源操作数指定源操作数指定的内容送入当前工作寄存的内容送入当前工作寄存 器,源操作数不变。器,源操作数不变。 3 3 以直接地址为目的操作数的指令(以直接地址为目的操作数的指令(5 5条)条)MOV directMOV direct,A AMOV directMOV direct,RnRnMOV direct1MOV direct1,direct2direct2MOV directMOV direct, RiRiMOV directMOV direct,#data#data 这组指令功能是把这组指令功能是把源操作数指定源操作数指定的内容送入由直接的内容送入由直接地址指出的片内存储单元。地址指出的片内存储单元。例:例: MOV 20H,AMOV 20H,R1MOV 20H,30HMOV 20H,R1MOV 0A0H,#34HMOV P2,#34H4 以间接地址为目的操作数的指令以间接地址为目的操作数的指令(3条)MOV MOV RiRi,A A MOV MOV RiRi,directdirectMOV MOV RiRi,#data#data 功能:把源操作数指定的内容送入以功能:把源操作数指定的内容送入以R0R0或或R1R1中内容为中内容为 地址的片内存储单元。地址的片内存储单元。例:例: MOV R0,AMOV R1,20HMOV R0,#34H5 5 十六位数的传递指令(十六位数的传递指令(1 1条)条)MOV DPTRMOV DPTR,# #data16data1680518051是是8 8位机,这是唯一的一条位机,这是唯一的一条1616位立即数传递指令。位立即数传递指令。功能:将一个功能:将一个1616位的立即数送入位的立即数送入DPTRDPTR中去。其中高中去。其中高8 8位位 送入送入DPHDPH,低低8 8位送入位送入DPLDPL。 例:例:MOV DPTR,#1234H执行完了之后执行完了之后DPHDPH中的值为中的值为12H12H,DPLDPL中的值为中的值为34H34H。如果我们分别向如果我们分别向DPHDPH,DPLDPL送数,则结果也一样。送数,则结果也一样。 如下面两条指令:如下面两条指令: MOV DPH,#35H MOV DPL,#12H。 相当于执行了相当于执行了 MOV DPTR,#3512H。6 6 累加器累加器A A与片外与片外RAMRAM之间的数据传递类指令之间的数据传递类指令(4(4条条) ) MOVMOVX X A A,DPTRDPTR MOVMOVX X DPTRDPTR,A A MOVMOVX X A A, RiRi MOVMOVX X RiRi,A A说明: (1).在8051中,与外部RAM存储器打交道的只可以是累加器A 。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A A读入。 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。 比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。 (2).要读或写外部RAM,必须要知道RAM的地址,采用DPTR时,地址被直接放在DPTR中的。采用Ri(R0或R1)时,由于Ri只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。 (3).使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,DPTRMOV DPTR,#0200HMOVX DPTR,A7 读读程序存储器指令(程序存储器指令(2条)条) MOVC AMOVC A, A+DPTRA+DPTR MOVC A MOVC A, A+PCA+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指 令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。例:有一个数在R0中,要求用查表的方法确定它的平方值(此 数的取值范围是0-5)MOV DPTR,#100H MOV A,R0 MOVC A,A+DPTR ORG 0100HDB 0,1,4,9,16,25 8 堆栈操作(堆栈操作(2 2条)条)PUSH directPUSH directPOP directPOP direct 第一条为压入指令,将第一条为压入指令,将directdirect中的内容送入堆栈中,第二条为中的内容送入堆栈中,第二条为 弹出指令,将堆栈中的内容送回到弹出指令,将堆栈中的内容送回到directdirect中。中。例:例: MOV SP,#10H MOV 40H,#50H PUSH 40H POP 30H 执行第一条PUSH 40H指令是这样的:将SP中的值加1,变为11H,然后将40H中的值送到11H单元中,因此执行完本条指令后,内存11H单元的值是50H,同样,执行POP 30H时,是将11H中的值送入到30H单元中,即执行完本条指令后,30H单元中的值变为50H。 9 9 交换指令(交换指令(5 5条)条)XCH AXCH A,RnRnXCH AXCH A, directdirectXCH AXCH A, RiRiXCHD AXCHD A, RiRiSWAP ASWAP A例:例: 已知A中的内容为34HMOV R6, #29HXCH A, R6SWAP AXCH A, R6 XCHD A, R0程序转移类指令程序转移类指令此类指令一般不影响此类指令一般不影响PSWPSW。包括以下类型:包括以下类型:无条件转移和条件转移无条件转移和条件转移相对转移和绝对转移相对转移和绝对转移长转移和短转移长转移和短转移调用与返回指令调用与返回指令 无条件转移类指令(4 4条)条) 短转移类指令:短转移类指令:AJMP addr11AJMP addr11 长转移类指令:长转移类指令:LJMP addr16LJMP addr16 相对转移指令:相对转移指令:SJMP SJMP relrel 间接转移指令:间接转移指令:JMP A+DPTRJMP A+DPTR(1 1)上面的前三条指令,统统理解成:上面的前三条指令,统统理解成:PCPC值改变,即值改变,即跳转到一个标号处。跳转到一个标号处。 那么他们的区别何在呢?那么他们的区别何在呢?v跳转的范围不同。跳转的范围不同。 短转移类指令:短转移类指令:AJMP addr11AJMP addr11 长转移类指令:长转移类指令:LJMP addr16LJMP addr16 相对转移指令:相对转移指令:SJMP SJMP relrel转移范围转移范围:2KB2KB64KB64KB-128-128+127+127v指令构成不同。指令构成不同。 AJMPAJMP、LJMPLJMP后跟的是后跟的是绝对地址绝对地址, 而而SJMPSJMP后跟的是后跟的是相对地址相对地址。 v指令长度不同指令长度不同v 原则上,所有用原则上,所有用SJMPSJMP或或AJMPAJMP的地方都可以用的地方都可以用 LJMPLJMP来替代。来替代。散转指令:散转指令:JMP A+DPTRJMP A+DPTR 这条指令的用途也是跳转,转到什么地方去呢这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。?这可不能由标号简单地决定了。 转移地址由转移地址由A+DPTRA+DPTR形成,并直接送入形成,并直接送入PCPC。指令对指令对A A、DPTRDPTR和标志位均无影响。和标志位均无影响。 本指令可代替众多的判别跳转指令,又称为本指令可代替众多的判别跳转指令,又称为散散转指令转指令,多用于多分支程序结构中。,多用于多分支程序结构中。(2 2)第四条指令与前三条指令相比有所不同第四条指令与前三条指令相比有所不同 条件转移指令条件转移指令(8 8条)条)条件转移指令是指在满足一定条件时进行相对转条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行移,否则程序继续执行本指令的本指令的下一条指令。下一条指令。一、判一、判A内容是否为内容是否为0转移指令转移指令(2条) JZ JZ relrel ;如果;如果A=0A=0,则转移,否则顺序执行。则转移,否则顺序执行。 JNZ JNZ relrel ;如果如果A0A0,就转移。就转移。转移到相对于当前转移到相对于当前PCPC值的值的8 8位移量的地址去。即:。即: 新的新的PCPC值值= =当前当前PC+PC+偏移量偏移量relrel在编写汇编语言源程序时,可以直接写成:在编写汇编语言源程序时,可以直接写成: JZ JZ 标号标号 ;即转移到标号处。;即转移到标号处。二、比较不等转移指令(4 4条)条)CJNE ACJNE A,#data#data,relrel CJNE ACJNE A,directdirect,relrelCJNE CJNE RnRn,#data#data,relrelCJNE CJNE RiRi,#data#data,relrel此类指令的功能是将两个操作数比较,如果两者相等,就此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。顺序执行,如果不相等,就转移。同样地,使用时,可以将同样地,使用时,可以将relrel理解成标号,即:理解成标号,即:CJNE ACJNE A,#data#data,标号标号CJNE ACJNE A,directdirect,标号标号CJNE CJNE RnRn,#data#data,标号标号CJNE CJNE RiRi,#data#data,标号标号利用这些指令,可以判断两数是否利用这些指令,可以判断两数是否相等相等。但有时还想得知两数比较之后但有时还想得知两数比较之后哪个大哪个大,哪个小哪个小,本条指令也具有这样的功能:本条指令也具有这样的功能:如果两数不相等,则如果两数不相等,则CPUCPU还会用还会用CYCY(进位位)进位位)来反映哪个数大,哪个数小。来反映哪个数大,哪个数小。如果前面的数大,则如果前面的数大,则CY=0CY=0,否则否则CY=1CY=1。因此在程序转移后再次利用因此在程序转移后再次利用CYCY就可判断出哪个就可判断出哪个数大,哪个数小了。数大,哪个数小了。三、减三、减1 1不为不为0 0转移指令(转移指令(2 2条)条)DJNZ DJNZ RnRn,relrelDJNZ directDJNZ direct,relrelDJNZDJNZ指令的执行过程是这样的指令的执行过程是这样的: :它将第一个参数中的值它将第一个参数中的值减减1 1,然后看这个值是否等于,然后看这个值是否等于0 0,如果,如果等于等于0 0,就往下执行,如果,就往下执行,如果不等于不等于0 0,就转移,就转移到第二个参数所指定的地方去。到第二个参数所指定的地方去。例:例: LOOPLOOP: DJNZ 10HDJNZ 10H,LOOPLOOP 例:例: MOV 23H,#0AHMOV 23H,#0AH CLR A CLR ALOOP: ADD A,23HLOOP: ADD A,23H DJNZ 23H,LOOP DJNZ 23H,LOOP SJMP $ SJMP $上述程序段的执行过程是:上述程序段的执行过程是:将将23H23H单元中的数连续相加,存至单元中的数连续相加,存至A A中,每加一次,中,每加一次, 23H23H单元中的数单元中的数值值减减1 1,直至减到,直至减到0 0,共加(,共加(23H23H)次。)次。 子程序调用与返回指令子程序调用与返回指令一、一、调用指令调用指令(2 2条)条) LCALL addr16LCALL addr16 ;长调用指令长调用指令(3(3字节字节) ) ACALL addr11ACALL addr11 ;短调用指令短调用指令(2(2字节字节) )上面两条指令都是在主程序中调用子程序,两者的区别上面两条指令都是在主程序中调用子程序,两者的区别: :对短调用指令,被调用子程序入口地址必须与调用指令下对短调用指令,被调用子程序入口地址必须与调用指令下一条指令的第一字节在相同的一条指令的第一字节在相同的2KB2KB存储区之内。使用时可存储区之内。使用时可以用标号表示子程序首地址以用标号表示子程序首地址二、返回指令 (2 2条)条)子程序执行完后必须回到主程序,如何返子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。回呢?只要执行一条返回指令就可以了。RETRET;子程序返回指令子程序返回指令RETIRETI;中断子程序返回指令中断子程序返回指令两者不能互换使用。两者不能互换使用。空操作指令(空操作指令(1 1条)条) NOP空操作,就是什么事也不干,停一个周期,一般用空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。作短时间的延时。位操作指令位操作指令80518051单片机的硬件结构中,有一个位处理器(又单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。括位变量传送、逻辑运算、控制程序转移等。在在80518051中,有一部份中,有一部份RAMRAM和一部份和一部份SFRSFR是具有位寻是具有位寻址功能的。址功能的。v位操作区:内部位操作区:内部RAMRAM的的20H-2FH20H-2FH这这1616个字节单个字节单元,即元,即128128个位单元个位单元( (位地址空间位位地址空间位00007FH)7FH);v可以位寻址的特殊功能寄存器。可以位寻址的特殊功能寄存器。 以以PSW中位中位4( RS1 )为例)为例。直接直接(位位)地址方式:如地址方式:如 D4H;点操作符号方式:如点操作符号方式:如 PSW.4,D0H.4;位名称方式:如位名称方式:如 RS1;用户定义名方式:如用伪指令用户定义名方式:如用伪指令 bitSUB.REG bit RS1定义后,可用定义后,可用SUB.REG代替代替RS1。位地址表达方式位地址表达方式 位传送指令位传送指令(2条) MOV CMOV C,bitbit;bit bit C CMOV bitMOV bit,C C;C C bitbit这组指令的功能是实现位累加器(这组指令的功能是实现位累加器(CYCY)和其它和其它位地址之间的数据传递。位地址之间的数据传递。例:例:MOV CMOV C,P1.0P1.0;将;将P1.0P1.0的状态送给的状态送给C C。 MOV P1.0MOV P1.0,C C ;将将C C中的状态送到中的状态送到P1.0 P1.0 ;引脚上去。;引脚上去。位清位清0 0和置位和置位(4 4条)条) 位清位清0 0指令指令 CLR CCLR C ;使使CY=0CY=0 CLR bit CLR bit ;使指令的位地址等于;使指令的位地址等于0 0。 例:例:CLR P1.0 CLR P1.0 ;即使;即使P1.0P1.0变为变为0 0 位置位置1 1指令指令 SETB CSETB C ;使使CY=1CY=1 SETB bit SETB bit ;使指定的位地址等于;使指定的位地址等于1 1。 例:例:SETB P1.0 SETB P1.0 ;使;使P.0P.0变为变为1 1 位逻辑运算指令位逻辑运算指令 (6 6条)条) 位与指令位与指令 ANL CANL C,bitbit ;Cy与指定位的值相与,结果送CyANL CANL C,/bit/bit ;先将指定的位地址中的值取出后取反,再和Cy相与,结果送回Cy。但但注意注意: :指定的指定的位地址中的值本身并不发生变化。位地址中的值本身并不发生变化。例:例:ANL C,/P1.0位取反指令位取反指令 CPL CCPL C ;使;使CyCy值取反。值取反。CPL bitCPL bit ;使指定的位的值取反。;使指定的位的值取反。例:例:CPL P1.0CPL P1.0位或指令位或指令 ORL CORL C,bitbitORL CORL C,/bit/bit 位条件转移指令位条件转移指令(5 5条)条) 判判CyCy转移指令转移指令 JC relJNC rel 第一条指令的功能是如果Cy=1就转移,否则就顺序执行。 第二条指令则和第一条指令相反,即如果Cy=0就转移,否则就顺序执行。 判位变量转移指令判位变量转移指令 JB bit,relJNB bit,rel JBC bit,rel第一条指令:如果指定的(bit)=1,则转移,否则顺序执行,第二条指令功能相反。第三条指令是如果指定的(bit)=1,则转移,并把该位清0,否则顺序执行。汇编语言格式与伪指令汇编语言格式与伪指令1.1.汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成汇编语句(指令语句)汇编语句(指令语句)伪指令(指示性语句)伪指令(指示性语句)2.2.汇编语句的格式:汇编语句的格式: 标号标号:操作码操作码操作数操作数;注释;注释3. 伪指令:控制汇编用的特殊指令,这些指令不伪指令:控制汇编用的特殊指令,这些指令不属于指令系统,不产生机器代码。属于指令系统,不产生机器代码。 常用的伪指令v ORG ORG 定位目的程序的起始地址。定位目的程序的起始地址。 格式:格式:ORG ORG 表达式表达式 表达式必须为表达式必须为16位地址值。位地址值。如:如:ORG 0000Hv END END 汇编语言程序结束伪指令。汇编语言程序结束伪指令。 一定放在程序末尾!一定放在程序末尾!v EQU EQU 赋值伪指令。赋值伪指令。 格式:格式: 字符名称字符名称 EQU EQU 数值或汇编符号数值或汇编符号 例:例: AAAAEQUEQU30H30HK1K1EQUEQU40H40HMOV AMOV A,AAAA; ( (30H30H)A AMOV AMOV A,K1K1;(40H40H)A A常用的伪指令vDBDB 从指定单元开始定义(存储)若干个字节的数据从指定单元开始定义(存储)若干个字节的数据或或ASCIIASCII码字符,常用于定义数据常数表。码字符,常用于定义数据常数表。格式:格式:DBDB 字节常数字节常数 或或 ASCIIASCII字符字符例例: :ORGORG 1000H 1000HDBDB34H34H,0DEH0DEH,A A,B BDBDB0AH0AH,0BH0BH,2020常用的伪指令常用的伪指令vDWDW 从指定单元开始定义(存储)若干个字的数据从指定单元开始定义(存储)若干个字的数据 或或ASCIIASCII码字符。码字符。 格式:格式:DWDW字常数或字常数或ASCIIASCII字符字符 例:例: ORG 2000HORG 2000HDWDW1234H1234H,B BDWDW0AH0AH,2020常用的伪指令v BITBIT 位地址符号指令。位地址符号指令。 把位地址赋于规定的字符名称。把位地址赋于规定的字符名称。 格式:字符名称格式:字符名称BITBIT位地址位地址例:例: ABCABCBITBITP1.1P1.1QQQQBITBITP3.2P3.2应用程序设计应用程序设计 在进行应用汇编程序设计时,首先要确定算法,算法的优劣很大程度上决定了程序的效率,另外还要尽可能画出程序框图,以便于分析程序流程。定点数运算子程序定点数运算子程序定点数:小数点固定的数。 可以把小数点固定在数值的最高位之前, 对于有符号的数,小数点应在符号位与最高数值位之间,即: 符号位 数值部分 也可以把小数点固定在最低数值位后面,即: 符号位 数值部分定点数表示方式定点数表示方式(1)原码表示法 符号位为0表示正数,符号位为1表示负数 如:二进制数00110100表示十进制数+52二进制数10110100表示十进制数-52 (2)补码表示法正数的补码表示与原码相同, 即最高位为0, 其余位为数值位。负数用补码表示时, 最高位为1, 数值位要按位取反后再在最低位加1,才是该负数的数值。 例如:十进制数+51的二进制补码为00110011十进制数 -51的二进制补码为11001101 例:例: 双字节数取补子程序。双字节数取补子程序。 将(R4R5)中的双字节数取补,结果送R4R5。 CMPT:MOV A,R5 CPL A ADD A,#1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4,A RET例:例: 双字节原码数左移一位子程序。双字节原码数左移一位子程序。 将(R2R3)左移一位,结果送R2R3,不改变符号位, 不考虑溢出。 DRL1: MOV A,R3CLR CRLC AMOV R3,AMOV A,R2RLC AMOV ACC.7,C ;恢复符号位;恢复符号位MOV R2,ARET例:例: 双字节原码右移一位子程序。双字节原码右移一位子程序。 将(R2R3)右移一位,结果送R2R3,不改变符号位。 DRR1: MOV A,R2MOV C,ACC.7 ;保护符号位;保护符号位CLR ACC.7 ;移入;移入0RRC AMOV R2,AMOV A,R3RRC AMOV R3,ARET例:例: 双字节补码右移一位子程序。双字节补码右移一位子程序。 将(R2R3)右移一位,结果送R2R3,不改变符号位。CRR1:MOV A,R2MOV C,ACC.7 ;保护符号位;保护符号位RRC A ;移入符号位;移入符号位MOV R2 ,AMOV A,R3RRC AMOV R3,ARET例:双字节无符号数加法子程序。例:双字节无符号数加法子程序。 将(R2R3)和(R6R7)两个无符号数相加,结果送R4R5。NADD: MOV A,R3ADD A,R7MOV R5,AMOV A,R2ADDC A,R6MOV R4,ARET例:双字节无符号数减法子程序。例:双字节无符号数减法子程序。 将(R2R3)和(R6R7)两个双字节数相减,结果送R4R5。NSUB1: MOV A,R3CLR CSUBB A,R7MOV R5,AMOV A,R2SUBB A,R6MOV R4,ARET例:双字节原码加减运算子程序。例:双字节原码加减运算子程序。 (R2R3)和(R6R7)为两个原码表示的数,最高位为符号位,求(R2R3)(R6R7)结果送R4R5。程序中DADD为原码加法子程序入口,DSUB为原码减法子程序入口。出口时CY=1发生溢出,CY=0为正常。 DSUB:MOV A, R6 ;减法入口减法入口CPL ACC.7 ;取反符号位取反符号位MOV R6, A DADD: MOV A, R2 ;加法入口加法入口MOV C, ACC.7MOV F0, C ;保存被加数符号位保存被加数符号位XRL A, R6MOV C, ACC.7 ;C=1,异号,异号,C=0,同号,同号MOV A, R2 CLR ACC.7 ;清清0被加数符号被加数符号MOV R2, AMOV A, R6CLR ACC.7 ;清清0加数符号加数符号MOV R6, AJC DAB2ACALL NADD ;同号执行加法同号执行加法MOV A, R4JB ACC.7, DABEDAB1: MOV C, F0 ;恢复结果的符号恢复结果的符号MOV ACC.7, CMOV R4, ARETDABE: SETB CRET ;溢溢 出出DAB2: ACALL NSUB1 ;异号执行减法异号执行减法MOV A, R4JNB ACC.7, DAB1ACALL CMPT ;不够减,取补不够减,取补CPL F0 ;符号位取反符号位取反SJMP DAB1例:例: 无符号二进制乘法程序。无符号二进制乘法程序。 将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。NMUL:MOV R4,#0MOV R5,#0MOV R0,#16 ;16位二进制数位二进制数CLR CNMLP:MOV A,R4 ;右移一位;右移一位RRC AMOV R4,AMOV A,R5RRC AMOV R5,AMOV A,R6RRC AMOV R6,AMOV A,R7RRC AMOV R7,AJNC NMLN ;C为移出的乘数最低位为移出的乘数最低位, 若为若为0, 不执行加法不执行加法MOV A,R5 ;执行加法;执行加法ADD A,R3MOV R5,AMOV A,R4ADDC A,R2MOV R4,ANMLN:DJNZ R0,NMLP ;循环;循环16次次MOV A,R4 ;最后将结果再右移一位;最后将结果再右移一位RRC AMOV R4,AMOV A,R5RRC AMOV R5,AMOV A,R6RRC AMOV R6,AMOV A,R7RRC AMOV R7,A RET快速乘法快速乘法例:无符号双字节快速乘法。例:无符号双字节快速乘法。 将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。QMUL:MOV A,R3MOV B,R7MUL AB ;R3R7XCH A,R7 ;R7=(R3R7)LMOV R5,B ;R5=(R3R7)HMOV B,R2MUL AB ;R2R7ADD A,R5MOV R4,ACLR AADDC A,BMOV R5,A ;R5=(R2R7)HMOV A,R6MOV B,R3MUL AB ;R3R6ADD A,R4XCH A,R6XCH A,BADDC A,R5MOV R5,AMOV F0,C ;暂存;暂存CYMOV A,R2 ;R2R6 MUL ABADD A,R5MOV R5,ACLR AMOV ACC.0,CMOV C,F0 ;加以前加法的进位;加以前加法的进位ADDC A,BMOV R4,ARET
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号