数据传送类指令

一、数据传送类指令

数据传送类指令是最基本、最重要、也是编程时使用得最频繁的一类指令。数据传送类指令是把源地址单元的内容传送到目的地址单元中去,而源地址单元中的内容不变;或者是源地址单元和目的地址单元中的内容互换。数据传送类指令除了可能通过累加器进行数据传送之外,还有不通过累加器而通过直接寻址和寄存器寻址方式直接进行数据传送的指令。传送类指令一般不影响标志位,只有堆栈操作可以直接修改程序状态字PSW。另外,目的操作数为A的指令将影响奇偶标志位P。

数据传送类指令用到的助记符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共8种。源操作数可以采用寄存器寻址、寄存器间接寻址、直接寻址、立即寻址以及变址寻址5种寻址方式;目的操作数可以采用前三种寻址方式。为了便于记忆和掌握,把29条传送指令分为5类,见表3-3。

(一)片内RAM传送指令(MOV)及举例(第1~第16条)

1.以累加器A为目的操作数的指令(第1~第4条)

【例3-1】将R7的内容传送至A。

MOV  A,R7

【例3-2】将R0所规定的内存单元50 H的内容传送至A。

MOV  R0,#50 H

MOV  A,@R0

【例3-3】将存储单元39H中的内容传送至A。

MOV  A,39 H

2.以工作寄存器Rn为目的操作数的指令(第5~第7条)

这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个寄存器。

【例3-4】以下指令依次完成将A中的内容传送至R1;40 H单元的内容传送至R3;立即数#80 H传送至R7。

MOV R1,A  ;R1←A

MOV R3,40H  ;R3←(40H)

MOV R7,#80H  ;R7←#80H

表3-3 MCS-51数据传送指令表

3.以直接地址为目的操作数的指令(第8~第12条)

这组指令的功能是把源操作数的内容送入直接地址所指的存储单元。源操作数有寄存器寻址、直接寻址和立即寻址等寻址方式。

【例3-5】以下指令分别完成将A的内容传送至30 H单元;R7的内容传送至20 H单元;立即数0FH传送至27 H单元;40 H单元内容传送至50 H单元:

MOV 30H,A  ;(30H)←A

MOV 20H,R7  ;(20H)←R7

MOV 27H,#0FH  ;(27H)←0FH

MOV 50H,40H  ;(50H)←(40H)

4.以间接地址为目的操作数的指令(第13~第15条)

这组指令的功能是把源操作数所指定的内容传送至以R0或R1为地址指针的片内RAM单元中。

源操作数有寄存器寻址,直接寻址和立即寻址3种方式;目的操作数为寄存器间接寻址。

【例3-6】可以用下面3条指令将40H单元的内容清0。

MOV A,#00H  ;将0赋给A

MOV R0,#40H  ;R0←40H,以R0作地址指针

MOV @R0,A  ;将R0指示的单元清0

5.16位数据传送指令(第16条)

这是唯一的16位立即数传送指令,其功能是把16位立即数传送至16位数据指针寄存器DPTR,执行的结果是把高位字节的立即数送给DPH,低位字节的立即数送给DPL。当要访问片外RAM或I/O端口时,这条指令一般用于给DPTR赋初值。

【例3-7】读入外部RAM 06CDH单元的内容至累加器A中。

MOV DPTR,#06CDH  ;DPTR←06CDH

MOVX A,@DPTR  ;A←(06CDH)

(二)累加器A与片外数据存储器传送的指令(MOVX)及举例(第17~第20条)

累加器A与片外数据存储器进行数据传送时,片外数据存储器单元是以Ri和DPTR为地址指针进行间接寻址的。片外数据存储器的低8位地址由Ri或DPL送P0口输出,高8位地址由DPH送P2口输出,地址和数据信息分时共用P0口。

MCS-51单片机访问片外RAM只能用寄存器间接寻址的方式,且仅有这4条指令。以DPTR间接寻址时,寻址的范围达64K字节;以Ri间接寻址时,仅能寻址低地址256字节的范围。而且片外RAM的数据只能和累加器A之间进行传送,不能与其他寄存器和片内RAM单元直接进行传送。寻址关系图如图3-6所示。

图3-6 外部数据存储器传送操作

MCS-51指令系统中没有设置访问外设的专用I/O指令,且片外扩展的I/O端口与片外RAM是统一编址的,因此对片外I/O端口的访问均应使用这4条指令。

【例3-8】现有一输入设备口地址为0D003H,假设这个口中已有数据80H,欲将此值存入片内30 H单元中,则可用以下指令完成:

MOV DPTR,#0D003H  ;DPTR←0D003H

MOVX A,@DPTR  ;A←(0D003H)

MOV 30H,A  ;(30H)←A

指令执行后30 H单元的内容为80 H。

【例3-9】把片外RAM 2000H单元中的内容传送至片外RAM 5000H单元中去,可用以下指令完成:

MOV DPTR,#2000H  ;DPTR←2000H

