MCS - 51单片机指令系统.ppt_第1页
MCS - 51单片机指令系统.ppt_第2页
MCS - 51单片机指令系统.ppt_第3页
MCS - 51单片机指令系统.ppt_第4页
MCS - 51单片机指令系统.ppt_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章 MCS - 51单片机指令系统,市场上买来的单片机是裸机(内部无程序),需要通过编程,然后将程序固化到机器里面(有专门的烧写工具)。要编程就需要熟悉其指令系统。 指令系统:是一种CPU所能直接执行的所有命令的集合。通常叫做机器语言。它是计算机唯一能够识别和执行的指令。 从概念中可以知道机器语言的构成单位是指令,也称为机器码,用和表示。 指令的长度:从最小的位(一个字节)到最大的位(个字节)多种。,编写好的程序都放在程序存储器中,由于一个存储地址所指示的存储单元只能存放一字节的数据。所以,在存放指令时,必须将指令拆分成一个一个字节进行连续存放。 比如: 实现“累加器加10H”这条指令,其

2、机器语言为 0111010000010000, 占用了两个字节,就必须拆成两个字节进行连续存储。 但是,用二进制来表示比较麻烦,因此,也常用十六进制来表示如:74H 10H来表示以上这条机器语言。可见,用十六进制表示指令比较简单,但是,指令系统有上百条指令,不易记住。所以,一般采用容易记住的一些缩写符号来表示机器语言,这就是我们要学习的汇编语言。以后我们编写程序就要用汇编语言来完成。 比如:“ A加B”用英文写出就是“Add B to A”, 可以缩写成ADD A, B这条就是汇编语言指令。它和机器语言是一一对应的。,3.1指令系统简介 MCS-51系列单片机指令系统共有111条指令,其中有4

3、9条单字节指令,45条双字节指令和17条三字节指令。 用这些指令来完成:数据传送、算术运算、逻辑运算、位操作、程序转移等。,一、指令格式 MCS-51指令系统中的每一条指令都有两级指令格式: CPU可直接识别并执行的机器语言指令。 汇编语言指令(简称汇编指令)。 MCS-51汇编语言指令格式,由以下几个部分组成: 标号: 操作码 目的操作数 ,源操作数 ;注释,具体的名词解释见书本P27,4 个区段之间要用分隔符分开: 标号与操作码之间用“: ”隔开, 操作码与操作数之间用空格隔开, 操作数与注释之间用“;”隔开, 如果操作数有两个以上, 则在操作数之间要用逗号“,”隔开 (乘法指令和除法指令

4、除外 )。,例如:LOOP: MOV A, 3AH ;(A) (3AH),二、指令中的常用符号(书本27),三、寻址方式,所谓寻址方式, 就是寻找操作数地址的方式, 在用汇编语言编程时, 数据的存放、传送、 运算都要通过指令来完成。 编程者必须自始至终都要十分清楚操作数的位置, 以及如何将它们传送到适当的寄存器去参与运算。每一种计算机都具有多种寻址方式。寻址方式的多少是反映指令系统优劣的主要指标之一。 寻址方式越多,指令功能越强。,在 MCS -51单片机指令系统中, 有以下7种寻址方式: (1) 立即寻址; (2) 直接寻址; (3) 寄存器寻址; (4) 寄存器间接寻址; (5) 基址寄存

5、器加变址寄存器间接寻址; (6) 相对寻址; (7) 位寻址。,(1) 立即寻址;,立即寻址方式是将操作数直接存放在指令字节中,作为指令的一部分存放在代码段里。 比如:MOV A, 3AH 跟在指令操作码后面的数就是参加运算的数, 该操作数称为立即数。立即数有一字节和二字节两种可能, 再例如指令: MOV DPTR, 0DFFFH 上述两条指令均为立即寻址方式, 第一条指令的功能是将立即数 3AH送累加器A中, 第二条指令的功能是将立即数 0DFFFH送数据指针DPTR中(0DFHDPH, 0FFHDPL)。 这里面要注意:数据作为立即数操作时候,前面必须加“#” 如果碰到立即数的高位是ABC

6、DEF,则前面还要加0。,举例子: MOV P1,#55H;指将立即数H送到P1口 MOV 20H,#55H;指将立即数存放到H这个地址单元中去,这里要注意一个新的知识点:数据作为地址的时候,前面不用加# MOV R4,#0FH;指将立即数0FH送到寄存器R4中,2. 直接寻址 在指令中直接给出操作数的地址, 这种寻址方式就属于直接寻址方式。在这种方式中, 指令的操作数部分直接是操作数的地址。 比如:MOV A,30H;将H里面的数送到里面 MOV21H,30H;将H里面的数存放到21H里面 在MCS -51 单片机指令系统中, 直接寻址方式中可以访问 3 种存储器空间: (1) 内部数据存储

7、器的低 128 个字节单元(00H7FH)。 (2) 特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。比如:MOVA,P1;将SFR中P1口的数据送入A (3) 位地址空间。,3. 寄存器寻址 在该寻址方式中, 参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0R7, 累加器A, 寄存器B、数据指针DPTR和布尔处理器的位累加器C。,比如:MOV P1,A MOV P1,R4 CLR A;将A清零 CPL A;A中的内容取反 RL A;A中的内容左移,4. 寄存器间接寻址 在这种寻址方式中, 寄存器的内容为操作数的地址。 寄存器间接寻址只能使用寄存器R0、R1 作为地址指针,寻

