MCS-51单片机的指令系统.ppt

上传人:小飞机 文档编号:6512345 上传时间:2023-11-08 格式:PPT 页数:114 大小:1.96MB
返回 下载 相关 举报
MCS-51单片机的指令系统.ppt_第1页
第1页 / 共114页
MCS-51单片机的指令系统.ppt_第2页
第2页 / 共114页
MCS-51单片机的指令系统.ppt_第3页
第3页 / 共114页
MCS-51单片机的指令系统.ppt_第4页
第4页 / 共114页
MCS-51单片机的指令系统.ppt_第5页
第5页 / 共114页
点击查看更多>>
资源描述

《MCS-51单片机的指令系统.ppt》由会员分享,可在线阅读,更多相关《MCS-51单片机的指令系统.ppt(114页珍藏版)》请在三一办公上搜索。

1、第四章MCS-51单片机的指令系统,4.1 指令和指令程序 4.2 寻址方式 4.3 数据传送指令4.4 算术运算指令 4.5 逻辑运算及移位指令 4.6 控制转移指令 4.7 布尔变量操作指令,1,附录1:指令汇总,附录2:某些指令的说明,4.1 指令和指令程序,所有软件,都要翻译成计算机能直接识别和执行的命令,才能由计算机去执行。这种计算机能直接识别和执行的命令称为指令。一台计算机所能执行的全部指令的集合称为这台计算机的指令系统。,2,4.1 指令和指令程序,“指令”:CPU能直接识别和执行的命令。指令系统:CPU所能执行的全部指令的集合。与CPU的能力、使用的方便灵活性密切相关。指令的记

2、忆问题?指令本身是二进制代码。,3,例如以下的51单片机指令:,把10放到累加器A中,A加20,结果仍在A中,为了便于记忆,740AH 2414H,用一组有一定意义的字符来表示,指令助记符,助记符、汇编语言源程序,4,虽然书写的字符增多了,但由于可读性增强了,使用时反而感到方便。,经常采用助记符和其他一些符号来编写指令程序,这样编出的程序称为汇编语言源程序。它经过一种称为汇编程序的软件的翻译,就可变成机器可执行的目标程序了。,高级语言编程、效率问题,指令的组成及字节数,5,指令通常由两部分构成,即操作码和操作数。操作码用来规定这条指令完成什么操作,如是做加法还是做减法,是数据传送还是数据移位等

3、。操作数则表示这条指令所完成操作的对象,即是对谁来进行操作。操作数可以直接是一个数,或者一个数据所在的地址。,51单片机的指令的长度:13个字节。5大类111条。单字节:49条双字节:45条三字节:17条,在二进制的51指令中,单字节指令的操作码和操作数加起来只有1B;双字节指令的操作码和操作数各占1B;三字节指令的第1字节为操作码,第2、第3字节为操作数、操作数地址或符号。1单字节指令(49条)在51指令指令系统中,单字节指令可分为两大类:无操作数的单字节指令和含有操作数寄存器编号的单字节指令。1)无操作数单字节指令这类指令只有操作码字段,操作数隐含在操作码中。例如:INC DPTR 指令码

4、为:数据指针隐含其中,指令的组成及字节数,2)含有操作数寄存器号的单字节指令 单字节的指令码由操作码字段和指示操作数所 在寄存器号的字段组成。例如;MOV A,Rn 指令码为:其中,rrr为寄存器Rn的编号,指令的组成及字节数,2双字节指令(45条)双字节指令的操作码字节在前;在后面的操作数字节可以是立即数,也可以是操作数所在的片内RAM地址。例如:MOV A,#23H指令码为:这条8位数传送指令的含义是把指令码第2字节立即数23H取出来存放到累加器(A)中。该指令的操作码占1B;23H为源操作数,也是1B;累加器(A)是目的操作数寄存器,隐含在操作码字段中。,指令的组成及字节数,3三字节指令

5、(17条)这条指令的指令码的第1字节为操作码;第2和第3字节为操作数或操作数地址,有如下3类。1)16位数据例如:MOV DPTR,#26ABH指令码为:,指令的组成及字节数,2)8位地址和8位数据例如:MOV 74H,#0FFH指令码为:,指令的组成及字节数,3)16位地址例如:LCALL 2020H指令码为:,指令的组成及字节数,指令的组成及字节数,12,三字节指令第1个字节的操作码,后两个字节是操作数。操作数可以是数据,也可以是地址。有以下4种情况。,在程序设计中,应尽可能选用字节少的指令。这样,指令所占存储单元少,执行速度也快。,51汇编语言有42种操作码助记符,用来描述33种操作功能

