



数据传送指令共有 29 条,其一般格式为:
数据传送指令一般的操作是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数。如果要求在进行数据传送时,目的操作数不丢失,则不能用直接传送指令,而采用交换型的数据传送指令,数据传送指令不影响标志CY,AC和OV,但可能会对奇偶标志P有影响。
内部RAM的数据传送类指令共 16 条,包括累加器、寄存器、特殊功能寄存器、RAM单元之间的相互数据传送。这类指令,数据的传送始终在单片机内部的RAM中。助记符有MOV、PUSH、POP、XCH、XCHD、SWAP等 6 种,如表 3-2 所示。MCS-51单片机片内数据传送途径如图 3-8 所示。
图 3-8 MCS-51单片机片内数据传送
1.以DPTR为目的操作数的数据传送指令(1 条)
指令格式:
这组指令的功能是将外部存储器某单元地址送到数据指针寄存器DPTR中,即把一个16 位常数送入DPTR,这是整个指令系统中唯一的一条 16 位数据的传送指令,用来设置地址指针。地址指针DPTR由DPH和DPL组成。这条指令的执行结果是把高 8 位立即数送入DPH,低8位立即数送入DPL。
例如:执行指令MOV DPTR,#2000H后,
结果为:(DPTR)= 2000H
例如:执行指令MOV DPTR,#2233H
结果为:DPTR=2233H,即(DPH)=22H,(DPL)=33H。
2.以累加器A为目的操作数的数据传送指令(4 条)
指令格式:
这组指令的功能是将原操作数所指定的内容送入累加器A中。源操作数可以采用立即寻址、直接寻址、寄存器寻址和寄存器间接寻址4种寻址方式。
例如:已知PSW=00H,(00H)=20H
则执行指令MOV A,R0
结果为:A=(R0)=(00H)=20H。
例如:已知(20H)=30H
则执行指令MOV A,20H
结果为:A=(20H)=30H。
表 3-2 片内RAM数据传送类指令
续表
例如:已知PSW=00H,(00H)=20H,(20H)=30H
则执行指令MOVA,@R0
结果为:A=(20H)=30H。
例如:执行指令MOV A,#20H
结果为:A=(E0H)=20H。
3.以寄存器Rn为目的操作数的数据传送指令(3 条)
指令格式:
这组指令的功能是将源操作数所指定的内容送到当前工作寄存器组R0~R7 中的某个寄存器中。源操作数可以采用寄存器寻址、立即寻址和直接寻址。
注意 :没有“MOVRnRn”指令,也没有“MOVRn,@Ri”指令。
例如:已知PSW=00H,A=11H,(20H)=22H,则执行下列指令
结果为:R0=(00H)=11H,R1=(01H)=22H,R2=(02H)=33H。
4.以直接地址(direct)为目的操作数的数据传送指令(5 条)
指令格式:
这组指令的功能是将源操作数所指定的内容送入由直接地址direct所指定的片内存储单元。源操作数可以采用寄存器寻址、立即寻址、直接寻址和寄存器间接寻址。
例如:已知PSW = 00H,A=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,则执行下列指令
结果为:(30H)=11H,(31H)=22H,(32H)=44H,(34H)=33H,(35H)=55H
注意 :“MOV direct1,direct2”指令在译成机器码时,源地址在前,目的地址在后。
5.以间接地址@ Ri为目的操作数的数据传送指令(3条)
指令格式:
这组指令的功能是把源操作数所指定的内容送入以R0 或R1 为地址指针的片内RAM单元中。源操作数可以采用寄存器寻址、立即寻址和直接寻址3种方式。
注意 :没有“MOV @Ri,Rn”指令。
例如:已知PSW = 10H,(E0H)= 11H,(20H)=22H,(10H)=30H,(11H)=31H,则执行下列指令
结果为:(30H)=11H,(31H)=22H。
6.片内RAM数据传送类指令
如图3-9和图3-10所示是片内RAM数据传送类指令和交换指令,包括了全部片内数据传送类指令。根据这两张图可以很快地写出表 3-2 中的所有指令。这里主要是提供一种快速记忆指令的方法,记住了图解图,也就记住了指令表。
在使用上述命令时,需注意以下 3 点:
(1)要区分各种寻址方式的含义,正确传送数据。
例如:若(R0)=30H,(30H)=50H时,注意以下指令的执行结果:
(2)所有传送指令都不影响标志位,这里所说的标志位是指CY、AC和OV。涉及累加器A的将影响奇偶标志位P。
图 3-10 片内RAM数据交换指令
(3)估算指令的字节数,凡是指令中既不包含直接地址,又不包含 8 位立即数的指令均为一字节指令;若指令中包含一个直接地址或 8 位立即数,指令字节数为 2,若包含两个这样的操作数,则指令字节数为 3。如:
上面所介绍的片内RAM数据传送类指令,单元地址和单元里的内容都是8位二进制数,很容易混淆。而这里所要介绍的ROM和片外RAM数据传送类指令,单元地址是16位二进制数,单元里的内容是8位二进制数。寻址范围为两个64K,一个是程序存储器ROM区域的 64K(地址范围 0000H~FFFFH),另一个是片外数据存储器RAM区域的 64K(地址范围 0000H~FFFFH)。指令一共 6 条,助记符有MOVC和MOVX,如表 3-3 所示。
表 3-3 ROM和片外RAM数据传送类指令
这组指令中,DPTR所包含的16 位地址信息由P0(低8位)和P2(高8位)输出,而数据信息由P0 口传送,P0 口作分时复用的总线。由Ri作为间接寻址寄存器时,使用Ri(8位)作地址指针,能访问外部数据RAM的00H~FFH 256个单元,P0口上分时输出Ri指定的8位地址信息及传输8位数据。前两条指令执行时,P3.7引脚上输出RD有效信号,用作外部数据存储器的读选通信号;后两条指令执行时,P3.6引脚上输出WR有效信号,用作外部数据存储器的写选通信号。
1.针对片外RAM的数据传送指令(4 条)
累加器A来传送。这类指令共有 4 条如下:
指令格式:
CPU与外部RAM或I/O口进行数据传送,必须采用寄存器间接寻址的方法,并通过
前两条指令为“读”片外RAM数据指令。执行时伴随ALE信号和RD信号有效;后两条指令为“写”片外RAM数据指令。执行时伴随ALE信号和WR信号有效。
其中第一条和第三条指令是以DPTR作为间址寄存器,其功能是将R0或R1所指定的外部RAM单元与累加器A之间传送数据。由于DPTR是16位地址指针,因此这两条指令的寻址范围可达片外RAM64KB全部空间。而第二条与第四条指令是以R0或R1作为间址寄存器,其功能是将R0 或R1 所指定的外部RAM单元与累加器A之间传送数据。由于R0 或R1 是 8 位地址指针,因此这两条指令的寻址范围仅限于外部RAM 256 个字节单元。
例如:已知DPTR=2000H,片外RAM(2000H)=20H,则
执行指令MOVX A,@DPTR
结果:A = 20H。
例如:已知P2=20H,R0=30H,片外RAM(2030H)=88H,则
执行指令MOVX A,@R0
结果:A = 88H。
例如:已知DPTR=2000H。片外A=20H,则
执行指令MOVX @DPTR,A
结果:片外RAM 2000H单元内容为 20H。
例如:已知P2=20H,R1=30H,A=33H,则
执行指令MOVX @R1,A
结果:片外RAM 2030H单元内容为 33H。
注意 :指令中寄存器Ri、DPTR的内容为片外RAM单元的地址,传送的是该片外RAM单元的内容;MCS-51系列单片机其I/O端口是与片外RAM统一编址的,没有专门的输入输出指令,用MOV X指令可实现对I/O端口的访问,变成输入输出指令。
2. ROM和片外数据RAM传送类指令图解
如图 3-11 所示是程序存储器传送类指令的图解,包含有两条指令;如图 3-12 所示是片外数据存储器传送类指令图解,包含有四条指令。
图 3-11 ROM数据传送指令
图 3-12 片外RAM数据传送指令
这里所说的程序存储器既包括片内程序存储器,也包括片外程序存储器。由于对程序存储器只能读而不能写,因此其数据传送是单向的,即只能从程序存储器读数据,并送到累加器A中。这类指令有以下两条,指令操作码助记符标志为MOVC。
指令格式:
这组指令以PC(或DPTR)作基址寄存器,累加器A的内容作为无符号整数和PC(或DPTR)的内容相加后得到一个 16 位的地址,把由该地址指出的程序存储单元的内容送到累加器A。特别需要注意的是PC的内容是指该条指令执行后的下一条指令的PC值。
例如:已知(A)=30H,执行地址 1000H处的指令
该指令为单字节指令,本身占用一个单元,下一条指令的地址为 1001H,(PC)= 1001H再加上A中的 30H,得 1031H,结果为将程序存储器 1031H中的内容送入A。
例如:已知(A)=30H,(DPTR)=3000H,程序存储器单元(3030H)=50H,执行指令MOVC A,@ A+DPTR
结果为:(A)=50H。
这两条指令常用于查表操作,可用来查找存放在外部程序存储器中的常数表格。上述
第一条指令的优点是不改变特殊功能寄存器和PC的状态,只要根据A的内容就可以取出表格中的常数。缺点是表格只能放在该条查表指令后面的 256 个单元之中(由A的内容决定),表格的大小受到限制,而且表格只能被一段程序所利用。
第二条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关,因此,表格的大小和位置可以在64KB程序存储器中任意安排(因DPTR能提供16位地址),并且一个表格可以为各个程序块所共用。
【 例3-1 】在外部ROM/EPROM中,从2000H单元开始依次存放0~9的平方值:0、1、4、9、...、81,要求依据累加器A中的值(0~9)来查找所对应的平方值,分析下述程序的结果。
解:
执行结果:(DPTR)=2000H,(A)=51H(81 的十六进制数)。
【 例3-2 】仍以例3-1 外部ROM2000H单元开始存放0~9的平方值,以PC作为基址寄存器进行查表。
解: 设MOVC指令所在地址(PC)=1FF0H,则
偏移量= 2000H -(1FF0H+1)= 0FH
相应的程序如下:
执行结果:(PC)=1FF1H,(A)=51H
注意 :外部RAM只能通过累加器A进行数据传送;累加器A与外部RAM之间传送数据时只能间接寻址方式,间接寻址寄存器为DPTR,R0,R1;以上传送指令结果通常影响程序状态字寄存器PSW的P标志。
【 例3-3 】把外部数据存储器2040H单元中的数据传送到外部数据存储器2560H单元中去。
解:
例如:已知A=20H,DPTR=2000H,(2020H)=30H,则
结果:A=30H,即程序存储器 2020H单元内容被送到累加器A,而累加器A原来的内容被覆盖。
例如:已知A=20H,指令操作码所在的地址为 2000H,(2020H)=33H,(2021H)=66H,则
执行指令:
结果:A=66H。
这两条指令的主要用途是编写查表程序,数据表可事先存入程序存储器的某个固定区域。示例如下:
【 例3-4 】已知在程序存储器 2000H开始的连续 10 个单元中,分别存有 0~9 的平方值。累加器A中存有0~9中的某个数。试列出查表程序。
解:
说明:若A原来的值是 0,则程序执行后,A=(0+2000)=(2000H)。
若A原来的值是1,则程序执行后,A=(1+2000)=(2001H)。
…
若A原来的值是 9,则程序执行后,A=(9+2000)=(2009H)。
交换指令实现两操作数之间数据的双向传送,两操作数互为源地址与目的地址,指令执行后,两操作数的内容互换,交换指令共有5条,均以累加器为一方。
1.字节交换指令(3 条)
指令格式:
例如:已知A=11H,R7=22H,执行指令XCH A,R7
结果:A=22H,R7=11H。
例如:已知A=11H,(20H)=22H,执行指令XCH A,20H
结果:A=22H,(20H)=11H。
例如:已知PSW=00H,(00H)=20H,(20H)=33HA = 22H,执行指令XCHA,@R0
结果:A=33H,(20H)=22H。
2.半字节交换指令(1 条)
指令格式:
例如:已知PSW=00H,(00H)=20H,(20H)=33H,A=22H,执行指令XCHDA,@R0
结果:A=23H,(20H)=32H。
3.自交换指令(1 条)
指令格式:
例如:已知A=12H,执行指令SWAP A
结果:A=21H。
片内RAM的某一区域可作为堆栈使用,以保存与恢复现场。用栈顶指针寄存器SP指出堆栈的目前操作位置,堆栈操作指令有2条,进栈指令与出栈指令,堆栈遵守先进后出的原则。
说明指令功能前,首先弄清以下几个概念。
(1)什么叫堆栈:就是按“先进后出”原则组织起来,用以堆放数据的内存区域。MCS-51单片机的堆栈建在内部RAM中,默认的栈底为07H单元。
(2)如何建立堆栈:原则上可以用指令MOV SP,#data在单片机内存区域自由建立堆栈。但一般应避开工作寄存器组区(00H~1FH)、位寻址区(20H~2FH)和特殊寄存器区(80H~FFH)。因此,最好建在 30H~7FH的有限区域内。
(3)堆栈指针SP、栈底和栈顶:单片机复位或上电时堆栈指针SP的初始值为 07H,即单片机自动建立了一个以 07H单元作为栈底的栈区。当堆栈中没有数据时栈底也就是栈顶,以后每执行一次进栈操作,将有一个数据进入堆栈,堆栈指针SP自动加1 指向上一个单元。反之,每执行一次出栈操作,将有一个数据弹出堆栈,堆栈指针SP自动减1 指向下一个单元。堆栈指针SP始终指向堆栈的顶部,就好像水池里的“浮球”随着水位的变化自由地上下移动。
1.进栈指令
指令格式:
指令执行的过程为:SP←SP+1和(SP)←(direct)。
例如:PUSH 30H;(30H)=2BH试描述该指令操作。
具体操作是:先将堆栈指针SP的内容(0FH)加 1,指向堆栈顶的一个空单元,此时SP=10H;然后将指令指定的直接寻址单元30H中的数据(2BH)送到该空单元中。入栈操作示意图如图 3-13 所示。
图 3-13 入栈操作示意图
2.出栈指令
指令格式:
指令执行的操作为:(direct)←(SP);SP←SP-1。
例如:POP 40H;(40H)=4CH试描述该指令操作。
具体操作是:先将SP所指单元0FH(栈顶地址)中的数据(4CH)弹出,送到指定的内RAM单元40H,(40H)=4CH;然后SP-1→SP,SP=0EH,SP仍指向栈顶地址。出栈操作示意图如图3-14所示。
图 3-14 出栈操作示意图
3.综合示例
【 例3-5 】若在外部ROM/EPROM中2000H单元开始依次存放0~9的平方值,数据指针(DPTR)=3A00H,用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。完成以上功能的程序。
解: 该程序如下:
【 例3-6 】将片内RAM30H单元与40H单元中的内容互换。
解:
方法1(直接地址传送法):
方法 2(间接地址传送法):
方法 3(字节交换传送法):
方法 4(堆栈传送法):