8、址内部RAM区的数据; 当访问外部RAM时, 可使用R0、 R1及DPTR作为地址指针。寄存器间接寻址符号为“”, 例如:,注:、访问内部数据RAM和外部数据RAM所用操作码是不一样的:内部为MOV,外部为MOVX 比如:MOV A,R0 MOVX A,DPTR 、当用R0和R1对外部数据RAM作间接寻址时,由于外部数据RAM需要位地址,而R0和R1只能提供位地址,因此必须借助P2口的位来作为高位地址。 比如:MOVR0,A MOVX A,R0;这条指令意思是把外部RAM中地址为P2R0的单元内容给A。,5. 基址寄存器加变址寄存器间接寻址 这种寻址方式用于访问程序存储器中的数据表格, 它以基

9、址寄存器DPTR或PC的内容为基本地址, 加上变址寄存器A的内容作为操作数的地址, 例如: MOVC A, DPTR+A MOVC A, PC+A 比如:累加器A02H,DPTR=0300H,外部ROM中,0302H地址单元的内容为55H,则执行指令 MOVC A, DPTR+A后,A中的内容为55H。,6. 相对寻址 在MCS -51 指令系统中设有转移指令, 分为直接转移和相对转移指令, 在相对转移指令中采用相对寻址方式。这种寻址方式是以PC的内容为基本地址, 加上指令中给定的偏移量作为转移地址,也就是目的地址(用来修改PC的值)。指令中给出的偏移量是一个 8 位带符号的常数, 可正可负,

10、 其范围为128+127。 比如:执行指令SJMPH,是将PC当前的内容与54H相加,结果再送回到PC中,成为下一条将要执行指令的地址。设指令SJMPH的机器码为H54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变成2002H,再把PC的内容加上H,形成目标地址H,送回PC,使程序跳转到H单元继续执行。,7. 位寻址 指按照位进行的寻址操作,(前面讲的都是按字节进行的寻址操作)。该种寻址方式中, 操作数是内部RAM单元中20H到2FH的个位地址以及SFR中的个可进行位寻址的寄存器中的位地址寻址。 比如:MOV C,20H;就是将RAM中位寻址区中20

11、H位地址中的内容送给C。区别与MOVA,20H;这个是将内部RAM中H单元的内容送给A。,3.2 MCS-51单片机指令系统,3.2.1 数据传送类指令 程序中使用最多的指令,主要用于内部RAM、寄存器、外部RAM以及程序存储器之间的数据传送、保存以及交换。 工作原理:将源操作数简单地传给目的操作数,而源操作数的内容不变,PSW的内容不改变。 分类:内部数据传送指令、外部传送指令、查表指令、交换指令和堆栈指令。,1、内部数据传送指令(16条) 内部8位数据传送指令共15条,主要用于MCS-51 (1) 将数据传送到累加器A的指令(4条),例如:已知累加器A的内容为30H,寄存器R0的内容为50

12、H,内部RAM30H单元的内容为40H,内部RAM50H单元的内容为10H,请指出下列每条指令执行以后相应单元内容的变化.,指 令 相应操作 A中的结果 MOVA,#20H A #20H 20H MOVA,30H A (30H) 40H MOVA,R0 A (R0) 50H MOVA,R0 A (50H) 10H,(2)将数据传送到工作寄存器Rn的指令(3条),这里源操作数不能进行寄存器间接寻址, 也就是MOVRn,Rn这个指令是不能用的。,例如:已知累加器A的内容为30H,寄存器R7的内容为50H,内部RAM30H单元的内容为40H,内部RAM50H单元的内容为10H,请指出下列每条指令执行

13、以后相应单元内容的变化.,执行指令:MOVR7,A 结果:R7=30H MOVR7,#40H R7=40H MOVR7,50H R7=10H,(3)将8位数据直接传送到直接地址(内部RAM单元或SFR寄存器)指令(5条),例如:R0=50H,(50H)=10H,指令MOV35H,R0执行以后,(35H)=10H。这一操作也可用指令MOV35H,50H,(4)将8位数据传送到以间接寄存器寻址的RAM单元的指令(3条)。注意:这里的i只能是0或者1,例如:已知相应单元的内容如下表所示,请指出下列指令执行后各单元内容相应的变化。,(5)16位数据传送指令(1条),将高8位数据送入DPH,低8位数据送

14、入DPL中。,2、外部传送指令 当CPU与外部数据存储器进行数据传送时,所用的指令为外部传送指令。(16位地址编码) 通过累加器A来完成。采用寄存器间接寻址方式,而间接寻址的寄存器为R0、R1和DPTR。其中R0、R1为8位寄存器,访问的时候实际地址为(P2Ri,其中P2为高8位地址,Ri为低8位地址)。 注意:此类传送指令结果通常影响程序状态字PSW的P位。,比如:DPTR=2000H,外部RAM中(2000H)=18H, 指令MOVX A,DPTR执行以后,A=18H。,再比如说:将外部数据存储器2040H中的数据传送到外部数据存储器2560H中。 MOV DPTR,#2040H MOVX

