51单片机汇编浅析_第1页
51单片机汇编浅析_第2页
51单片机汇编浅析_第3页
51单片机汇编浅析_第4页
51单片机汇编浅析_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 概述7种寻址方式,111条指令字节数运算速度单字节指令:49条双字节指令:45条三字节指令:17条单周期指令:64条双周期指令:45条四周期指令: 2 条 MCS-51指令系统8/12/20221功能数据传送类:29条算术运算类:24条逻辑运算类:24条控制转移类:17条位操作类: 17条8/12/20222常用符号Rn:工作寄存器中的寄存器Rn、R1R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地

2、址8/12/20223rel: 补码形式的8位地址偏移量。 偏移范围为-128127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容:箭头左边的内容送入箭头右边的单元内8/12/20224 3.2 寻址方式3.2.1 立即寻址Immediate Addressing 操作数就包含在指令代码中,在操作码之后,称为立即数,用“”表示。 MCS-51 如:MOV P1, #80H MOV R7, #0F5H MOV DPTR,#1245H操作数存在程序存储器中8/12/20225 3.2.2 直接寻址 Direct Addressing直接

3、使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM、位地址空间。如: MOV A,00H MOV C,60H MOV A,0F0H8/12/202263.2.3 寄存器寻址 Register Addressing对选定的工作寄存器R0R7、累加器A、通用寄存器B、地址寄存器DPTR中的数进行操作。 例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。提一个问题:我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H 和 MOV A,R0不就没什么区别了吗?8/12/20

4、227 的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。8/12/202283.2.4 寄存器间接寻址 Register Indirect Addressing把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。 R0,R1-8位地址,片内低128字节或片外DPTR-16位,片外64KB MCS-51如:MOV A,R0MOVX A,R0MOVX A,DPTR操作数

5、在片内RAM中操作数在片外RAM中操作数在片外RAM中8/12/20229以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。 常用于查表操作。 MCS-51 MOVC A, A+DPTR ;(A+DPTR) A MOVC A, A+PC; PC+1 PC,(A+PC)A3.2.5 变址寻址(基址+变址)Base-Register-plus-Index-Register-Indirect Addressing操作数在程序存储器中8/12/202210E0A程序存储区2040H 9320E0H 472041H DPH 20DPL 00ALU如:MOVC A,

6、A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码8/12/2022113.2.6 相对寻址 将PC中的当前内容与指令第二字节给出的数相加,结 果作为跳转指令的转移地址(转移目的地址)。 PC中的当前内容称为基地址(本指令后的字节地址) 指令第二字节给出的数据称为偏移量,1字节带符号数. 常用于跳转指令。 如: JC 23H 若C=0,不跳转; C=1,跳转.Relative Addressing改变PC8/12/202212程序存储区ALU如:JC 231025H1000H 401025H 451001H 23 1024H 471002H 3023H1002H指令代码当前P

7、C8/12/202213 对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。 如: SETB 3DH; 将27H.5位置1 CLR C ;Cy位清03.2.7 位寻址 Bit Addressing操作数在片内RAM位地址区或SFR某些位中8/12/202214寻址方式涉及的存储器空间寻址方式寻址空间(操作数存放空间)立即寻址程序存储器直接寻址片内RAM低128字节、SFR寄存器寻址工作寄存器R0R7,A,B,DPTR寄存器间接寻址片内RAM:R0,R1,SP片外RAM:R0 ,R1,DPTR变址寻址程序存储器:A+PC,A+DPTR相对寻址程序存储器256字节范围内:

8、PC+偏移量位寻址片内RAM的位寻址区(20H2FH字节地址)某些可位寻址的SFR8/12/2022153.3 数据传送类指令(29条) Data Transfer Instruction MCS-51 助记符: 助记符: MOV、MOVX、MOVC XCH、XCHD、SWAP PUSH、POP 源操作数寻址方式(5种): 立即寻址、直接寻址、寄存器寻址、 寄存器间接寻址、变址寻址。 目的操作数寻址方式(3种): 直接寻址、寄存器寻址、寄存器间接寻址 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。8/12/2022163.3.1 十六位数的传递指令(1条)MOV DPTR,#