6、。一种操作码可以使用一种以上的数据类型,又由于助记符规定了其访问的存储器空间,所以一种功能可能有几个助记符(如MOV、MOVX、MOVC)。功能助记符与寻址方式组合,得到111条指令。,4.2 寻址方式,4.2 寻址方式,寻址就是寻找操作数的地址。在用高级语言编程时,编程者不必关心参与运算数据(操作数)的存放问题,也不必关心这些运算是在哪里(哪个寄存器)完成的。编程者只需关心语句的使用是否正确,结果是否正确。至于变量的值存放在何处,则根本不必关心。在汇编语言编程时,数据的存放、传送、运算都要通过指令来完成,编程者必须自始至终都要十分清楚操作数的位置以及如何将它们传送至适当的寄存器中去运算。因此

7、,如何从各个存放操作数的区域去寻找和提取操作数就变得十分重要。所谓寻址方式就是如何通过确定操作数所在的位置(地址)从而把操作数提取出来的方法。,14,常用符号说明,用汇编语言编写指令时必须遵守一定的规则,下表给出了编写指令时的一些符号的约定含义。,51单片机的寻址方式,立即寻址寄存器寻址直接寻址寄存器间接寻址变址寻址(基址寄存器加偏移量寄存器)相对寻址位寻址,16,操作数的寻址方式有7种,1、立即寻址,若指令的操作数是一个8位二进制数或16位二进制数,就称为立即寻址。指令中出现的操作数就称为立即数。例如:MOV A,#3AH;A 3AH MOV DPTR,#8000H在MCS51系统中采用“#

8、”来表示后面的是立即数。,17,2、寄存器寻址,寄存器寻址就是以通用寄存器的内容作为操作数,在指令的助记符中直接以寄存器的名字来表示操作数位置。这种寻址方式如果使用了另一个操作数,那么另一操作数必须是累加器A,这些指令都是单字节指令 在MCS-51指令中,若操作数是以R0R7来表示操作数时,就属于寄存器寻址方式。例如MOV A,R0;(A)(R0)INC R0;(R0)+1R0,18,3、直接寻址,在指令中直接给出操作数地址,就属于直接寻址方式。此时,指令的操作数部分直接是操作数的地址。,19,例如:MOV A,3AH;A 68H,3、直接寻址,20,例如:MOV A,TH0 MOV A,8C

9、H,直接寻址方式只能给出8位地址,因此,这种寻址方式的寻址范围只限于片内RAM,具体说:1)低128单元,在指令中直接以单元地址形式给出。2)特殊功能寄存器,这时除可以用单元地址形式给出外,还可以寄存器符号形式给出。特殊功能寄存器的唯一寻址方式。,4、寄存器间接寻址,操作数的地址,若以寄存器的名称间接给出,则为寄存器间接寻址。采用寄存器间接寻址,可以访问内部数据RAM的128个存贮单元(007FH),全部的64kB外部数据存贮器,但不能访问特殊功能寄存器。,21,例如:MOV A,R0;A(R0)A=65H,可以用做间接寻址的寄存器:R0和R1,数据指针寄存器DPTR;用寄存器名前加“”符号来

10、表示。,寄存器间接寻址的寻址范围:1)片内RAM低128单元:这里只能用R0和R1作为间接寻址寄存器。2)片外RAM 64KB:使用DPTR作为间接寻址寄存器。3)片外RAM低256单元:也可以使用R0和R1。MOVX 4)在执行PUSH(压栈)和POP(出栈)指令时,采用堆栈指针SP作寄存器间接寻址。例:PUSH 30H;把内部RAM地址30H内的值放到堆栈区中堆栈区是由SP寄存器指定的,如果执行上面这条命令前,SP为60H,命令执行后会把内部RAM地址30H内的值放到RAM的61H内。,例:已知R0中存放片内RAM地址65H,数据指针DPTR内存放片外RAM地址8000H,地址65H和80

11、00H里面都存放着立即数30H,执行以下指令后:MOV A,R0;MOVX A,DPTR;累加器A的内容为30H。例:MOV R0,#30H;MOV A,R0 MOV A,R0 MOVX A,R0,这种寻址方式用于访问程序存储器中的数据表格,以程序计数器(PC)或数据指针(DPTR)作为基址寄存器,以累加器作为变址寄存器。基址寄存器和变址寄存器的内容相加形成16位地址,该地址即作为操作数的地址。,24,5、变址寻址,例如:MOVC A,A+PC;(A)+(PC)A MOVC A,A+DPTR;(A)+(DPTR)A,变址寻址的区域是程序存储器ROM而不是数据存储器RAM。,操作数地址=变地址+