15、 A,DPTR MOV DPTR,#2560H MOVX DPTR,A,3、查表指令 程序存储器除了存放程序以外,还可以存放表格常数。找出表格中所需的常数,所用的指令为查表指令。,第一条指令为远查表指令,可以在64K的程序存储器空间寻址。基地址寄存器为DPTR,其意思为,DPTR里面存放的是程序存储器中数据表格的首地址,A为数据地址的偏移量。 这条指令执行以后,以 (A)+(DPTR)的数值为地址数据就送进A里面来了,也就是从表格首地址开始以后的第(A)个数据被送进A了。(举例子说明) 第二条指令为近查表指令,查表范围为超标指令后256B的地址空间。基地址为PC,查表的地址为(A)+(PC),

16、其中,(PC)为程序计数器的当前内容,即查表指令的地址再加1。(解释一下),4、交换指令,(1)半字节交换指令,第一条指令(SWAP A),为类加器低4位与高4位交换指令。 比如:A=35H, 指令SWAP A执行后,A=53H 第二条指令(XCHD A,Ri),为内部RAM单元低4位内容与类加器低4位内容交换指令。 比如:A=80H,R0=32H,(32H)=FFH,指令XCHD A,R0执行以后,A=8FH,(32H)=F0H。,(2)字节交换指令(8位数据进行互换),比如:A=80H,R7=45H,指令XCH A,R7执行以后,A=45H,R7=80H A=60H,R0=25H,(25H

17、)=23H,指令XCH A,R0执行后,A=23H,(25H)=60H,5、堆栈操作指令,(1)堆栈是用户自己设定的内部RAM中的一块专用存储区,使用时一定要先设堆栈指针,堆栈指针缺省为SP=07H。 (2)堆栈操作必须是字节操作,且只能直接寻址。将累加器A入栈、出栈指令可以写成:PUSH ACC和POP ACC而不能写成PUSH A和POP A,应用举例:设堆栈指针为30H,将累加器A和DPTR中的内容压入,然后根据需要再将它们弹出,编写实现该功能的程序段。,解:MOV SP,#30H ;设置堆栈指针,SP=30H为栈底地址 PUSH ACC ;SP+1 SP,SP=31H,ACC (SP)

18、 PUSH DPH ;SP+1 SP,SP=32H,DPH (SP) PUSH DPL ;SP+1 SP,SP=33H,DPL (SP) 。 POP DPL ;(SP) DPL,SP-1 SP,SP=32H POP DPH ;(SP) DPH,SP-1 SP,SP=31H POP ACC ;(SP) ACC,SP-1 SP,SP=30H,综合运用:把片内RAM中H单元中的内容与40H地址单元中的内容互换 方法一(直接地址传送法) MOVA,50H MOVB,A MOVA,40H MOV50H,A MOVA,B MOV40H,A SJMP$,方法二(间接地址传送) MOVR0,#40H MOVR

19、1,#50H MOVA,R0 MOVB,R1 MOVR1,A MOVR0,B SJMP$,方法三(直接地址间传送法) MOVR7,50H MOV50H,40H MOV40H,R7 SJMP$,方法四(字节交换传送法) MOVA,50H XCHA,40H MOV50H,A SJMP$,方法五(堆栈传送法) PUSH 50H PUSH 40H POP50H POP40H SJMP$,作业: P83 3、4、5,3.2.2 算术运算类指令,算术运算类指令是单片机能完成算术运算操作的指令。包括加、减、乘、除,以及BCD码调整指令等。,1、加法指令,加法指令是将源操作数内容与累加器A相加,结果存入A中。

20、 注意,此类指令都影响程序状态字寄存器PSW的CY、OV、AC和P。这些指令在执行过程中不需要考虑进位,也就是进位位Cy上有没有数,对这次运算不影响。,比如:完成0A4H+27H运算,把运算结果放到内部RAM的40单元里面。 MOV A,#0A4H ADD A,#27H MOV 40H,A,指令执行以后, CY=0,OV=0,AC=0和P=0,2、带进位位的加法指令 将源操作数的内容与累加器A相加,再加上进位位Cy的内容,将结果存放在累加器A中。,与ADD的区别是需要把Cy中的内容加进去。,如:编写程序,完成12A4H+0EE7H的运算,将结果存入内部RAM的41H和40H单元内,高8位放在4

21、1H中,低8位放在40H中。(设初始状态Cy=0) MOV A,#0A4H ADD A,#0E7H MOV 40H,A MOV A,#12H ADDC A,#0FH MOV 41H,A,3、带借位的减法指令,将累加器A 中的内容减去源操作数的内容,再减去进位位Cy的内容(CY中保留着低位字节向高位字节的借位),其结果存放在A 中。,例如:A=38H,R1=20H,(20H)=23H,C=1,指令SUBB A,R1执行以后A=14H.,4、乘法、除法 乘法和除法均指无符号数运算。也就是最高位不是符号位。,乘法: A,B中各放一个8位乘数,指令执行后,16位积的高位放在B中,低位放在A中。运算结果