9、data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。 例:MOV DPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。 如下面两条指令: MOV DPH,#35H MOV DPL,#12H。 则就相当于执行了 MOV DPTR,#3512H。8/12/2022173.3.2 累加器A与片外RAM之间的数据传递类指令(4条) MOVX A,Ri MOVX Ri,A MOVX A,DPTR MOVX DPTR,A说明: 1.

10、在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。 在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。 比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。8/12/202218 2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供

11、低8位地址。高8位地址由P2口来提供。 3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。 例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,DPTRMOV DPTR,#0200HMOVX DPTR,A8/12/2022193.3.3 读程序存储器指令(2条) MOVC A,A+DPTR MOVC A,A+PC 本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A 中的值不一定相同。例:有一个数在R0中,要求

12、用查表的方法确定它的平方值(此 数的取值范围是0-5)MOV DPTR,#100H MOV A,R0 MOVC A,A+DPTR . ORG 0100HDB 0,1,4,9,16,25如果R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。8/12/2022203.3.4 堆栈操作(2条)PUSH direct ;SPSP+1,(SP)(direct)POP direct ; (direct) (SP), SPSP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例: MOV SP,#5FH MOV

13、 A,#100 MOV B,#20 PUSH ACC PUSH B 则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。8/12/2022211.给出每条指令执行后的结果 MOV 23H,#30HMOV 12H,#34HMOV R0,#23HMOV R7,12HMOV R1,#12HMOV A,R0MOV 34H,R1MOV 45H,34HMOV DPTR,

14、#6712HMOV 12H,DPHMOV R0,DPLMOV A,R0;(23H)=30H;(12H)=34H;R0=23HXXXXXXXXXXXXXXXXXXDPHDPL45H34H23H12HR7R1R0XXXXXXXX3034XXXX23XXXXXXXX3034341223671234343034341223671234343067341212;R7=34H;R1=12H;A=30H;(34H)=34H;(45H)=34H;DPTR=6712H;(12H)=67H;R0=12H;A=67H内部RAM8/12/2022223.4 算术运算类指令(24条) Arithmetic Operat

15、ions 主要对8位无符号数;也可用于带符号数运算。 包括:加、减、乘、除、加1、减1运算指令 影响PSW有关位。 8/12/2022233.4.1 加法指令ADD A,#data ; AdataAADD A,direct ; A(direct )AADD A,Rn ; ARnAADD A,Ri ; A(Ri)A用途:将A中的值与源操作数所指内容相加,最终结果 存在A中。1.不带进位位的加法指令(4条)8/12/2022242.带进位位的加法指令(4条)ADDC A,Rn; ARnCYAADDC A,direct; A(direct )CYAADDC A,Ri; A(Ri)CYAADDC A,

16、#data; AdataCYA用途:将A中的值和其后面的值以及进位位C中的值相加, 最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0255,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到065535。8/12/202225例: 先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。 然后再做10H + 30H + CY,结果是41H

17、,所以最终的结果是4107H。1067H+30A0H0001 0000 0110 0111 0011 0000 1010 0000 0100 0001 0000 0111 1067H30A0H4107H8/12/202226设:1067H存在R1R0中, 30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOV A,R0ADD A,R2 ;R0+R2A和CYMOV R4,AMOV A,R1ADDC A,R3 ;R1+R3+CYA和CYMOV R5,A8/12/202227又例: 先做67H+20H=87H,没有超过0FFH,因此最终保存在A中的是87H,而PSW中的CY=0

18、。 然后再做10H + 30H + CY,结果是40H,所以最终的结果是4087H。1067H+3020H0001 0000 0110 0111 0011 0000 0010 0000 0100 0000 1000 0111 1067H3020H4087H8/12/202228DA A在进行BCD码加法运算时,跟在ADD和ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。例:A=0001 0101BCD(代表十进制数15) ADD A,#83. 十进制调整指令(1条); A=1DH,按二进制规律加; A=23H,按十进制规律加DA A8/12/202229 调整