12、基地址,6、相对寻址,相对寻址用于访问程序存储器,只出现在转移指令中,指令的操作数部分给出的是地址的相对偏移量。用“rel”表示(补码数)。相对转移指令所在的地址称为源地址,转移后的地址称为目的地址。程序的转移范围以PC当前值为中心,介于-128+127之间,25,例如SJMP rel指令的机器码是“80H,rel”,两个字节。设指令所在地址为2000H,rel为54H,则转移地址(目的地址)为:,2000H十02H十54H2056H,PC的值变为2056H,程序的执行发生了转移。,目的地址源地址十转移指令字节数十rel,rel=85H?,26,7、位寻址,采用位寻址方式的指令,其操作数将是8

13、位二进制数中的某一位。位的直接地址。MCS-51系统的内部数据RAM有两个可以按位寻址的区域:一是从内部RAM 20H2FH共16个单元中的每一位都可单独作为位操作数;二是某些特殊功能寄存器,其特征是这些特殊功能寄存器的单元地址能被8整除。位地址在指令中用bit表示。具体表示方法有:,27,(1)直接用位地址00HFFH来表示;(2)采用第几单元第几位的表示方法;25H.5(3)对特殊功能寄存器可直接用寄存器名加位数;TCON.3(4)用伪指令定义,详见第5章。,可以位寻址的特殊功能寄存器位地址表,28,对于20H一2FH单元中的各位 位地址(单元地址一20H)x 8 十 位号,例:MOV C

14、,40H,小结:,指令对哪个存储器空间进行操作是由指令的操作码和寻址方式确定的。程序存储器只能采用立即寻址和变址寻址方式,特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址,位操作指令只能对位寻址区进行操作。外部扩展的数据存储器只能用MOVX指令访问,而内部RAM的低128字节(00H7FH)既能用直接寻址,也能用寄存器间接寻址。,MCS-51指令系统,可以分为五大类,即:数据传送指令28条算术运算指令24条逻辑运算及移位指令25条控制转移指令17条位操作(布尔操作)指令17条,30,4.3 数据传送指令,一、内部RAM数据传送类二、外部RAM数据传送三、与程序ROM之间的数据传送(查

15、表指令),31,数据传送类-功能示意图,32,单片机内部数据存储器,一、内部RAM数据传送类,1、基本数据传送指令MOV2、栈操作指令PUSH、POP3、数据交换指令,33,1、基本数据传送指令MOV,34,格式 MOV 目的操作数,源操作数;目的操作数 源操作数,本质是复制,8,Ri不包括特殊功能寄存器,根据目的操作数的不同来学习和记忆。,基本数据传送指令MOV,35,1、以累加器为目的操作数,MOV A,Rn;ARnMOV A,direct;MOV A,Ri;MOV A,#data;,举例,2、以寄存器Rn为目的操作数,MOV Rn,A;Rn AMOV Rn,directMOV Rn,#d

16、ata,若(R1)=20H,(20H)=60H,分析程序执行后,累加器A的内容MOV A,R1;MOV A,20H;MOV A,Ri;MOV A,#20H;若(A)=20H,(20H)=F0H,分析程序执行后寄存器的内容:MOV R0,A;MOV R0,20H;MOV R0,#20H;,36,A20HA60HA60HA20H,(R0)=20H(R0)=F0H(R0)=20H,基本数据传送指令MOV,37,MOV Ri,AMOV Ri,directMOV Ri,#data,举例,MOV direct,AMOV direct,RnMOV direct,directMOV direct,RiMOV

17、direct,#data,3、以直接地址为目的操作数,4、以间接地址为目的操作数,例:将A的内容送至30H单元,R6的内容送至32H单元,立即数66H送至36H单元,38H单元内容送至40H单元,可用以下指令:MOV30H,A MOV32H,R6 MOV36H,#66H MOV38H,40H 例:若A的内容为20H,32H单元的内容为46H,42H单元的内容为52H,R0的内容为42H,执行以下指令后,寄存器中的内容如下:MOVR0,A MOVR0,32H MOVR0,#35H,(A)30H(R6)32H 66H(36H)(40H)(38H),(42H)=20H,(A)=20H(42H)=32