22、影响PSW中的Cy、OV和P。如果积大于255,则溢出标志位OV置“1”,否则OV清零;P仍然由累加器A中1的奇偶性决定;进位标志Cy总是为”0”. 例如:实现0A0H和08H的乘法指令 MOV A,#0A0H MOV B,#08H MUL AB,结果为(A)=00H,(B)=05H,P=0,Cy=0,OV=1。,除法: A中放一个8位被除整数,B中放的是一个8位整数除数,指令执行后,所得到的商的整数部分存于A中,余数部分存放在B中。运算结果影响PSW中的Cy、OV和P。溢出标志位OV置“0” ,当除数为0时,结果产生溢出,此时OV=1。P仍然由累加器A中1的奇偶性决定;进位标志Cy总是为”0

23、”. 例如:实现0AEH除以08H的指令 MOV A,#0AEH MOV B,#08H DIV AB,结果是:(A)=15H,(B)=06H,Cy=0,OV=0,P=1,AC不变,5、增量 执行此指令以后,相应的数据会自动加一个1。然后把加1以后的那个数据放回原来的单元。,6、减量 执行此指令以后,相应的数据会自动减一个1。然后把减1以后的那个数据放回原来的单元。,注意:DPTR在这里就不能用来自动减1了,7、十进制调整指令(BCD调整指令) 我们知道单片机只认识0和1,而且里面的运算一般都是以十六进制来计算的。因此一般在进行两个十进制数计算的时候先将其转换成十六进制,然后再放到单片机里面去,

24、计算以后得到的还是十六进制数据(举例子85+58)。但是在有些场合,特别是有显示的时候,我们希望显示头上显示的是十进制数,这样按照以上的方法,我们还须对结果进行转换。比较麻烦。 为了解决这个问题,我们引入了这条指令。 DA A 对A中的十进制加法运算结果进行调整。,比如刚才讲到的85+58这个计算,我们把85和58这个两个十进制数当成是两个十六进制数,直接放入程序进行计算,以十六进制方法进行加法运算,运算完毕以后执行DA A这条指令,系统就会自动把十六进制这个结果转换成十进制加法的结果。即从0DDH转换成143( 85+58 ) 这里要注意,刚才讲到,这条指令也叫做BCD码调整指令,主要是十进

25、制数其实就是一个BCD码,只不过是用十进制数码来表示了,而我们数电中学的是用二进制来表示的。,实质:将十六进制的加法运算转换成十进制加法运算。,什么情况下、怎么转换: (1)若相加以后累加器A的低四位大于9(A-F),或者辅助进位位AC=1(虽然A的低四位为小于9,但是有半进位,如08+09=11H),则累加器A的内容在这条指令的作用下自动加06H 比如 08+09(十进制运算,要得到其十进制结果),指令为 MOV A,#08H ADD A,#09H DA A 指令执行以后A里面的数据就是17了。也就是先进行08H和09H的十六进制加法运算,完了以后结果为11H,此时有半进位,即AC=1,所以

26、,在11H的基础上还要加06H。,再比如:实现05+06的运算,指令如下: MOV A,#05H ADD A,#06H DA A 指令执行完了以后十六进制结果应该是0BH,但由于要进行调整指令,所以结果变成了0BH+06H=11H,就相当于是5+6的十进制运算了。,(2)若相加以后累加器A的高四位大于9(A-F),或者进位位Cy=1(虽然A的高四位为小于9,但是有进位,如91+81=12H,此时Cy=1),则累加器A的内容在这条指令的作用下自动加60H 比如:要实现91+81(十进制加法运算),则指令如下: MOV A,#91H ADD A,#81H DA A 指令运行完了以后,A里面的数据就

27、会在十六进制加法运算的结果之上再加60H,使得结果呈现为72H,其中Cy中为1,所以最后的结果应该为172。,综合例题:,(1)把R7中的无符号数扩大10D倍(设原来的数小于25D) MOV A,R7 MOV B,#0AH MUL AB MOV R7,A SJMP $,(2)把R1R0和R3R2中的2个4位BCD数相加,结果送入 R5R4中,如有进位则村于进位位C中. CLRC MOVA,R0 ADDA,R2 DAA MOVR4,A MOVA,R1 ADDC A,R3 DAA MOVR5,A SJMP $,3.2.3 逻辑运算类指令 逻辑运算主要包括:”与”、”或”、”异或”、求反和清零、循环

28、移位共24条指令。 1、“与”操作,注意: 1、“与”运算一般用于将字节中指定的位清零,而其他位不变。 比如:11101101若要将其高四位清零,只要将这个数据和00001111与一下就可以了,这样低四位是不变的。 2、”与”运算是将源操作单元的内容与目的操作单元的内容相与运算后,将结果存放在目的操作单元中,而源操作单元中的内容不变。,例题:将累加器A中的压缩BCD码变成非压缩的BCD码,存入40H、41H单元中。 MOV30H,A ANLA,#00001111B;清高4位,保留低4位 MOV40H,A;低位BCD码放入40H中 MOVA,30H ANLA,#11110000B;清低4位,保留