19、要完成的任务是:(1)当累加器A中的低4位数出现了非BCD码(10101111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。(2)当累加器A中的高4位数出现了非BCD码(10101111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。 十进制调整指令执行后,PSW中的CY表示结果的百位值。8/12/202230例 若(A)0101 0110B,表示的BCD码为56,(R3)0110 0111B,表示的BCD码为67,(CY)0。执行以下指令:ADD A,R2DA A由于(A)0010 0011B,即,且(CY)1,即结果

20、为BCD数123。应该注意,DA指令不能对减法进行十进制调整。8/12/2022313.4.2 减法指令(8条)SUBB A,Rn ; ARnCYASUBB A,direct ; A(direct )CYASUBB A,Ri ; A(Ri)CYASUBB A,#data; AdataCYA将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。如: SUBB A,R2设: A=C9H,R2=55H,CY=1,执行指令之后,A中的值为73H。1. 带借位的减法指令(4条)8/12/202232说明:没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零

21、即可。对带符号数,要注意OV标志。OV=1,出错。8/12/2022333.5 逻辑运算类指令(24条)主要用于对2个操作数按位进行逻辑操作,结果送到A或直接寻址单元。 主要操作 与、或、异或、移位、取反、清零等。 对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。Logic Operations8/12/2022343.5.1 逻辑或指令(6条)ORL A,Rn ;ARnAORL A,direct ;A(direct)AORL A,Ri ;A(Ri)AORL A,#data;AdataAORL direct,A;(direct)A(direct)ORL dire

22、ct,#data ;(direct)data(direct)影响P标志例:71H和56H相或:01110001 (71H) ) 01010110 (56H) 01110111 即77H后两条指令,若直接地址为I/O端口,则为“读改写”操作。 OR Logic Instruction8/12/2022353.5.2 逻辑与指令 (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)da

23、ta(direct)影响P标志例:71H和56H相与:01110001 (71H) )01010110 (56H) 01010000 即50H后两条指令,若直接地址为I/O端口,则为“读改写”操作。 ANd Logic Instruction8/12/202236例:71H和56H相异或: 01110001 (71H) ) 01010110 (56H) 3.5.2 逻辑异或指令(6条)XRL A,Rn ;A RnAXRL A,direct ;A (direct)AXRL A,Ri ;A (Ri)AXRL A,#data ;A dataAXRL direct,A ;(direct) A(dire

24、ct)XRL direct,#data ;(direct) data(direct)影响P标志00100111 即27H后两条指令,若直接地址为I/O端口,则为“读改写”操作。 eXclusive-oR Logic Instruction8/12/2022373.5.3 清0与取反指令(2条)取反:CPL A ;/AA例:若A=5CH,执行CPL A 结果:A=A3H清0:CLR A ;0AComPlement Logic Operation8/12/2022383.5.4 循环移位指令(4条)RL ARR ARLC ARRC AA.7 A.0A.7 A.0A.7 A.0CYCYA.7 A.0

25、后两条指令,影响P标志和CY。 Rotate Logic instruction8/12/202239例:若A=5CH,CY=1,执行RLC A后, 对RLC、RRC指令,在CY=0时RLC相当于乘以2RRC相当于除以2结果:A=B9H,CY=0,P=10101 110011011 100108/12/2022403.6 控制转移类指令( 17条) Branching Instruction共有控制程序转移类指令(不包括位操作类的转移指令)。此类指令一般不影响PSW。包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令8/12/2022413.6.1 无条件转移类指

26、令(4条) 短转移类指令:AJMP addr11 长转移类指令:LJMP addr16 相对转移指令:SJMP rel 间接转移指令:JMP A+DPTR(1)上面的前三条指令,统统理解成:PC值改变,即跳转到一个标号处。 那么他们的区别何在呢?8/12/202242跳转的范围不同。 短转移类指令:AJMP addr11 长转移类指令:LJMP addr16 相对转移指令:SJMP rel转移范围:2KB64KB-128+127指令构成不同。 AJMP、LJMP后跟的是绝对地址, 而SJMP后跟的是相对地址。 指令长度不同 原则上,所有用SJMP或AJMP的地方都可以用 LJMP来替代。8/1