18、H,(32H)=46H(42H)=35H,基本数据传送指令MOV,39,MOV DPTR,#data16;,举例,5、唯一的16位数据 传送指令。,MOV DPTR,#1234H,MOV DPH,#12H;MOV DPL,#34H;,注意,40,上述指令不影响任何标志位,但PSW的P位除外。注意:MOV Rn,Rn MOV Ri,Ri MOV Rn,Ri MOV#data,A 等等指令是非法指令。,哇!好容易出错啊!,立即数不能为目的操作数。一条指令中不能出现两个工作寄存器。特殊功能寄存器SFR只能直接寻址。间接寻址 的寄存器为R0和R1。,2、堆栈操作指令,数据存取原则按照“先进后出,后进先

19、出”。堆栈是在内存中专门开辟出来的区域(片内RAM)。堆栈指示器SP就是用来指示堆栈位置的。在使用堆栈之前,先给SP赋值,以规定堆栈的起始位量,称为栈底。复位后,SP=07H进栈指令PUSH出栈指令POP,41,进栈操作指令PUSH,格式:PUSH direct自动进行两步操作:(1)SPSP+1(2)(SP)(direct),42,例1,首先将SP 中的值加1,然后把SP 中的值当作地址,将direct 中的值送进以SP 中的值为地址的RAM 单元中。,MOV SP,#5FH;MOV A,#100;MOV B,#20;PUSH ACC;PUSH B;,堆栈操作指令中的操作数只能用直接寻址方式

20、,所以将累加器压入堆栈时,累加器(ACC)不能简写A。,出栈操作指令POP,格式:POP direct自动进行两步操作:(1)(direct)(SP)(2)SPSP-1,43,例2、,首先将SP 中的值作为地址,并将此地址中的数送到POP 指令后面的那个direct 中,然后SP 减1。,MOV SP,#5FH;MOV A,#100;MOV B,#20;PUSH ACC;PUSH B;POP B;POP ACC;,作用?,结论:,44,1)PUSH 与 POP 操作过程刚好相反,成对出现;2)进、出栈规则:先进后出,后进先出。应注意指令书写先后顺序;3)可用于“保护现场,恢复现场”。,3、数据

21、交换指令,半字节交换,45,整字节交换,XCHD A,Ri;高四位不变,第四位互换。,SWAP A;累加器自身的高低四位互换。,将A的低4位和R0或R1指出的RAM单元低4位相互交换,各自的高4位不变。源操作数只有寄存器间接寻址方式。,二、外部RAM数据传送,46,MOVX A,Ri;读有效,输入MOVX A,DPTR;MOVX Ri,A;写有效,输出MOVX DPTR,A执行过程中会使写/WR、读/RD有效。具体分析。间接寻址,8位或16位的地址指针。只能通过累加器传送。,举例,47,例3、试编写一程序段,实现将外RAM 0FAH单元中的内容传送到外RAM 04FFH单元中。,解:MOV D

22、PTR,#04FFH MOV R0,#0FAH MOVX A,R0 MOVX DPTR,A,三、与程序ROM之间的数据传送,48,执行时会使/PSEN有效。MOVC 传送常数。以DPTR 为基地址的指令,可在ROM 的64KB范围内查表;而以PC为基地址的指令只能在(PC)+1为中心上、下256B范围内查表。只能通过累加器传送。,所谓的查表指令,MOVC A,A+PC;(PC)(PC)+1;(A)(A)+(PC)MOVC A,A+DPTR;(A)(A)+(DPTR),例:设(A)=30H,执行指令:MOVCA,A+PC;若本指令的存储地址为1000H 结果?将程序存储器中1031H单元的内容送

23、入累加器A,举例,例:设(DPTR)=8200H,(A)=30H,执行指令:MOVCA,A+DPTR结果?将程序存储器中8230H单元的内容送入累加器。,举例,举例,例、设(A)=一个BCD码常数,试用查表法获得其相应的ASCII码。,51,解法I:MOV DPTR,#TAB MOVC A,.A+DPTR TAB:DB 30H DB 31H DB 32H,33H,34H,35H,解法II:MOVC A,A+PC TAB:DB 30H,31H,32H,33H DB 34H,35H,36H,37H,4.4 算术运算指令,4.4.1 加法指令4.4.2 带进位加法指令4.4.3 加1指令4.4.4

24、带借位减法指令和减1指令4.4.5 乘、除指令4.4.6 十进制加法调整指令4.4.7 数据指针DPTR加1指令,52,4.4.1 加法指令,53,这些指令的意思就是把后面的值与A 中的值相加,结果送到A 中去,加法类指令都是以A 为核心的,其中一个数必须放在A 中,而运算结果也必须放在A 中。,4.4.2 带进位加法指令,54,这些指令的作用都是将A 中的值和其后面的值相加,并且加上进位位CY 中的值。,例如 2 个16 进制数相加:1367H+12A0H,先做67H+A0H=107H,而107H 显然超过了0FFH,因此最终保存在A 中的是7,而1 则进到了PSW 中的CY 位去了,换言之