29、高4位 SWAPA;高四位和低四位进行互换 MOV41H,A END,2、“或”运算指令,注意: 1、“或”运算一般用于将字节中指定的位置1,而其他位不变。 比如:10000001若要将其第四位置1 ,只要将这个数据和00001000或一下就可以了,这样其他位是不变的。 2、”或”运算是将源操作单元的内容与目的操作单元的内容相或运算后,将结果存放在目的操作单元中,而源操作单元中的内容不变。,比如:将累加器A中的高4位由P1口的高4位输出,P1口的低4位不变。 ANLA,#11110000B;保留A中的高四位 MOV40H,A MOVA,P1 ANLA,#00001111B;保留P1口读进来的低

30、四位,其中高四位变成了0000 ORGA,40H;40的高四位和A中的高四位0000相或后保持不变。 A中的低四位和40中的低四位0000相或也不变,此时,A中的数据就变成了原来A的高四和P1的低四位 MOVP1,A END,3、逻辑异或运算指令,注意: 1、“异或”运算可以对某存储单元中数据进行变换,完成其中某些位取反,而其他位不变。 2、还可以用于判别两操作数是否相等,若相等,结果全为0,否则不全为0。,4、循环移位指令,RRA;其作用为将A内的内容循环右移,RLA;其作用为将A内的内容循环左移,RLCA;指令的功能分别是将累加器A的内容带进位位Cy循环左移。,RRCA;指令的功能分别是将

31、累加器A的内容带进位位Cy循环右移。,比如: 1、假设(A)=00111010B=3AH,(Cy)=0 执行指令:RLC A 指令执行后:(A)=01110100B=74H 从这个例题也可以看出,带进位循环左移指令可以实现乘以2的功能 2、假设(A)=01111011B=7BH,(Cy)=0 执行指令:RRC A 指令执行后:(A)=00111010B=3DH 从这个例题也可以看出,带进位循环左移指令可以实现除以2的功能,综合实例:把R2R3中的16位补码数(高位在R2中)右移一位,并不改变符号 MOVA,R2 MOVC,ACC.7 RRCA MOVR2,A MOVA,R3 RRCA MOVR

32、3,A SJMP$,5、清零取反指令,综合实例:把在R4和R5中的两字节数取补(高位在R4中) CLRC MOVA,R5 CPLA INCA MOVR5,A MOVA,R4 CPLA ADDCA,#00H MOVR4,A SJMP$,3.2.4 控制转移类指令(22条) 控制转移指令用于控制程序的执行方向.这类指令通过修改PC的内容来控制程序走向,MCS-51单片机具有丰富的控制转移指令,包括无条件转移指令、条件转移指令、循环转移指令、比较转移指令、循环转移指令、子程序调用与返回指令和空操作指令。 1、无条件转移指令(4条) LJMP addr16 AJMP addr11 SJMP rel J

33、MP A+DPTR 当单片机执行这些指令的时候,会无条件的转移到对应的地址中去继续执行程序。,(1)LJMP addr16 (长转移指令) 此类指令是以16位地址为转移的目标地址。它将16位目标地址装入程序计数器PC使程序执行此指令后,无条件转移到addr16处执行。长转移指令也可以在64K范围内转移。 (2)AJMP addr11(绝对转移指令或短跳) a、这条指令为2字节指令,其中AJMP的机器码为00001,是个5位数据,和后面的11位地址共同组成了16位的机器语言指令。 b、指令的操作:是将11位的目标地址addr11装入PC的低11位。 c、要求转移的目标地址必须和AJMP后面一条指

34、令的第一字节地址位于程序存储器的同一段2K字节范围内。看的方法:目标地址的高5位与PC+2后PC中的高5位相同。,例如:分析以下指令执行后PC的值 KWR:AJMPKWR1 假设KWR标号的地址为1030H,KWR1标号的地址在1100H,其意思是要跳到KWR1(1100)处去执行程序,那么到底这个地址能不能跳得到,验证: (1)这条指令被CPU取走以后,PC的值是1030H+2=1032H,(因为它是个2字节指令)也就是PC指在AJMP后面的那条指令的首地址上 (2)这条指令执行完了以后,CPU知道是要跳了,然后就开始寻找跳的位置,目的地址由1032的高5位和KWR1所在地址1100的低11

35、位组成,也就是0001000100000000=1100H,说明符合要求,我们人为验证的时候只要看一下,1032的高5位和1100的高5位一致不一致,如果一致说明程序肯定能执行的。 不一致就不行,比如1032和1800就不在同一段2K之内了。,所以要使用AJMP这条指令的话,要跳的目的程序不能离得太远。,(3)SJMPrel(相对转移指令,为2字节指令) 8位地址rel是相对当前PC的跳转偏移量,在编程序的时候往往用符号代替相对地址。 比如:为单片机写停机指令的时候,若要动态停机(原地循环等待)可以用SJMP指令来实现; 动态停机指令:LP1:SJMP LP1 或者写成SJMP $,(4)JM

36、P A+DPTR(间接转移指令) 转移目标地址由数据指针DPTR和A相加而得。指令的执行不影响累加器A和数据指令DPTR。该指令的特点是转移地址可以在程序运行中加以改变。根据A的不同值可以实现多分支转移,因此一条指令可以完成多分支转移的功能。该功能称为散转功能,因此这条指令有称散转指令。,例如:MOVDPTR#TABLE JMPA+DPTR TABLE:AJMP ROUT0 AJMPROUT1 AJMPROUT2,2、条件转移指令(2条) JZ rel JNZ rel (1)JZrel(累加器为0转移,二字节指令) 执行指令时先对累加器A 的内容进行判断。当累加器A 的内容为0时,转移至相对当