27、2/202243间接转移指令:JMP A+DPTR 这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。 转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。 本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。(2)第四条指令与前三条指令相比有所不同8/12/202244例: MOV DPTR,#TAB ;将TAB代表的地址送入DPTR JMP A+DPTR ;跳转TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段TAB+2: AJMP ROUT1 ;跳转ROUT1开始的程序段TAB+4: AJMP ROUT2 ;跳

28、转ROUT2开始的程序段TAB+6: AJMP ROUT3 ;跳转ROUT3开始的程序段 .ROUT0: .ROUT1: .ROUT2: .ROUT3:执行该段程序后,程序将根据A中的内容转移到不同的程序段去执行-散转。A=0,转ROUT0A=2,转ROUT1A=4,转ROUT2A=6,转ROUT38/12/2022453.6.2 条件转移指令(8条)条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。一、判A内容是否为0转移指令(2条) JZ rel ;如果A=0,则转移,否则顺序执行。 JNZ rel ;如果A0,就转移。转移到相对于当前PC值的8位移量的地址

29、去。即: 新的PC值=当前PC+偏移量rel我们在编写汇编语言源程序时,可以直接写成: JZ 标号 ;即转移到标号处。8/12/202246例: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前:如果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。 把上面的那个例子中的JZ改成JNZ,看看程序执行的结果是什么? 如果R0=0,结果R1=00H。如果R0 0,结果是R1中的值为0FFH。8/12/202247二、比较不等转移指令(4条)CJNE A,#data,rel C

30、JNE A,direct,relCJNE Rn,#data,relCJNE Ri,#data,rel此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样地,使用时,我们可以将rel理解成标号,即:CJNE A,#data,标号CJNE A,direct,标号CJNE Rn,#data,标号CJNE Ri,#data,标号8/12/202248利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程

31、序转移后再次利用CY就可判断出哪个数大,哪个数小了。8/12/202249举例: MOV A,R0 CJNE A,#10H,L1 MOV R1,#0 ;如R0=10H,则不转移R1=00H; AJMP L3L1:JC L2 ;如CY=1即 R010H,则转移 AJMP L3L2:MOV R1,#0FFHL3:SJMP L3因此最终结果是:本程序执行前,如果R0=10H,则R1=00H;如果R010H,则R1=0AAH;如果R010H,则R1=0FFH。8/12/202250三、减1不为0转移指令(2条)DJNZ Rn,relDJNZ direct,relDJNZ指令的执行过程是这样的:它将第一

32、个参数中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到第二个参数所指定的地方去。例: DJNZ 10H,LOOP .LOOP: .8/12/202251例: MOV 23H,#0AH CLR ALOOP: ADD A,23H DJNZ 23H,LOOP SJMP $上述程序段的执行过程是:将23H单元中的数连续相加,存至A中,每加一次, 23H单元中的数值减1,直至减到0,共加(23H)次。8/12/2022523.6.3 调用与返回指令(4条)一、调用指令(2条) LCALL addr16 ;长调用指令(3字节) ACALL addr11 ;短调用指令(2字

33、节)上面两条指令都是在主程序中调用子程序,两者的区别:对短调用指令,被调用子程序入口地址必须与调用指令的下一条指令的第一字节在相同的2KB存储区之内。使用时可以用: LCALL 标号 ;标号表示子程序首地址 ACALL 标号 来调用子程序。8/12/202253指令的执行过程是:当前PC压栈,子程序首地址送 PC,实现转移。二、返回指令 (2条)子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。RET;子程序返回指令RETI;中断子程序返回指令两者不能互换使用。8/12/2022543.6.4 空操作指令(1条) NOP空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。RET指令的执行过程是:堆栈栈顶内容(2字节,调用时保存的当前PC值)弹出给PC,实现返回。RETI指令除了具有RET指令的功能实现程序返回外,还有对中断优先级状态触发器的清零。8/12/2022553.7 位操作指令( 17条)Boolean OperationsMCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。在MCS-51 中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位00

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论