25、,CY 位就相当于是100H,然后再做12H+13H+CY,结果是26H,所以最终的结果是2607H。,4.4.3 加1指令,55,指令说明:从结果上看INC A 和ADD A,#1 差不多,但INC A 是单字节单周期指令,而ADD A,#1 则是双字节双周期指令,而且INC A 不会影响PSW 位(P位除外),如A=0FFH,INC A 后A=00H,而CY 依然保持不变;如果是ADD A,#1,则A=00H,而CY 一定是“1”。因此加1 指令并不适合做加法,事实上它主要是用来做计数、地址增加等用途。,例:设(A)=0FFH,(R3)=0FH,(30H)=0E2H,(R0)=40H,(4

26、0H)=0AAH,执行指令:INCA INCR3 INC30H INCR0,(A)=00H(R3)=10H(30H)=0E3H(40H)=0ABH,4.4.4 带借位减法指令和减1指令,57,指令说明:没有不带借位的减法指令,如果需要做不带借位的减法指令(在做第一次相减时),只要先将CY 清零即可。CLR C,减1指令,58,指令说明:既然加1 指令可以用于计数、地址等加1,所以减1 指令的功能与加1 指令类似.,(1)DEC A;(2)DEC Rn;例如:R7=20H,DEC A;R7=19H(3)DEC direct;例如:30H=20H,DEC 30H;(30H)=19H(4)DEC R

27、i;,4.4.5 乘、除指令,乘、除指令(单字节,四周期)MUL AB;AB=B(高8 位)A(低8 位)DIV AB;ABA(商)B(余数),59,MUL乘法指令说明:两个8 位无符号数相乘,结果16位,在乘积大于FFH时,0V=“1”(溢出),否则OV=“0”,而CY 位总是为“0”。,DIV除法指令说明:通常CY 位和OV 位都是“0”,但是如果在做除法前B 中的值是00H,也就是除数为0,那么0V=1。,例:(A)=4EH,(B)=5DH;MUL AB;乘积是1C56H,如13/5,其商是2,余数是3。除了以后,商2放在A 中,余数3放在B 中。,4.4.6 十进制加法调整指令,十进制

28、加法调整指令 DA A,60,是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整。两个BCD码按二进制相加之后,必须经本指令的调整才能得到正确的结果(压缩的BCD码的和数)。,十进制加法调整指令,十进制加法调整指令 DA A,61,调整方法(加法时)高低四位各一组相加结果大于9(1001B,无效的BCD),加6修正;结果大于等于=16(进位CY或辅助进位AC),加6修正。,例如加法:87+35,MOV A,#87HADD A,#35H;A=0bcHDA A;,例如:减法87-35?,87+(100-35),计算87H+(9AH-35H)再调整,4.4.7 数据指针DPTR加

29、1指令,数据指针加1指令 INC DPTR;DPTRDPTR+1,62,注意:没有相应的减1指令。,在算术运算类指令中,除了加1 和减1 指令外,其他的算术运算类指令都要把结果放到累加器A 中,这与数据传递类指令有所不同。,4.5 逻辑运算及移位指令,4.5.1 逻辑与运算指令4.5.2 逻辑或运算指令4.5.3 逻辑异或运算指令4.5.4 累加器清零及取反指令4.4.5 循环移位指令,63,逻辑运算指令,64,主要用于对2个操作数按位进行逻辑操作,结果送到ACC或直接寻址单元。主要操作 与、或、异或、取反、清零等。对标志位的影响 除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位

30、。,4.5.1 逻辑“与”运算指令,65,某一位和0逻辑 与结果为0;和1逻辑 与结果不变。,“指定位清零”,逻辑或ORL、逻辑异或 XRL的寻址方式与此相同。,后两条指令,若直接地址为I/O端口,则为“读修改-写”操作。,例1,解:ANL P1,#0FH“位屏蔽”:从包含多个位集的一个或一组字节中选出制定的一(些)位,66,P1=35H,使其高4位输出0,低4位不变。,4.5.2 逻辑“或”运算指令,67,按位依次进行逻辑运算。某一位和1逻辑 或结果为1;和0逻辑 或结果不变。,“指定位置1”,后两条指令,若直接地址为I/O端口,则为“读修改-写”操作。,例2,将A中的低3位送入P1中,并且