37、前PC为rel的目标地址上,也就是PC的值变成了PC+2+rel,否则程序顺序执行。,要掌握:转移的目标地址要会算;该指令用于判断,例:将外部RAM的一个数据块(首址为0101H)传送到内部RAM(首址为50H以后的单元),遇到传送的数据为零时停止。 START:MOV R0, 50H ;置内部RAM数据指针 MOV DPTR,0101H ;置外部RAM数据指针 LOOP1:MOVX A, DPTR ;外部RAM单元内容送A JZ LOOP2 ;判传送数据是否为零,A为零则转移 MOV R0, A ;传送数据不为零,送内部RAM INC R0 ;修改地址指针 INC DPTR SJMP LOO

38、P1 ;继续传送 LOOP2:RET ;结束传送,返回主程序,(2)JNZrel(累加器不为0转移,二字节指令) 执行指令时先对累加器A 的内容进行判断。当累加器A 的内容不为0时,转移至相对当前PC为rel的目标地址上,也就是PC的值变成了PC+2+rel,否则程序顺序执行。,3、比较转移指令(4条,三字节指令) CJNE A, #data, rel CJNE A, direct, rel CJNE Rn, #data, rel CJNE Ri, #data, rel,以上的rel均用符号来表示,(1)CJNE A, #data, rel 当(A)data时,程序转移,转移的目的地址,也就是

39、PC的值应该为PC+3+rel 当(A)=data,程序顺序执行 (2)CJNE A, direct, rel 当(A) (direct)时,程序转移,转移的目的地址,也就是PC的值应该为PC+3+rel 当(A)= direct,程序顺序执行。,(3) CJNE Rn, #data, rel 当(Rn) data时,程序转移,转移的目的地址,也就是PC的值应该为PC+3+rel 当(Rn)= data ,程序顺序执行。 (4) CJNE Ri, #data, rel 当((Ri)) data时,程序转移,转移的目的地址,也就是PC的值应该为PC+3+rel 当((Ri))= data ,程序

40、顺序执行。,注意:若第一操作数大于或等于第二操作数,则影响标志C=0; 若第一操作数小于第二操作数,则C=1。利用对C的判断,可使这几条指令实现两操作数相等与否的判断,还可以完成两个数大小的比较,若要比较大小一般和位操作指令JC一起使用。,综合例题: 试编写在单片机中使用的电子钟中断记时程序。设每隔一秒进入一次本程序,其中,R7存放小时值,R6存放分钟值,R5存放秒值。 START:MOV A, R5 CJNE A, #60H, NEXT ADD A, #01H MOV R6, #00H DA A MOV A, R7 MOV R5, A ADD A, #01H CJNE A, 60H, NEX

41、T DA A MOV R5, #00H CJNE A, #24H, NEXT MOV A, R6 MOV R7, #00H ADD A, #01H NEXT:RETI DA A MOV R6, A,4、循环转移类指令 DJNZ Rn,rel DJNZ direct,rel DJNZ Rn,rel(寄存器Rn减1不为0转移指令,2字节指令) 首先将寄存器Rn中的内容减1,然后判断Rn中的内容是否为0,如果不为0,程序转移到相对地址rel;如果为0,则程序顺序执行。此指令用在循环程序中,循环次数存放在寄存器Rn中。,例题:设单片机的晶振为6MHz,编写4一段延时约为100ms的子程序。 题目分析:

42、振荡周期为1/6MHz,则机器周期为12* (1/6MHz)等于2微妙。也就是完成指令的一个动作需要2微妙,而指令DJNZ Rn,rel的完成须分两个动作(书本49页),因此这条指令的执行需要4微妙时间。 DELAY:MOV R7, #64H LOOP:MOV R6, #0FAH DJNZ R6, $ DJNZ R7, LOOP RET,(2)DJNZ direct,rel(直接地址减1不为0转移指令,3字节指令) 这条指令与上面的指令类似,只是循环次数是放在直接地址中的,它的完成也需要分两个机器周期完成。,5、子程序调用与返回指令(4条) ACALL addr11 LCALL addr16

43、RET RETI,在程序中使用子程序的目的是把重复的程序段编写为一个子程序,通过主程序调用而使用它。(比如延时程序,一个程序中可能很多地方要用到),减少了编程工作量,缩短了程序的长度。 调用指令在主程序中使用,而返回指令则应该是子程序的最后一条指令。执行完这条指令之后,程序返回主程序断点处继续执行。如图所示。(和中断有区别),(1)ACALL addr11(11位地址绝对子程序调用指令,2字节) 分两个步骤:先将此指令的下一条指令的地址压栈保护,然后将11位地址addr11送入PC的低11位,高5位为本指令下面一条指令的首地址的高5位。本指令下一条指令的首地址必须与子程序入口地址在同一个2K段

