资源描述:
《《单片机原理及应用(第2版)》第2章》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第二章MCS-51指令系统第一节概述第二节数据传送指令第三节算术与逻辑运算指令第四节控制转移指令第五节位操作指令本章要点指令系统是编写程序的基础,本章将介绍用于8051类单片机的MCS-51指令系统。在MCS-51指令系统中,包括有数据传送指令、算术与逻辑运算指令、控制转移指令、位操作指令等111条指令,本章介绍各种指令的书写格式、寻址方式以及各指令的特点与使用场合。第一节概述一、MCS-51指令系统分类按机器码的长度分类有单字节两字节三字节等三种类型按指令功能分类有数据传送指令算术运算指令逻辑运算
2、指令位操作指令控制转移指令等五种类型二、MCS-51指令书写格式MCS-51指令的书写格式为每条指令写成一行,每行分成若干段,第一段为操作符,第一段之后为操作数,有的指令有操作数也有的指令没有操作数,例如:无操作数指令RET有一个操作数指令INCA有两个操作数指令MOVA,21H有三个操作数指令CJNEA,#50H,TARGET指令码也称操作符指令码与操作数间应留一空格操作数与操作数之间应用逗号隔开操作数三、MCS-51寻址方式1.立即寻址操作数值直接标明在指令上,称为立即数,采用立即数的寻址方式称
3、为立即寻址。立即数要用#号打头,例如指令MOVA,#44H(对应机器码为7444,其中#44即为立即数)。将立即数44送ACC2.直接寻址操作数不是立即数,而是地址值,所需的数从该地址单元中获得,由于这类指令的地址直接标注在指令上,所以称为直接寻址。地址值和立即数的区别是前面是否加#号,例如MOVA,44H,其中44H为地址,与加#号的#44H不同,#44H为立即数。从44H中取出数据08H送给ACC3.寄存器寻址操作数不是立即数,也不是地址,而是一个寄存器名称,则称为寄存器寻址,例如指令MOVA,
4、R1。其中R1即寄存器名称。从寄存器R1中取数将R1中的数据送ACC4.寄存器间接寻址这类指令先从指令上所标明的寄存器中找出存放数据的地址,然后再从所标明的的地址中取数。由于存储数据的地址不直接标明在指令中,所以称之为间接寻址。例如指令MOVA,@R0(注意!只有R0、R1可以间接寻址)。从寄存器中找出存放数据的地址从该地址中取数将数送ACC5.变址间接寻址这种寻址方式是将基址值(包括寄存器PC或DPTR)加上变址值(只能是A),并以此为地址,从该地址单元中取数,例如指令MOVCA,@A+DPTR和
5、MOVCA,@A+PC。1.从ACC中取出变址30H2.从DPTR.取出基址值2010H4.求得2010H+30H=2040H从2040H中取数27H送ACC6.相对寻址相对寻址只限于转移类指令使用,例如SJMPrelDJNZRn,rel它以PC当前值为基地址,加上指令中的偏移量rel,求出转移地址值。由于转移地址可能位于基址之前,也可能位于基址之后,如果位于基址之后,则实际的转移地址等于基址加偏移量。如果位于基址之前,则实际的转移地址等于基址减偏移量。由于指令上的偏移量采用补码以表示正负,故计算转
6、移地址可以一律使用加法。返回本章首页数据传送指令的功能是将数据从源送到目标,源可以是立即数、寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。目标也可以是寄存器、寄存器间接地址,片外存储器或片外存储器间接地址。一、源是立即数的传送指令例如MOVR1,#12HMOV24H,#34HMOV@R1,#56H第二节数据传送指令源(立即数)目标(寄存器或寄存器间接地址)二、源和目标是片内数据存储器的传送指令源和目标在片内,可使用MOV类指令。例如:MOVA,R1MOVR1,AMOVA,@R1MOV@R1
7、,AMOV12H,R1MOVR1,12HMOV@R1,34HMOV34H,@R1MOV12H,AMOVA,12HMOV12H,34H源(寄存器或寄存器间接地址)目标(寄存器或寄存器间接地址)三、源或目标是片外数据存储器的传送指令源和目标在片外,必须使用MOVX或MOVC类指令,例如:MOVXA,@DPTRMOVX@DPTR,AMOVCA,@A+PCMOVCA,@A+DPIRMOVXA,@RiMOVX@Ri,A源(A或片外存储器间接地址)目标(A或片外存储器间接地址)四、交换指令交换指令所指定的交换对
8、象。一方必须是A,另一方为寄存器或寄存器间接地址。为此交换前要先把交换一方传送到A,然后进行交换。例如:XCHA,RnXCHA,directXCHA,@RiXCHDA,@Ri(低半字节交换,高半字节不变)五、堆栈操作指令堆栈是指在片内RAM中划定的一个区,它可以用来暂时保存一些需要重新使用的数据或地址。使用堆栈可以是在执行某些指令时自动完成;例如调用子程序时,把当前PC值保存于堆栈,以便返回时便用。也可以使用堆栈操作指令,将数据压入或弹出,例如:PUSHdirectP