31、保持P1中高5位不变。,68,ANL A,#07HANL P1,#0F8HORL P1,A;(P1)=P17P16P15P14P13A2A1A0这称为“数位组合”。,4.5.3 逻辑“异或”运算指令,69,按位依次进行逻辑运算。某一位和1逻辑异或结果为取反;和0逻辑异或结果不变。,“指定位取反”,后两条指令,若直接地址为I/O端口,则为“读修改-写”操作。,4.5.4 累加器清零及取反指令,70,指令说明:CLR A,累加器A 清零。效果同MOV A,#00H 是一样的,只不过它是单字节指令,而MOV A,#00H 是双字节指令。,指令说明:CPL A 将累加器A 逐位取反。相当于数字电路的“

32、非”逻辑,例如:A=12H,CPL A;12H 化为二进制是00010010,逻辑取反后为11101101,即A=0EDH。,4.4.5 循环移位指令,71,全部是累加器A循环移位,移位后信息没有丢失。,移位位数:1 位。,C,循环移位指令,72,A.0,A.7,A.0,A.7,A.0,A.7,A.0,A.7,CY,CY,C,16位数的算术左移,16位数在内存中存放在M1和M1+1单元,低8位先存。,CLR CMOV R1,#M1MOV A,R1RLC AMOV R1,AINC R1MOV A,R1RLC AMOV R1,A,73,16位循环移位的实现方法?,;进位Cy=0;操作数地址送R1;

33、低8位送A;低8位左移,最低位添0,Cy A7;送回;指向高8位;高8位送A;A7移入,高8位左移;送回,4.6 控制转移指令,控制转移类指令共有17 条转移指令分为三大类 无条件转移指令、条件转移指令调用及返回指令空操作指令NOP,74,作用:改变程序计数器PC的值,从而改变程序执行方向,转向指令设定的目标地址。,4.6.1无条件转移指令,75,(绝对)长转移指令LJMP addr16;PC addr16绝对转移指令AJMP addr11;PC100 addr11(相对)短转移指令SJMP rel;PC 源地址+2+rel变址方式的转移指令JMP A+DPTR;,前三个:在助记符中可用标号(

34、符号地址)来表示。例如,目标地址L2与下一条指令的地址L0在同一个2K 空间,L1为64K的全部空间。,(相对)短转移指令、散转指令,76,(绝对)长转移指令LJMP addr16;PC addr16绝对转移指令AJMP addr11;PC100 addr11(相对)短转移指令SJMP rel;PC 源地址+2+rel变址方式的转移指令JMP A+DPTR;,Rel为8位有符号数。(-128+127)Rel=L3-L0,汇编时会自动计算rel。,前三个:在助记符中可用目标地址(标号)来表示。例如,JMP A+DPTR;间接转移,所谓的“散转指令”,常用于多分支程序结构中,可在程序运行过程中动态

35、地决定程序分支走向。,4.6.2 条件转移指令,77,基本规则:条件成立时则转移到目标地址,条件不成立时顺序执行下一条指令。,属于相对寻址。,条件转移指令在执行过程中需要判断某种条件是否满足,从而决定要不要转移。,转移目的地址在以下一条指令地址为中心的256B范围内(-128+127)。,条件转移指令的条件,78,实现按照一定条件决定转移的方向,分三类:累加器A判零条件转移指令比较条件转移指令循环转移指令(减1条件转移指令),基本规则:条件成立则转移到目标地址,条件不成立顺序执行下一条指令。,条件转移的条件可以是上一条指令或者更前一条指令的执行结果(常体现在标志位上),也可以是条件转移指令本身

36、包含的某种运算结果。,(1)累加器A判0条件转移指令,79,执行指令时,如条件满足,则转移;不满足,则顺序执行下一指令。转移目的地址在以下一条指令首地址为中心的256B范围内(-128+127)。JZ rel;如果A=0,则转移,否则顺序执行。JNZ rel;如果A0,就转移,否则顺序执行。汇编语言书写指令时,rel可采用目标地址的标号。例如:JZ 标号;,(2)比较条件转移指令,比较不相等转移指令,80,CJNEA,#data,relCJNE Rn,#data,relCJNE Ri,#data,relCJNEA,direct,rel,比较前两个操作数大小,如果值不相等则转移,并转向目的地址;

37、否则顺序执行。如果第一操作数(无符号整数)小于第二操作数(无符号整数),则进位标志位Cy置1,否则Cy清0。该指令的执行不影响任何一个操作数的内容。,汇编语言书写指令时,rel可采用目标地址的标号。,只有:比较不相等转移指令,81,利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。,数据大小的比较,82,利用这些指令,可以判断两数是否相等。还可以进一步比较两个数哪个大,哪