44、里面。 (2) LCALL addr16(16位长调用指令,3字节) 应用和上面这条指令相同,就是调用范围更宽了,64K范围。,(3)RET(子程序返回指令) 用在子程序的最后,当子程序运行完毕以后,必须返回到原来的主程序,当单片机运行到该指令的时候,机器自动将调用子程序时压如堆栈的的下一条指令的地址从堆栈中弹出,赋给PC。,(4)RETI(中断返回指令) 用在中断服务程序的末尾,指令执行以后,除程序返回断点地址处继续执行外,还清除相应的中断优先级状态位,,6、空操作指令NOP 该指令不进行任何操作。执行空操作的时候, PC自动加1指向下一条指令,占用CPU一个机器周期的时间。用NOP指令常进

45、行等待,延时。,3.2.5 位操作类指令,单片机内部有位累加器Cy,内部数据存储器中的128位位地址,11个有位寻址功能的特殊寄存器,以及17条位操作指令,这些部件构成了单片机的布而处理机。对这些部件的操作均可以采用位操作指令。,可以采用四种寻址方式: (1)直接地址方式,比如90 (2)利用特殊功能寄存器名的位地址方式,如P1.0 (3)利用特殊功能寄存器的位名称方式,如TE0 (4)用户使用伪指令事先定义过的符号地址。,1、位传送指令(2条) 位传送指令是实现位累加器C与位bit之间的位数据双向传送。,注意:对于MOV bit, C这条指令,当 bit为P0-P3中的某一位的时候,指令的执

46、行是先把端口的全部内容(8位)读入,然后把Cy的内容传送到指令位,最后把8位数据一起再传送到端口。因此,它的操作为“读-改-写”指令。 比如:P1口现在的数据为11100111,现在要求把P1.1的内容送给P1.4 MOV C,P1.1 MOV P1.4,C 执行的过程为将P1.1的内容先给C,第二条指令先把P1口的内容全部读入片内某单元,再将C的内容给该单元中的对应与P1.4的位置,然后再把这个数据从该单元送到P1口。,2、位逻辑操作指令(6条),前两条指令是位逻辑与指令,第一条的意思是将位地址中的内容与位累加器Cy中的内容相与,结果存放在 Cy中。第二条指令将位地址中的内容取反,与Cy中的

47、内容相与,结果存放在Cy中。 第三、四条指令是位逻辑或指令,第三条指令将位地址中的内容与位累加器Cy中的内容相或,结果存放在Cy中。第四条指令将位地址中的内容取反,与Cy中的内容想或,结果存放在Cy中。 最后两条指令是位逻辑取反指令,分别对Cy及直接位地址中的内容进行取反操作运算,结果存放在Cy和 位地址中。,3、位状态控制指令(4条),前两条指令为位清零指令。分别对Cy和直接位地址进行清零操作。后两条指令为位置1指令,分别对Cy和直接地址进行置1操作。,4、位条件转移指令(5条),实例:用MCS-51单片机实现Y=X0*X1+X2*X3*X4+X5*X6逻辑运算的功能. 编程说明:为了使逻辑

48、运算问题适合MCS-51单片机处理,首先选择P1口中的P1.0-P1.6作为输入变量,P1.7 作为输出变量. MOVC,P1.0 MOV C,P1.5 ANLC,P1.1 ANL C, P1.6 MOV30H,C ORL C, 30H MOVC,P1.2 MOV P1.7, C ANLC,P1.3 END ANLC,P1.4 ORLC,30H MOV30H,C,3.3 汇编语言程序设计,3.3.1伪指令 所谓的伪指令就是仅在汇编的时候起作用,而机器执行的时候不起作用的指令.伪指令用于规定存放的首地址,为源程序预留存贮区,以及规定汇编语言程序何时结束等. (1)定位伪指令 格式:ORG n O

49、RG规定紧接其后的程序或数据块的起始地址. ORG n规定其后的程序或数据块从地址n开始存放.n可以是十进制常数,也可以是十六进制常数.,下面的程序从1000H开始存放. ORG1000H MOVR2,#08H MOVR0,30H MOVR1,40H LOOP:MOVA,RO MOVR1,A INCR0 INCR1 DJNZR2,LOOP,(2) 定义字节伪指令 格式:标号:DB X1,X2,X3,Xn 把Xi存入从标号开始的连续单元中.此伪指令常用来建立常数表格,其中Xi为8位数据或ASCII码,表示ASCII码时应使用单引号.当Xi为数值常数时,取值范围为00-FFH;为字符串常数时,其长

50、度不应该超过80个字符 比如:ORG1000H DB20H,21H,22H 此时,(1000H)=20H,(1001H)=21H,(1002H)=22H,(3) 定义双字节伪指令 格式:标号:DW X1,X2,Xn 此指令的功能是把Xi存入从标号开始的连续单元中,其中Xi为16位数值常数,16位数据占两个存储单元,先存高8位,再存低8位. (4)预留存贮区伪指令 格式:DS n 从标号指定单元开始,预留n个单元的存贮区.后 例如:ORG 2000H L1:DS 07H L2:DB 86H,0A7H 汇编后,从2000H开始保留7个字节单元,从2007H单元开始按DB命令给内存单元赋值.,注意:

