数据传送指令的特点为:
1)操作——把源操作数传送到目标操作数,指令执行后,源操作数不改变,目标操作数修改为源操作数。若要求在进行数据传送时,不丢失目标操作数,则可以用交换型的传送指令。
2)数据传送指令不影响标志C、AC和OV,不包括奇偶标志P。对于P一般不加说明。POP PSW或MOV PSW,#(x)可能使某些标志位发生变化。
数据传送指令助记符有:MOV,MOVX,MOVC,XCH,XCHD,SWAP,POP,PUSH八种。
源操作数可为:寄存器寻址、寄存器间接寻址、直接寻址、立即寻址、变址寻址五种方式;目标操作数可为:寄存器寻址、寄存器间接寻址、直接寻址三种方式。
通用格式:
MOV<目标操作数>,<源操作数>
1.内部RAM数据传送指令及要点分析
(1)指令介绍 内部RAM数据传送指令有以下几类。
1)以累加器为目标操作数的指令:
2)以寄存器Rn为目标操作数的指令:
这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。
3)以直接地址为目标操作数的指令:
4)以间接地址为目的操作数的指令:
5)十六位立即数的传递指令:
MSC-51系列单片机是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#2050H,执行之后DPH中的值为20H,DPL中的值为50H。如果分别向DPH,DPL送数,则结果也一样。如:MOV DPH,#20H,MOV DPL,#50H,就相当于执行了MOV DPTR,#2050H。
(2)要点分析 下面在片内RAM数据传送指令介绍的基础上,对其进行要点分析。
1)内部存储器在指令中的行为。片内存储器在指令中的行为是指单片机芯片内存储器在指令中的作用与工作情况。MCS-51系列单片机的111条指令中的绝大多数要和内部存储器打交道。这些片内存储器的行为搞清楚了,就很容易掌握与其相关指令的规律。按片内存储器在指令中的作用可以将其分成以下五种类型,如图2-22所示。
图2-22 内部存储器在指令中行为示意图
①累加器A,这是指令系统里的核心单元。绝大部分的指令操作就是围绕它来进行的,而且它的状态可以反映出一些操作的结果。
②SFR存储单元,也包括RAM,叫做直接寻址单元,标作Direct。所谓Direct,就是直接给出了程序中要调用的数在内存单元中的物理地址。比如说,在指令中操作数写的是7FH,那就是指的7FH单元。这个7FH是单元地址,地址里的内容是我们要的东西。对于这一类地址,可以给它取一个通俗的名字,叫“死地址”,意思是它写了就不能改了。或者,可以将这类单元称作固定地址。例如MOV A,6FH,这条指令只能读取6FH单元里的数据并将此数据送到累加器A中。
③工作寄存器Rn,包括四组32个单元。这个工作寄存器不是活地址,它的地址也是死的,但工作寄存器中的内容可以调节,是活数。譬如说,访问R0时,用指令MOV A,R0,那么R0这个地址不能改了,但是R0里的内容(数)是可以改的,这是个活数。我们可以用给R0赋值的方式来改变其内容。如用MOV R0,#30H;MOV R0,#40H等指令就可以改变R0中的数。这就使得MOV A,R0这一类指令的功能变得很灵活,可经常用作最方便的找数工具。相当于函数Y=(X)里的X,这个X可以变,则Y值也跟着变。(R0)就相当于(X)的作用。
④立即数#data,是写在程序里不可能再变的数,是死数或者说是常数,即固化在程序里的常数。例如MOV A,#50H,那么A所得到的数只能是十六进制数50H。
⑤寄存器间接寻址,标作@Ri,i包括0、1。也就是说,在R0及R1里存放的是数据地址,是一个活地址。这个地址根据程序可以随意更改,那意味着地址是可以改的。地址是活的,数就更活了,相当于f(x)中的变量x。例如在程序中写入一条寄存器间接寻址指令“MOV A,@R0”后,其功能是将R0的内容作为地址去取内存单元的数,再送入累加器A,即,A←(R0)。由于R0中的数是活数,因而(R0)就是活地址了。寄存器间接寻址指令MOV A,@R0的作用过程示意图如图2-23所示。图中的情况是执行MOV A,@R0指令前,R0中的内容是40H,执行此指令后,就将40H单元中的内容80H送入A。
2)内部数据传送指令规律。理解了上述情况后,可以分析出内部数据传送指令的规律如下:
首先,在使用内部数据传送指令的时候,除寄存器Rn和间接寻址@Ri外,所有的单元之间都可以传送数据(仅Rn与@Ri间不能传送数据)。
其次,#data只能送出数据,不能接收数据,它是死数,无法接收和改变,如图2-22中箭头所示(仅#data为单向传送常数)。
图2-23 寄存器间接寻址指令MOV A,@R0的作用过程示意图
a)指令执行前 b)指令执行后
最后,传送的数据都是8位,唯一一条16位数据传送指令是MOV DPTR,#data16,这条指令用来设计数据指针(DPTR)初值。DPTR是对外部存储器访问时的指针。例如外部访问、外部查表等。换句话说,DPTR本身也是一个内部存储器,由两个8位寄存器DPL和DPH组成。尽管PC也是16位的存储器,但是不能用MOV指令来改变它的值,而DPTR可以用MOV指令来赋值。
例如:将片内RAM的15H单元的内容0A7H送入55H单元。
请读者自行理解表2-9中指令的执行结果。
表2-9 传送指令及其结果举例
2.外部RAM数据传送指令及要点分析
(1)指令介绍
(2)要点分析
1)在MCS-51系列单片机中,与片外存储器RAM打交道的只可以是累加器A。所有片外RAM数据传送必须通过A进行。由前面讲述已知,片内RAM间可以直接进行数据的传递,而片外则不行。比如,要将片外RAM中2000H单元的数据送入2050H单元,必须先将2000H单元中的内容读入A,然后通过A再送到2050H单元中去。
2)要访问片外RAM,必须要知道RAM单元的16位地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,由于Ri(即R0或R1)是一个8位的寄存器,所以只能访问片外RAM低256个单元,即0000H~00FFH。
3)使用外部RAM数据传送指令时,应当首先将要读或写的地址送入DPTR或Ri中,然后再用读写命令。
例如:将外部RAM的0010H单元中的内容送入外部RAM的2000H单元中。(www.xing528.com)
程序段如下:
MOV R0,#10H
MOVX A,@R0
MOV DPTR,#2000H
MOVX @DPTR,A
3.程序存储器数据传送指令及要点分析
(1)指令介绍
本指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格。指令的源操作数采用变址寻址方式,以DPTR(PC)作为基址寄存器,A为变址寄存器,指令执行时将DPTR的内容(或PC当前值)与A中的数据相加形成新的地址,将该地址所指向的ROM中的数据取出并传送到累加器A中。
(2)要点分析
1)这两条指令是一字节指令,其寻址范围为64KB,指令首先执行16位无符号数的加法操作,获得基址与变址之和(低8位相加产生进位时,直接加到高位,并不影响标志),“和”作为程序存储器的地址,该地址中的内容送入A中。指令执行前后,A中的值不一定相同。
2)第二条指令与第一条指令相比,由于PC的内容不能通过数据传送指令来改变,而且随该指令在程序中的位置变化而变化,因此在使用时需对变址寄存器A进行修正。
例如:在片内20H单元有一个BCD数,用查表法获得相应的ASCII码,并将其送入21H单元。
其程序为[设当(20H)=07H时]:
指令“ADD A,#3”是为了‘绕过’指令“MOV 21H,A、RET”,使基址和变址相加的地址能正确地指向表格TAB中的相应字节。当TAB与MOVC指令之间有更多的指令时,应用相应的指令代码字节数修正变址寄存器A。一般采用PC作基址寄存器时,常数表与MOVC指令放在一起,称为近程查表。
当采用DPTR作基址寄存器时,TAB可以放64KB程序存储器空间的任何地址上,称为远程查表,不用考虑查表指令与表格之间的距离。程序如下:
4.堆栈操作指令及要点分析
(1)指令介绍 堆栈操作有进栈和出栈两种,相应指令如下:
第一条指令称为压入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。压入指令的执行过程是,首先将SP中的值加1,然后把SP中的值当做地址,将direct中的值送进以SP中的值为地址的RAM单元中。
例:执行中断服务子程序时,把数据指针(DPTR)、工作寄存器(R2)、程序状态字(PSW)和累加器(A)压入堆栈,进行现场保护执行入栈程序后的推栈示意图如图2-24所示。返回时将其弹出,恢复现场。执行程序段如下:
图2-24 执行入栈程序后的堆栈示意图
(2)要点分析
1)堆栈常用来保护现场,如果不用堆栈,比如说在PUSH ACC指令处用“MOV 55H,A”,在PUSH 02H处用指令“MOV 53H,R2H”,然后用“MOV A,55H和MOV R2,53H”来替代两条POP指令,那么结果上看是一样的,但是从过程看是不一样的。PUSH和POP指令都是单字节、单周期指令,而MOV指令则是双字节、双周期指令。另外,堆栈还有其他的作用,所以一般单片机上都设有堆栈。在编写子程序,需要保存数据时,通常也是用堆栈的方法来实现。
2)堆栈操作的特点是“先进后出”,在使用时注意指令顺序。
例如:分析以下程序的运行结果
MOV R2,#05H
MOV A,#01H
PUSH ACC
PUSH 02H
POP ACC
POP 02H
结果是R2=01H,而A=05H,即两者进行了数据交换。从这个例子可以看出:使用堆栈时,入栈的顺序和出栈的顺序必须相反,才能保证数据被送回原位,即恢复现场,否则就要出错。
5.数据交换指令
(1)字节交换指令
(2)半字节交换指令
(3)累加器A高低半字节交换指令
数据交换主要是内部RAM单元与累加器A之间进行。
例如:将片内RAM 60H单元与61H单元的数据交换。
不能用:XCH 60H,61H
应该写成:MOV A,60H
XCH A,61H
MOV 60H,A
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。