38、个小。,(3)循环转移指令(减1不为0转移指令),把减1与条件转移两种功能合在一起。两条:,83,DJNZ Rn,relDJNZ direct,rel,执行过程是这样的:它将Rn或 direct中的值减1,然后看这个值是否等于0,如果等于0,就往下执行,如果不等于0,就转移到所指定的地方去。,汇编语言书写指令时,rel可采用目标地址的标号。,主要作用:用于控制程序循环。预先装入循环次数,以减1后是否为“0”作为转移条件,即实现按次数控制循环。,循环转移指令举例,84,DJNZ Rn,标号;,MOV R0,#30H CLR A MOV R7,#10LOOP:MOV R0,AINC R0 DJNZ

39、 R7,LOOP SJMP$,例:将片内数存30H39H单元清零。?,LOOP的范围超限?,MOV R7,#10LOOP:-DJNZ R7,LPSJMP Next LP:LJ LOOPNext:SJMP$,4.6.3 调用及返回指令,85,(1)长调用指令 LCALL addr16(2)绝对调用指令 ACALL addr11,上面两条指令都是在主程序中调用子程序。LCALL可调用64KB范围内程序存储器中的任何一个子程序。ACALL,被调用子程序入口地址必须与调用指令的下一条指令的地址在相同的2KB存储区之内,为兼容MCS48的CALL指令而设。使用时可以用:LCALL 标号;标号表示子程序首

40、地址 ACALL 标号 来调用子程序。,2个调用,2个返回指令。先看子程序调用指令。,子程序调用指令,86,(1)长调用指令 LCALL addr16(2)绝对调用指令 ACALL addr11,指令的执行过程是:1、断点入栈,即当前PC压栈,(先低,后高);2、子程序首地址送 PC,实现转移。,返回指令,87,子程序执行完后必须回到主程序,如何返回呢?只要执行一条返回指令就可以了。RET;子程序返回指令RETI;中断子程序返回指令两者不能互换使用。,返回指令,88,RET指令的执行过程是:断点出栈,堆栈栈顶内容(2字节,调用时保存的PC值)弹出给PC,实现返回。RETI指令除了具有RET指令

41、的功能实现程序返回外,还有对中断优先级状态触发器的清零。,子程序的嵌套与断点地址存放,89,4.6.4 空操作指令,90,NOP空操作,就是什么事也不干,单字节,花费1个机器周期,一般用作短时间的延时,程序的调试等。,4.7 布尔变量操作指令,位操作指令(17条),91,MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。在MCS-51 中,有一部份RAM和一部份SFR是具有位寻址功能的。位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位007FH);可以位寻址的特殊功能寄存器

42、:,位地址,92,可以位寻址的特殊功能寄存器:,这些SFR的特点是其字节地址均可被8整除,如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0-P3(I/O端口锁存器)。在进行位处理时,CY用作“位累加器”,位地址表达方式,93,以PSW中位4(RS1)为例。直接(位)地址方式:如 D4H;点操作符号方式:如 PSW.4,D0H.4;位名称方式:如 RS1;用户定义名方式:如用伪指令 bitSUB.REG bit RS1定义后,可用SUB.REG代替RS1。,bit 功能:指令用于将一个

43、位地址赋给指定的符号名。指令格式:符号名 bit 位地址,1位传送指令,94,MOV C,bit;bit CMOV bit,C;C bit这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。例:MOV C,P1.0;将P1.0的状态送给C。MOV P1.0,C;将C中的状态送到P1.0;引脚上去。,2位清0和置1指令,95,位清0指令 CLR C;使CY=0 CLR bit;使指令的位地址等于0。例:CLR P1.0;即使P1.0变为0 位置1指令 SETB C;使CY=1 SETB bit;使指定的位地址等于1。例:SETB P1.0;使P.0变为1,3位逻辑运算指令(6条),9

44、6,位“与”指令 ANL C,bit;Cy与bit位的值相与,结果送CyANL C,/bit;先将bit位的值取出后取反,再和Cy相与,结果送回Cy。但注意:指定的位地址中的值本身并不发生变化。例:ANL C,/P1.0,3位逻辑运算指令(6条),97,位“或”指令 ORL C,bitORL C,/bit,位“取反”指令 CPL C;使Cy值取反。CPL bit;使指定的位的值取反。例:CPL P1.0,注意:没有位的异或指令。,4位控制转移指令,98,JC rel;如进位标志位Cy=1,则转移;JNC rel;如进位标志位Cy=0,则转移;JB bit,rel;如果直接寻址bit位=1,则转