51、DB、DW、DS伪指令只能对程序存储器进行赋值和初始化工作,不能用来对数据存储器进行赋值和初始化。,5、赋值伪指令 格式:字符名称X EQU n 将数据或地址n赋给字符名称。使 X和n等值。其中n可以是单字节数据,也可以是双字节数据,还可以是工作寄存器,以及直接地址。 例如:LG EQU 10H DE EQU R0 MOV A, LG;将10H这个数给A MOV R1, DE;将R0里面的数据给R1,利用这条指令以后编程、调试、修改就非常方便了,一般如果某个数据在程序中经常要用到,可以使用EQU对其进行定义,用某个固定的字符名来表示,这样如果要修改这个数据,只要在程序开始的地方进行修改就可以了

52、。不需要在程序中每个地方都修改。,6、结束汇编伪指令 格式:END 告诉源程序运行到此结束,一般都放在程序末尾。,3.3.2 汇编语言程序设计过程(如何来编写程序) 1、分析任务,确定算法或解题思路 算法:是对计算机操作步骤的描述,也就是要完成某项任务,你需要计算机按怎么样的先后顺序和逻辑来进行。(用文字来描述比较人性化) 2、根据算法和解决思路画出程序流程图 流程图给出了程序的结构,直观的表示出了程序的执行过程。将复杂的程序分解成了若干个比较简单的子程序或者是程序块。流程图要充分表达程序设计的思路,也就是算法。另一方面,程序流程图还有助于阅读程序。,流程图是由一些框图和流程线组合而成:,置的

53、框图连接在一起,位于不同框图的圈内,应标注相同的字母。,3、根据流程图编写程序 4、上机调试程序,通过具体程序的设计来巩固,3.3.3 顺序结构程序设计 最简单、最基本的程序。它按照程序编写的顺序,依次执行。 任何复杂的程序都含有较大成分的顺序结构程序。 例1、将两位压缩BCD码转换成二进制数 编程思路:比如12转成二进制应该为110+2,推广到一般就是:(a1a0)BCD= a110+a0 编程说明:待转换的两位压缩BCD码存放于R2,转换结果存回R2。 程序流程图如下所示,编程如下: START: MOV A , R2 ANL A , #0F0H ;取高位BCD码 SWAP A MOV B

54、 , #0AH MUL AB MOV R3 , A MOV A , R2 ANL A , #0FH ;取低位BCD码 ADD A , R3 MOV R2 , A END,例2、设变量放在片内RAM20H单元,其取值范围为00H,01H,02H,03H,04H,05H,要求编制一段查表程序,查出变量的平方值,并放入片内RAM21H单元。 分析:在程序存储器的一片指定地址单元中,建立变量各个取值的平方表,用数据指针指向平方表的首址,则变量与数据指针之和的地址单元中的内容就是变量的平方值。,开 始,在程序存储器2000H 地址单元开始建立平方表,#2000H DPTR,(20H) A,(A+DPTR

55、) A,A 21H,结 束,ORG1000H START:MOV DPTR,#2000H MOV A,20H MOVC A,DPTR+A MOV 21H,A SJMP$ TABLEEQU2000H TABLEDB00H,01H,04H,09H,10H,19H END,3.3.5 分支程序设计 在解决实际问题时,常常需要根据不同的条件去执行不同的程序,这样程序便产生了分支。这种结构的程序,称为分支程序。(一般用条件转移指令、比较转移指令和位转移指令实现)结构图如下:,【例1】 求符号函数的值 1 当X0 Y= 0 当X=0 的值。 -1 当X0 编程说明:设变量X存放在40H单元中,函数Y存放在

56、41H单元中。此程序为三分支程序。 程序流程图如图3-3所示。,编程如下: START: MOV A,40H JZ COMP JNB ACC.7, POST;正负判断 MOV A,#81H ;表示-1 SJMP COMP POSI: MOV A,#01H ;表示+1 COMP: MOV 41H,A END,【例2】 求单字节有符号二进制数的补码。,编程思路:正数的补码是正数自身,不需要转换,如果是负数则先取反再加1,注意符号判断的时候为最高位为0则为正,最高位为1则为负,负数取反符号不能变,必须先保护。,编程如下: CMPT:MOV A , 30H JNB ACC.7 , NCH;(A)0,不

57、需要转换 MOV C , ACC.7;保存符号 MOV 10H , C CPL A ADD A , #1 MOV C , 10H MOV ACC.7 , C;恢复符号 NCH:END,3.3.6 散转程序设计 散转程序属于分支程序的范畴,是一种并行多分支程序。它根据某种输入或运算结果,分别转向各个程序。散转程序常使用散转指令JMPA+DPTR实现跳转。其中,DPTR存放散转地址表的首地址,累加器A 存放转移地址序号。,例:用单片机作四则运算。 编程说明:在单片机系统中,设置+、四个运算键,这四个运算键的键值分别为0、1、2、3(键值存放在寄存器(2中),当其中一个按键按下时,进行相应的运算。 P1口输入被加数、被减数、被乘数或被除数,以及运算结果的低8位或商。 P3口输入加数、减数、乘数或除数,,以及结果的高8位或余数。 键号存放在累加器A中。 程序流程图如图3-6所示。,参考程序如下: START: MOV P1 , #0FFH MOV P3 , #0FFH MOV DPTR, #TA

温馨提示

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

最新文档

评论

0/150

提交评论