MOVX A,@DPTR  ;A←(2000H)

MOV DPTR,#5000H  ;DPTR←5000H

MOVX @DPTR,A  ;(5000H)←A

(三)读取程序存储器的指令(MOVC)及举例(第21~第22条)

MCS-51指令系统中,这是两条很有用的查表指令,其数据表格是放在程序存储器中。两条指令的区别:“MOVC A,@A+PC”查表的范围是指令所在地址以后256字节之内,故称为近程查表;“MOVC A,@A+DPTR”查表范围可达整个程序存储器64K字节的地址空间,故称为远程查表,如图3-7所示。累加器A的内容是一个8位无符号数。

图3-7 查表指令的查表范围

CPU读取单字节指令“MOVC A,@A+PC”后,PC的内容先自动加1,然后将新的PC内容与累加器A中的8位无符号数相加形成地址,再取出该单元中的内容送累加器A。

【例3-10】在程序存储器中存有LED显示器0~9的字型段码,如图3-8所示。从字型表中查表获得‘2’的字型段码的程序如下:

5200H: MOV A,#09H  ;A←09H偏移量

5202H: MOV A,@A+PC  ;A←(5203H+09H)=(520CH)

5203H: MOVX @DPTR,A  ;输出显示端口地址已放在DPTR中

图3-8 程序存储器中的LED显示字型段码表

当CPU读取“MOV A,@A+PC”后,PC指针的内容为5203H,与‘2’的字型段码所在地址520CH有9个单元的偏移量,因此要首先将偏移量9送到A中。

上面程序的执行结果:A=0A4H,PC=5204H,字符‘2’的段码送显示端口。

“MOVC A,@A+DPTR”指令以DPTR为基址寄存器进行查表。使用前一般将表格首地址赋给DPTR,表格可任意放在程序存储器64K字节空间范围内。

【例3-11】在程序存储器5000 H开始的单元中存放有0~9的ASCII码,如图3-9所示。将‘3’的ASCII码取出的程序如下:

1000H: MOV A,#03H  ;将3赋给A

1002H: MOV DPTR,#5000H ;将ASCII码表的基地址赋给DPTR

1005H: MOVC A,@A+DPTR ;找到3的ASCII码的存放地址,将该地址单元的内容赋给A

执行结果:A=33H,PC=1006 H。

图3-9 程序存储器中的ASCII码表

(四)交换指令(XCH,XCHD,SWAP)及举例(第23~第27条)

这组指令的前三条为全字节交换指令,其功能是将A的内容与源操作数互换。后两条指令为半字节交换指令,其中XCHD A,@Ri是将A内容的低4位与Ri间接寻址的片内RAM单元中的低4位数据互相交换,各自的高4位不变。SWAP A指令是将A中的高、低4位数据互相交换。

【例3-12】将40 H单元的内容与A中的内容互换,然后将A的高4位存入由R0或R1间接寻址的RAM存储单元中的低4位,A的低4位存入该单元的高4位。

XCH A,40H  ;A↔(40H)

SWAP A  ;A7~A4↔A3~A0,将A中高4位和低4位交换

MOV @Ri,A  ;A的值存入由R0或R1间接寻址的存储单元

从上述传送类指令可知,A是一个特别重要的寄存器,无论A作目的操作数还是作源操作数,CPU对它都有专用指令。A的字节地址为0E0H,也可以采用直接地址来寻址。例如用MOV A,Rn的指令,也可以用MOV 0E0H,Rn,执行结果都是将Rn的内容传送至A中。但后一指令要多一个字节,执行周期需二个机器周期。对工作寄存器Rn也有类似特点。

(五)堆栈操作指令(PUSH,POP)(第28~第29条)

PUSH direct  ;SP←SP+1,(SP)←(direct)

POP direct  ;(direct)←(SP),SP←SP-1

PUSH指令是入栈(或称压栈或进栈)指令,其功能是先将堆栈指针SP的内容加1,然后将直接寻址单元中的数压入到SP所指示的单元中。POP是出栈(或称弹出)指令,其功能是先将堆栈指针SP所指示的单元内容弹出送到直接寻址单元中,然后将SP的内容减1,SP仍指向栈顶。

系统复位或上电时SP的值为07 H,程序中使用堆栈时,也可以先给SP另外设置初值。但应注意不要超出堆栈的深度(堆栈范围)。

【例3-13】将片外3500H单元中的内容压入堆栈,然后弹出到40 H单元中。用如下指令完成:

MOV SP,#60H  ;设立堆栈指针初值

MOV DPTR,#3500H

MOVX A,@DPTR  ;将片外3500H单元的内容赋给A

PUSH ACC  ;SP=SP+1=61H,A中内容入栈

POP 40H  ;从堆栈中把原A中内容弹出到40H单元,SP=SP-1=60H

当然要完成将片外RAM中的数据传送至片内RAM单元可以使用其他传送指令完成,此程序只是为了说明PUSH和POP的使用方法。