第1页:汇编语言与汇编程序
二.汇编语言和汇编程序指令的寻址方式1常用指令2伪指令3指令的时序4
第2页:常用符号
- 常用符号Rn
- 工作寄存器中的寄存器R0、R1…R7之一;Ri:工作寄存器中的寄存器R0或R1;#data:8位立即数;#data16:16位立即数;direct:片内RAM或SFR的地址(8位);@:寄存器间接寻址;Bit:片内RAM或SFR的位地址;addr11:11位目的地址;addr16:16位目的地址;rel:8位地址偏移量,偏移范围为-128~127;/:该位求反后参与操作,不影响该位;(X):地址单元中的内容→:箭头左边的内容送入箭头右边的单元内
第3页:符号指令的构成
- 符号指令的构成
- 操作助记符[目的操作数] [源操作数]
- 操作助记符,也称指令助记符。它以符合形式给出该指令进行什么操作。如:数据传送MOV,加ADD,逻辑与ANL。
- 操作数可以是操作数本身,可以是寄存器,也可以是操作数的地址。
- 有0,1,2个操作数多种情况
- 一条带操作数的指令要指明用什么方式寻找操作数,寻找操作数的方式称为寻址方式。
第4页:2.1 指令的寻址方式
2.1指令的寻址方式立即寻址直接寻址寄存器寻址寄存器间接寻址变址寻址相对寻址位寻址
第5页:2.1.1 立即寻址
2.1.1立即寻址指令中直接给出操作数的寻址方式,在操作码之后,称为立即数,用"#"表示。如:MOV A, #80HMOV R7, #0F5HMOV DPTR,#1245H操作数存在程序存储器中
第6页:2.1.2 直接寻址
2.1.2直接寻址直接使用数所在单元的地址找到了操作数,所以称这种方法为直接寻址。操作数在SFR、内部RAM(即操作数据在内部数据存储器或特殊功能寄存器中)空间。如:MOV A,00HMOV A,0F0HMOV PSW,#08H
第7页:2.1.3 寄存器寻址
2.1.3寄存器寻址对选定的工作寄存器R0~R7、累加器A、通用寄存器B、进位位C、地址寄存器DPTR中的数进行操作。例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。
第8页:2.1.3 寄存器寻址(问题)
- 2.1.3寄存器寻址问题
- 我们知道,工作寄存器就是内存单元的一部分,如果我们选择工作寄存器组0,则R0就是RAM的00H单元,那么这样一来,MOV A,00H和MOV A,R0不就没什么区别了吗?的确,这两条指令执行的结果是完全相同的,都是将00H单元中的内容送到A中去,但是执行的过程不同,执行第一条指令需要2个机器周期,而第二条则只需要1个机器周期,第一条指令变成最终的目标码要两个字节(E5H 00H),而第二条则只要一个字节(E8H)就可以了。
第9页:2.1.4 寄存器间接寻址
- 2.1.4寄存器间接寻址把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。
- R0,R1---8位地址,片内RAM或片外
- DPTR---16位,片外64KB如:MOV A,@R0MOVX A,@R0MOVX A,@DPTR操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中
第10页:2.1.5 变址寻址
2.1.5变址寻址以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两者内容相加,结果作为操作数的地址。常用于查表操作。MOVCA,@A+DPTR;(A+DPTR)→AMOVCA,@A+PC;PC+1→PC,(A+PC)→A
第11页:2.1.6 相对寻址
2.1.6相对寻址将PC中的当前内容与指令第二字节给出的数相加,结果作为跳转指令的转移地址(转移目的地址)。PC中的当前内容称为基地址(本指令后的字节地址)指令第二字节给出的数据称为偏移量,1字节带符号数。常用于跳转指令。如:JCREL若C=0,不跳转;C=1,跳转.
第12页:2.1.6 相对寻址
2.1.6相对寻址4023304745 10001001100210251026如:指令JC REL设REL=23H指令代码程序存储器当前PC
第13页:2.1.7 位寻址
2.1.7位寻址对片内RAM的位寻址区和某些可位寻址的特殊功能寄存器进行位操作时的寻址方式。如:SETB3DH;将27H.5位置1CLRC;Cy位清0
第14页:寻址方式与寻址空间对照表
2.1寻址方式与寻址空间(操作数存放空间)| 寻址方式 | 寻址空间(操作数存放空间) |
|---|
| 立即寻址 | 程序存储器 |
|---|
| 直接寻址 | 片内RAM、SFR |
|---|
| 寄存器寻址 | 工作寄存器R0~R7、A、B、DPTR、C |
|---|
| 寄存器间接寻址 | 片内RAM:@R0、@R1、SP;片外RAM:@R0、@R1、@DPTR |
|---|
| 变址寻址 | 程序存储器:@A+PC、@A+DPTR |
|---|
| 相对寻址 | 程序存储器256字节范围内:PC+偏移量 |
|---|
| 位寻址 | 片内RAM的位寻址区(20H~2FH字节地址)、某些可位寻址的SFR |
|---|
第15页:汇编语言与汇编程序
二.汇编语言和汇编程序指令的寻址方式1常用指令2伪指令3指令的时序4
第16页:2.2 常用指令
2.2常用指令数据传输与交换类指令算数运算类指令逻辑运算与移位类指令位操作类指令控制转移类指令
第17页:2.2.1 数据传送类指令
- 2.2.1数据传送与交换类指令助记符
- MOV、MOVX、MOVCXCH、XCHD、SWAPPUSH、POP源操作数寻址方式(5种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址。目的操作数寻址方式(3种):直接寻址、寄存器寻址、寄存器间接寻址除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响标志位。
第18页:2.2.1 数据传送类指令(十六位数)
- 2.2.1数据传送与交换类指令
- 十六位数的传递指令(1条)MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令。功能:将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。
第19页:2.2.1 数据传送类指令
2.2.1数据传送与交换类指令例: MOVDPTR,#1234H执行完了之后DPH中的值为12H,DPL中的值为34H。如果我们分别向DPH,DPL送数,则结果也一样。如下面两条指令: MOVDPH,#12HMOVDPL,#34H。则就相当于执行了 MOVDPTR,#1234H。
第20页:2.2.1 数据传送类指令(八位数)
- 2.2.1数据传送与交换类指令
- 八位数的传递指令(15条)MOVA,#dataMOVA,directMOVRn,#dataMOVRn,AMOVdirect,#dataMOVA,RnMOV@Ri,#dataMOV@Ri,AMOVdirect,directMOVA,@RiMOVdirect,RnMOVdirect,@RiMOVRn,directMOV@Ri,directMOVdirect,A
第21页:2.2.1 数据传送类指令
- 2.2.1数据传送与交换类指令
- 累加器A与片外RAM之间的数据传递类指令(4条)MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A说明:1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行。比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。
第22页:2.2.1 数据传送类指令(片外RAM)
2.2.1数据传送与交换类指令2.要读或写外部的RAM,当然也必须要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口来提供。3.使用时应先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。MOV DPTR,#0100HMOVX A,@DPTRMOV DPTR,#0200HMOVX @DPTR,A
第23页:2.2.1 数据传送类指令
- 2.2.1数据传送与交换类指令
- 读程序存储器指令(2条)MOVCA,@A+DPTRMOVCA,@A+PC本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格说明:查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。
第24页:2.2.1 数据传送类指令(查表求平方)
- 2.2.1数据传送与交换类指令例
- 有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5)MOV DPTR,#100HMOV A,R0MOVC A,@A+DPTR. …ORG 0100HDB 0,1,4,9,16,25
第25页:2.2.1 数据传送类指令
- 2.2.1数据传送与交换类指令
- 堆栈操作(2条)PUSHdirect;SP
- SP+1,(SP)
- (direct)POPdirect;(direct)
- (SP), SP
- SP-1第一条为压入指令,就是将direct中的内容送入堆栈中,第二条为弹出指令,就是将堆栈中的内容送回到direct中。例:MOVSP,#5FHMOVA,#100MOVB,#20PUSHACCPUSHB
第26页:2.2.1 数据传送类指令(数据交换)
- 2.2.1数据传送与交换类指令
- 数据交换指令(5条)1.字节交换指令XCHXCHA,RnXCHA,directXCHA,@Ri2.半字节交换指令XCHXCHDA, @RiSWAPA
第27页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令助记符
- ADD、ADDC、INCSUBB、DEC、DA源操作数寻址方式(4种):立即寻址、直接寻址、寄存器寻址、寄存器间接寻址。目的操作数寻址方式(1种):寄存器(A)寻址影响PSW有关标志位。
第28页:2.2.2 算数运算类指令(加法类)
- 2.2.2算数运算类指令
- 加法类指令1.不带进位位的加法指令ADD2.带进位位的加法指令ADDC3.增量指令INC
第29页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令
- 不带进位位的加法指令ADDADDA,#data;A+data→AADDA,direct; A+(direct )→AADDA,Rn; A+Rn→AADDA,@Ri; A+(Ri)→A用途:将A中的值与源操作数所指内容相加,最终结果存在A中。
第30页:2.2.2 算数运算类指令(带进位位)
- 2.2.2算数运算类指令
- 带进位位的加法指令ADDCADDCA,Rn;A+Rn+CY→AADDCA,direct;A+(direct )+CY→AADDCA,@Ri;A+(Ri)+CY→AADDCA,#data;A+data+CY→A用途:将A中的值和其后面的值以及进位位C中的值相加,最终结果存在A,常用于多字节数运算中。说明:由于51单片机是一种8位机,所以只能做8位的数学运算,但8位运算的范围只有0~FFH,这在实际工作中是不够的,因此就要进行扩展,一般是将2个8位(两字节)的数学运算合起来,成为一个16位的运算,这样,可以表达的数的范围就可以达到0~FFFFH。
第31页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令例如
- 计算:1067H+30A0H1067H 0001 0000 0110 011130A0H0011 0000 1010 00004107H 0100 00010000 0111先做67H+A0H=107H,而107H显然超过了0FFH,因此最终保存在A中的是07H,而1则到了PSW中的CY位了。换言之,CY就相当于是100H。然后再做10H + 30H +CY,结果是41H,所以最终的结果是4107H。
本页含表格或算式图示,原文数字粘连严重,未能安全切分为表格,请对照原课件图片补充
第32页:2.2.2 算数运算类指令(代码)
- 2.2.2算数运算类指令代码
- 设:1067H存在R1R0中,30A0H存在R3R2中,计算R1R0+R3R2,结果存在R5R4中。MOVA, R0ADDA, R2 ;R0+R2→A和CYMOVR4, AMOVA, R1ADDCA, R3 ;R1+R3+CY→A和CYMOVR5, A
第33页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令例如
- 计算:1067H+3020H1067H 0001 0000 0110 01113020H0011 0000 0010 00004087H 0100 00001000 0111先做67H+20H=87H,而87H没有超过0FFH,因此最终保存在A中的是87H,PSW中的CY=0。然后再做10H + 30H +CY,结果是40H,所以最终的结果是4087H。
本页含表格或算式图示,原文数字粘连严重,未能安全切分为表格,请对照原课件图片补充
第34页:2.2.2 算数运算类指令(增量)
- 2.2.2算数运算类指令
- 增量指令INCINCA;A+1→AINCRn;Rn+1→RnINCdirect;direct+1→directINC@Ri;(Ri)+1→(Ri)INCDPTR;DPTR+1→DPTR用途:将操作数加1后再送回操作数。说明:除了操作数为A的指令影响奇偶标志P外,一般不影响标志位。
第35页:2.2.2 算数运算类指令
2.2.2算数运算类指令减法类指令1.带借位的减法指令SUBB2.减量指令DEC
第36页:2.2.2 算数运算类指令(带借位)
- 2.2.2算数运算类指令
- 带借位的减法指令SUBBSUBBA,Rn;A-Rn-CY→ASUBBA,direct;A-(direct)-CY→ASUBBA,@Ri;A-(Ri)-CY→ASUBBA,#data;A-data-CY→A用途:将A中的值减去源操作数所指内容以及进位位C中的值,最终结果存在A中。说明:1.没有不带借位的减法指令,如果需要做不带位的减法指令(在做第一次相减时),只要将CY清零即可。2.对带符号数,要注意OV标志。OV=1,溢出。
第37页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令
- 减量指令DECDECA;A-1→ADECRn;Rn-1→RnDECdirect;direct-1→directDEC@Ri;(Ri)-1→(Ri)用途:将操作数减1后再送回操作数。说明:1.除了操作数为A的指令影响奇偶标志P外,一般不影响标志位。2. DPTR不能作为减量指令的操作数
第38页:2.2.2 算数运算类指令(十进制调整)
2.2.2算数运算类指令十进制调整指令DA在进行BCD码加法运算时,跟在 ADD和 ADDC指令之后,用于对累加器A中刚进行的两个BCD码的加法的结果进行十进制调整。例:A=0001 0101BCD(代表十进制数15) ADD A,#8; A=1DH,按二进制规律加DA A; A=23BCD,按十进制规律加
第39页:2.2.2 算数运算类指令
- 2.2.2算数运算类指令
- BCD数(十进制)加法调整指令DA A调整要完成的任务是:
- 当累加器A中的低4位数出现了非BCD码(1010~1111)或低4位产生进位(AC=1),则应在低4位加6调整,以产生低4位正确的BCD结果。
- 当累加器A中的高4位数出现了非BCD码(1010~1111)或高4位产生进位(CY=1),则应在高4位加6调整,以产生高4位正确的BCD结果。
- 十进制调整指令执行后,PSW中的CY表示结果的百位值。注意:
- 调整指令应紧跟在BCD数作为加数的加法指令之后。所谓“紧跟”是指在调整指令与加法指令之间不得有改变CY和AC标志位的指令。
第40页:2.2.2 算数运算(BCD加法调整)
- 2.2.2算数运算类指令例如
- 若(A)=0101 0110B,表示的BCD码为56,(R3)=0110 0111B,表示的BCD码为67,(CY)=0。执行以下指令:ADDA,R3DAA由于(A)=0010 0011B,且(CY)=1,即结果为BCD数123。注意:DA指令不能对减法进行十进制调整。A0101 0110R30110 01111011 1101调整0110 0110结果10010 0011
本页含表格或算式图示,原文数字粘连严重,未能安全切分为表格,请对照原课件图片补充
第41页:2.2.3 逻辑运算类指令
- 2.2.3逻辑运算及移位类指令助记符
- ANL、ORL、XRL、CPLRR、RL、RRC、RLC主要用于对2个操作数按位进行逻辑操作或对A进行循环移位操作,将结果送到A或直接寻址单元。☼主要操作与、或、异或、移位、取反、清零等。☼对标志位的影响除了目的操作数为A的指令影响奇偶标志P,CY外,一般不影响标志位。
第42页:2.2.3 逻辑运算类指令(逻辑运算)
- 2.2.3逻辑运算及移位类指令
- 逻辑运算类指令1.逻辑或运算指令2.逻辑与运算指令3.逻辑异或运算指令4.取反指令
第43页:2.2.3 逻辑运算类指令(ORL)
- 2.2.3逻辑运算及移位类指令
- 逻辑或指令ORLA,Rn;A∨Rn→AORLA,direct;A∨(direct)→AORLA,@Ri;A∨(Ri)→AORLA,#data;A∨data→AORLdirect,A;(direct)∨A→(direct)ORLdirect,#data;(direct)∨data→(direct)用途:除了操作数为A的指令影响奇偶标志P外,一般不影响标志位。说明:后两条指令,若直接地址为I/O端口,则为“读-改-写”操作。
第44页:2.2.3 逻辑运算类指令(ANL)
- 2.2.3逻辑运算及移位类指令
- 逻辑与指令ANLA,Rn;A∧Rn→AANLA,direct;A∧(direct)→AANLA,@Ri;A∧(Ri)→AANLA,#data;A∧data→AANLdirect,A;(direct)∧A→(direct)ANLdirect,#data;(direct)∧data→(direct)用途:除了操作数为A的指令影响奇偶标志P外,一般不影响标志位。说明:后两条指令,若直接地址为I/O端口,则为“读-改-写”操作。
第45页:2.2.3 逻辑运算类指令(XRL)
- 2.2.3逻辑运算及移位类指令
- 逻辑异或指令XRLA,Rn;A⊕Rn→AXRLA,direct;A⊕(direct)→AXRLA,@Ri;A⊕(Ri)→AXRLA,#data;A⊕data→AXRLdirect,A;(direct)⊕A→(direct)XRLdirect,#data;(direct)⊕data→(direct)用途:除了操作数为A的指令影响奇偶标志P外,一般不影响标志位。说明:后两条指令,若直接地址为I/O端口,则为“读-改-写”操作。
第46页:2.2.3 逻辑运算类指令(清零取反)
- 2.2.3逻辑运算及移位类指令
- 清零与取反指令CPLA;A→ACLRA;0→A说明:清零指令影响奇偶标志P,取反指令不影响任何标志位。
第47页:2.2.3 循环移位指令
- 2.2.3逻辑运算及移位类指令
- 循环移位类指令1.循环右移指令RR2.循环左移指令RL3.带进位循环右移指令RRC4.带进位循环左移指令RLC
第48页:2.2.3 循环移位示意图
CY2.2.3逻辑运算及移位类指令A.7A.6A.5A.4A.3A.2A.1A.0A.7A.6A.5A.4A.3A.2A.1A.0A.7A.6A.5A.4A.3A.2A.1A.0A.7A.6A.5A.4A.3A.2A.1A.0CYRR ARL ARRC ARLC A说明:后两条指令,影响P标志和CY。
第49页:2.2.3 逻辑运算类指令(RLC示例)
2.2.3逻辑运算及移位类指令例如:若A=5CH,CY=1,执行 RLC A后,结果:A=B9H,CY=0,P=1对 RLC、 RRC指令,在CY=0时 RLC相当于乘以2 RRC相当于除以2010111001
第50页:2.2.3 逻辑运算类指令(移位乘除)
2.2.3逻辑运算及移位类指令例如:利用移位实现乘2、除2运算例:将R7中的无符号数乘以2送入R6和R7的程序段如下: ADDA,#0 ;清CYMOVR6,#0 ;清R6MOVA,R7 ; R7乘以2RLCA; MOVR7,AMOVA,R6 ; R6乘以2RLCA ;注意:带“进位”操作实现了乘以2的溢出情况 MOVR6,A ;
第51页:2.2.4 位操作指令
- 2.2.4位操作指令
- MCS-51单片机的硬件结构中,有一个位处理器(又称布尔处理器),它有一套位变量处理的指令集,包括位变量传送、逻辑运算、控制程序转移等。
- 在MCS-51中,有一部份RAM和一部份SFR是具有位寻址功能的。☼位操作区:内部RAM的20H-2FH这16个字节单元,即128个位单元(位地址空间位00~7FH);☼可以位寻址的特殊功能寄存器:8031中有一些SFR是可以进行位寻址的,这些SFR的特点是其字节地址均可被8整除,如A累加器,B寄存器、PSW、IP(中断优先级控制寄存器)、IE(中断允许控制寄存器)、SCON(串行口控制寄存器)、TCON(定时器/计数器控制寄存器)、P0-P3(I/O端口锁存器)。☼在进行位处理时,CY用作“位累加器”。
第52页:2.2.4 位操作指令
- 2.2.4位操作指令位地址表达方式
- 以PSW中位4(RS1)为例。
- 直接(位)地址方式:如D4H;
- 点操作符号方式:如PSW.4,D0H.4;
- 位名称方式:如RS1;
- 用户定义名方式:如用伪指令bit。例如:SUB.REGbitRS1定义后,可用SUB.REG代替RS1
第53页:2.2.4 位操作指令(位传送)
2.2.4位操作指令位操作指令位传送指令位清0和置位位逻辑运算指令
第54页:2.2.4 位操作指令
2.2.4位操作指令位传送指令 MOVC,bit;bit→CMOVbit,C;C→bit用途:这组指令的功能是实现位累加器(CY)和其它位地址之间的数据传递。例: MOV C,P1.0;将P1.0的状态送给C。 MOV P1.0,C;将C中的状态送到P1.0;引脚上去。
第55页:2.2.4 位操作指令(位清0与置位)
2.2.4位操作指令位清0和置位 CLRC;使CY=0CLRbit;使指令的位地址等于0。 SETBC;使CY=1SETBbit;使指定的位地址等于1。用途:这组指令的功能是实现位累加器(CY)和其它位地址置位或者复位操作。例: CLR P1.0;使P1.0变为0SETB P1.0;使P.0变为1
第56页:2.2.4 位操作指令
2.2.4位操作指令位逻辑运算指令 ANLC,bit;CY与指定位的值相与,结果送CYANLC,/bit;先将位地址bit中的值取出后取反,再和;CY相与,结果送回CY。 ORLC,bit;CY与指定位的值相与,结果送CYORLC,/bit;先将位地址bit中的值取出后取反,再和;CY相与,结果送回CY。 CPLC;使CY值取反。CPLbit;使位地址bit中的值取反。用途:这组指令的功能是实现位地址数据位逻辑运算。
第57页:2.2.5 控制转移指令
2.2.5控制转移指令MCS-51提供了较丰富的控制转移指令,因此在编程上相当灵活方便。包括以下类型:无条件转移和条件转移相对转移和绝对转移长转移和短转移调用与返回指令助记符: AJMP、 LJMP、 SJMP、 JMP、 ACALL、 LCALL、 JZ、 JNZ、 CJNE、 DJNZ
第58页:2.2.5 控制转移指令(短转移类)
- 2.2.5控制转移指令1.无条件转移类指令
- 短转移类指令:AJMPaddr11
- 长转移类指令:LJMPaddr16
- 相对转移指令:SJMPrel
- 间接转移指令:JMP@A+DPTR无条件转移是指不规定条件的程序转移。
第59页:2.2.5 控制转移指令
2.2.5控制转移指令1.无条件转移类指令(1)前三条指令,区别何在?①跳转的范围不同短转移类指令:AJMPaddr11长转移类指令:LJMPaddr16相对转移指令:SJMPrel转移范围:2KB64KB-128~+127②指令的构成不同 AJMP、 LJMP后跟的是绝对地址,而 SJMP后跟的是相对地址。③指令长度不同④原则上,所有用 SJMP或 AJMP的地方都可以用 LJMP来替代
第60页:2.2.5 控制转移指令(无条件转移类)
2.2.5控制转移指令1.无条件转移类指令(2)第四条指令与前三条指令相比,有何不同?这条指令的用途也是跳转,转到什么地方去呢?这可不能由标号简单地决定了。转移地址由A+DPTR形成,并直接送入PC。指令对A、DPTR和标志位均无影响。本指令可代替众多的判别跳转指令,又称为散转指令,多用于多分支程序结构中。
第61页:2.2.5 控制转移指令
2.2.5控制转移指令例: MOV DPTR,#TAB;将TAB代表的地址送入DPTRJMP @A+DPTR;跳转TAB: AJMP ROUT0;跳转ROUT0开始的程序段 AJMP ROUT1;跳转ROUT1开始的程序段 AJMP ROUT2;跳转ROUT2开始的程序段 AJMP ROUT3;跳转ROUT3开始的程序段 ROUT0: ROUT1: ROUT2: ROUT3: 程序将根据A中的内容转移到不同的程序段去执行----散转。A=0,转ROUT0A=2,转ROUT1A=4,转ROUT2A=6,转ROUT3
第62页:2.2.5 控制转移指令(累加器)
- 2.2.5控制转移指令2.条件转移类指令
- 累加器A状态转移指令
- 比较不等转移指令
- 减1不为零转移指令条件转移指令是指在满足一定条件时进行相对转移,否则程序继续执行本指令的下一条指令。
第63页:2.2.5 控制转移(累加器状态)
2.2.5控制转移指令累加器状态转移指令转移到相对于当前PC值的8位移量的地址去。即:新的PC值=当前PC+偏移量relJZ rel;如果A=0,则转移,否则顺序执行。JNZrel;如果A≠0,就转移。在编写汇编语言源程序时,可以直接写成:JZ标号;即转移到标号处。
第64页:2.2.5 控制转移(JZ与JNZ)
2.2.5控制转移指令在执行上面这段程序前:如果R0=0,结果R1=0FFH。而如果R00,则结果是R1=00H。把上面的那个例子中的 JZ改成 JNZ,看看程序执行的结果是什么?如果R0=0,结果R1=00H。如果R00,结果是R1中的值为0FFH。 MOV A,R0JZ L1MOV R1,#00HAJMPL2L1: MOV R1,#0FFHL2: SJMPL2END例:
第65页:2.2.5 控制转移指令
2.2.5控制转移指令比较不等转移指令转移到相对于当前PC值的8位移量的地址去。即:新的PC值=当前PC+偏移量relCJNEA,#data,relCJNEA,direct,relCJNERn,#data,relCJNE@Ri,#data,rel此类指令的功能是将两个操作数比较,如果两者相等,就顺序执行,如果不相等,就转移。同样,在编写汇编语言源程序时,可以直接写成:CJNE A,#data,标号;即转移到标号处。
第66页:2.2.5 控制转移指令(比较不等转移)
2.2.5控制转移指令比较不等转移指令利用这些指令,可以判断两数是否相等。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能:如果两数不相等,则CPU还会用CY(进位位)来反映哪个数大,哪个数小。如果前面的数大,则CY=0,否则CY=1。因此在程序转移后再次利用CY就可判断出哪个数大,哪个数小了。
第67页:2.2.5 控制转移指令(比较结果示例)
2.2.5控制转移指令因此最终结果是:如果R0=10H,则R1=00H;如果R0>10H,则R1=0AAH;如果R0<10H,则R1=0FFH。 MOV A,R0CJNE A,#10H,L1MOV R1,#0AJMPL3L1: JCL2MOV R1,#0AAHAJMPL3L2: MOV R1,#0FFHL3: SJMPL3例:
第68页:2.2.5 控制转移指令
2.2.5控制转移指令减1不等于零转移指令转移到相对于当前PC值的8位移量的地址去。即:新的PC值=当前PC+偏移量relDJNZRn,relDJNZdirect,rel同样,在编写汇编语言源程序时,可以直接写成:DJNZ Rn,标号;即转移到标号处。这两条指令把源操作数减1,结果回送到源操作数中去,如果结果不为0则转移。
第69页:2.2.5 控制转移指令
2.2.5控制转移指令将23H单元中的数连续相加,存至A中,每加一次,23H单元中的数值减1,直至减到0,共加(23H)次。例:本例中的23H中的数是10,实际就是求:1+2+……+10=?MOV 23H,#0AHCLR ALOOP: ADD A,23HDJNZ 23H,LOOPSJMP $
第70页:2.2.5 控制转移指令(调用与返回)
- 2.2.5控制转移指令3.调用与返回指令
- 长调用指令:LCALLaddr16
- 短调用指令:ACALLaddr11
- 子程序返回指令:RET
- 中断子程序返回指令:RETI在程序设计中,通常把具有一定功能的公用程序段编制成子程序,当主程序需要使用子程序时用调用指令,而在子程序的最后安排一条子程序返回指令,以便执行完子程序后能返回主程序继续执行。
第71页:2.2.5 控制转移指令(空操作NOP)
2.2.5控制转移指令4.空操作指令NOP空操作,就是什么事也不干,停一个周期,一般用作短时间的延时。
第72页:汇编语言与汇编程序
二.汇编语言和汇编程序指令的寻址方式1常用指令2伪指令3指令的时序4
第73页:2.3 伪指令
- 2.3伪指令伪指令:对汇编起某种控制作用的特殊命令,但自身并不产生机器码,不属于指令系统,而仅仅为汇编服务的一些指令,因此称为伪指令。不同汇编程序允许的伪指令并不完全相同,但是一些基本的伪指令在大部分汇编程序中都能使用。51中常用的伪指令分为5大类:
- 程序计数与结束伪指令:ORG,END;
- 符号定义伪指令:EQU,DB,DW,DS,BIT,SET等;
- 附加文件指令:INCLUDE;
- 程序清单格式化伪指令:TITLE,PAGE;
- 一般控制伪指令:LIST,NOLIST,NOCODE。
第74页:2.3 伪指令(程序示例)
2.3伪指令 ORG功能:程序计数伪指令,用于设置由表达式决定的初始地址, ORG也称为起始伪指令。表达式缺省为0。格式: ORG16位地址例如: ORG2000H74 40START: MOV A,#40H7440………………2000H
第75页:2.3 伪指令(END)
2.3伪指令 END功能:汇编语言源程序结束的标志,在 END以后的所有指令,汇编程序不再处理。一个源程序只有一个 END指令,放在所有指令的最后,若没有 END指令,编译将报错。格式: END例如: ENDORG2000H74 40START: MOV A,#40H编译器不处理
第76页:2.3 伪指令(EQU)
- 2.3伪指令
- EQU功能:将一个数值或寄存器名赋给一个指定的符号名。格式:符号名EQU表达式/寄存器名例如:DELYEQU3344HROTEQU 40HMOV DPTR, #DELYMOV DPTR, #3344HMOVROT, AMOV 40H, A
第77页:2.3 伪指令(DB)
2.3伪指令 DB功能:从指定的地址单元开始,定义若干字节的数据。格式:标号 DB8位表达式例如: ORG 2000HTAB: DB14H,26,‘A’ DB0AFH,‘BC’14H1AH41HAFH………………2000H42H43H
第78页:2.3 伪指令(程序示例)
2.3伪指令 DW功能:从指定的地址单元开始,定义若干字(16位)的数据。格式:标号 DW16位表达式例如: ORG 2000HTAB: DW7423H,00ABHDW0AF0H74H23H00HABH………………2000H0AHF0H
第79页:2.3 伪指令(BIT)
- 2.3伪指令
- BIT功能:将一个位地址赋给指定的符号。格式:符号名BIT位地址例如:CTRLBIT P0.0RSTBIT 90HSETBCTRLSETBRST
第80页:汇编语言与汇编程序
二.汇编语言和汇编程序指令的寻址方式1常用指令2伪指令3指令的时序4
第81页:2.4 指令的时序
2.4指令的时序2.4.1指令、机器、状态和振荡周期2.4.2MCS-51指令的时序2.4.3MCS-51指令执行的过程
第82页:2.4.1 指令与振荡周期
2.4.1指令、机器、状态和振荡周期单片机以晶体振荡器的振荡周期(或者外部引入的时钟周期)为最小的时序单位,片内的各种操作都以此周期为时序基准。振荡频率2分频后形成状态周期,振荡频率12分频后形成机器周期。1~4个机器周期确定一条指令的执行时间,这个事件就是指令周期。4种时序单位中,振荡周期和机器周期是单片机内部计算其他时间(如:波特率,定时器定时时间)的基本时序单位。
第83页:2.4.1 指令与振荡周期
- 2.4.1指令、机器、状态和振荡周期如
- 当单片机外接12MHz晶振时的各种时序单位大小如下:振荡周期=状态周期=机器周期=指令周期=(1~4)机器周期=1~4us
第84页:2.4.2 8051指令时序
2.4.2 8051单片机指令的时序
第85页:2.4.3 指令的执行过程
2.4.3指令的执行过程计算机的工作过程是一个周而复始的取指令和执行指令的过程。一般分为三个步骤:1.取指令:从程序存储器中取出指令操作码,送到指令寄存器;2.指令译码:经过指令译码器对指令译码;3.执行指令:产生一系列控制信号,执行指令。
第86页:2.4.3 指令执行过程(示例)
- 2.4.3指令的执行过程例如,执行3+5操作,并将结果送到R0寄存器。指令代码如下:74 05MOVA,#05H24 03ADDA,#03HF8MOVR0,A74H05H24H03H………………2000HF8H
- PC的内容作为地址送出②PC+1→PC③送出的地址选中2000H单元④发出PSEN信号⑤读入指令74H⑥74H→IR寄存器⑦产生控制信号,执行1
- PC的内容(2001H)作为地址送出②PC+1→PC③送出的地址选中2001H单元④发出PSEN信号⑤读入立即数05H⑥05H→A2
本页含表格或算式图示,原文数字粘连严重,未能安全切分为表格,请对照原课件图片补充
第87页:课程结束致谢页
本章内容到此结束,前面各页依次讲解指令的寻址方式、常用指令、伪指令与指令时序。