45、移;JNB bit,rel;如果bit=0,则转移;JBC bit,rel;如果bit=1,转移,并把寻址位bit;清0,否则就顺序执行。转移范围:-128+127,汇编语言书写指令时,rel可采用目标地址的标号。,有条件的的转移,可分两类:,16位数的一次循环移位,16位数在内存中存放在M1和M1+1单元,低8位先存。,MOV A,M1+1;高8位送AMOV C,ACC.7;最高位送进位CyMOV R1,#M1;操作数地址送R1MOV A,R1;低8位送ARLC A;低8位左移,最低位添0,Cy AMOV R1,A;送回INC R1;指向高8位MOV A,R1;高8位送ARLC A;A7移入

46、,高8位左移MOV R1,A;送回,99,16位循环移位的实现方法?,附录1:指令汇总,100,列出了按功能排列的全部的指令助记符及功能简要说明,以及指令长度、执行时间和指令代码(机器代码)。,101,102,103,104,105,106,107,附录2:某些指令的说明,108,某些指令的说明111条指令介绍完毕。一些细节问题,还需要说明。1.关于并行I/O口的“读引脚”和“读锁存器”指令的区别例如,当P1口的P1.0引脚外接一个发光二极管LED的阳极,LED的阴极接地。若想查看一下单片机刚才向P1.0脚输出的信息是0还是1,不能直接从P1.0脚读取,因为单片机刚才向P1.0输出的信息如果是

47、1的话,则LED导通点亮,此时P1.0引脚就为0电平,如果直接读引脚,结果显然错误。,109,正确的做法是读D锁存器的Q端状态,那里储存的才是前一时刻送给P1.0的真实值。就是说,凡遇“读取P1口前一状态以便修改后再送出”的情形,都应当“读锁存器”的Q端信息,而不是读取引脚的信息。当P1口外接输入设备时,要想P1口引脚上反映的是真实的输入信号,必须要设法先让该引脚内部的场效应管截止才行,否则当场效应管导通时,P1口引脚上将永远为低电平,无法正确反映外设的输入信号。让场效应管截止,就是用指令给P1口的相应位送一个“”电平,这就是为什么读引脚之前,一定要先送出的原因。,110,指令“MOVC,P1

48、.0”读的是P1.0脚,同样,指令“MOV A,P1”也是读引脚指令,读引脚指令之前一定要有向P1.0写“1”的指令。而指令“CPL P1.0”则是“读锁存器”,也即“读修改写”指令,它会先读P1.0的锁存器的Q端状态,接着取反,然后再送到P1.0引脚上。而指令“ANL P1,A”也是“读锁存器”命令。类似的“读修改写”指令举例如下:INCP1XRLP3,AORLP2,AANLP1,ACPLP3.0,111,2.关于操作数的字节地址和位地址的区分问题如何区别指令中出现的字节变量和位变量?例如指令“MOV C,40H”和指令“MOV A,40H”两条指令中源操作数“40H”都是以直接地址形式给出

49、的,“40H”是字节地址还是位地址?对于助记符相同指令,观察操作数就可看出。显然前条指令中的“40H”肯定是位地址,因为目的操作数C是位变量。后条指令的“40H”是字节地址,因为目的操作数A是字节变量。,112,3.关于累加器A与Acc的书写问题 累加器可写成A或Acc,区别是什么?Acc汇编后的机器码必有一个字节的操作数是累加器的字节地址E0H,A汇编后则隐含在指令操作码中。例如:“INC A”的机器码,查表3-2是04H。如写成“INC Acc”后,则成了“INC direct”的格式,再查表3-2,对应机器码为“05H E0H”。在对累加器A直接寻址和累加器A的某一位寻址要用Acc,不能

50、写成A。,113,例如,指令“POP Acc”不能写成“POP A”;指令“SETB Acc.0”,不能写成“SETB A.0”。4.书写2位十六进制数据前要加“0”经常遇到必须在某些数据或地址的前面多填一个“前导”0,否则汇编就通不过?这是汇编语言的严格性和规范性的体现。由于部分十六进制数是用字母来表示的,而程序内的标号也常用字母表示,为了将标号和数据区分开,几乎所有的汇编语言都规定,凡是以字母开头(对十六进制数而言,就是AF开头)的数字量,应当在前面添加一个数字0。,114,至于地址量,它也是数据量的一种,前面也应该添加“0”。例如:MOVA,0F0H;“F0”以字母开头的数据量MOVA,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号