首页 理论教育 数据传送类指令-单片微机原理及接口技术

数据传送类指令-单片微机原理及接口技术

时间:2023-11-02 理论教育 版权反馈
【摘要】:数据传送类指令有29条,是使用最频繁的一类指令。数据传送指令不会影响进位标志C、半进位标志AC和溢出标志OV。MOV DPTR,#data16是唯一的一条16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。

数据传送类指令-单片微机原理及接口技术

数据传送类指令有29条,是使用最频繁的一类指令。指令的操作功能是把源操作数传送到目的操作数(地址或寄存器)中。指令执行后,目的操作数改为源操作数(即被源操作数覆盖),源操作数保持不变,即属于“复制”性质,而不是“搬家”。如果希望指令执行后目的操作数和源操作数都能保留,则可以使用交换型指令。

数据传送指令不会影响进位标志C、半进位标志AC和溢出标志OV。但数据传送改变累加器A的同时,将影响奇偶标志P和Z。

指令格式:MOV<目的操作数>,<源操作数>

1.以累加器A为目的操作数的指令

这组指令有如下4条:

这组指令的功能是把源操作数(8位数)传送到累加器A中,源操作数传送时可以使用立即数寻址、直接寻址、寄存器寻址和寄存器间接寻址方式。例如:

2.以工作寄存器Rn为目的操作数的指令

这组指令有如下3条:

这组指令的功能是把源操作数的内容送入当前工作寄存器区(R0~R7)的某一个寄存器中。但在片内RAM中有4组Rn,选择哪一组Rn需要由PSW的RS1和RS0的设置而定。例如:

3.以直接地址direct为目的操作数的指令

这组指令有如下5条:

这组指令的功能是把源操作数送入直接地址指出的存储单元。direct指的是内部RAM(地址范围00H~7FH)或SFR寄存器(地址范围80H~FFH),可以实现片内RAM之间、SFR特殊寄存器之间、SFR与片内RAM之间直接传送数据。数据直接传送不需要通过累加器A或者使用Ri工作寄存器来间接寻址,从而提高了数据传送效率(但是访问52子系列单片机片内的高128个单元(地址范围80H~FFH)时,不能使用直接寻址传送数据,而必须通过累加器A和Ri来间接寻址进行数据传送)。例如:

另外,SFR特殊功能寄存器区的地址范围为80H~FFH,对应于51子系列单片机只定义了18个专用寄存器,共占21个地址单元;52子系列单片机只定义了22个专用寄存器,共占26个地址单元,其他地址单元没有定义。因此,访问SFR区中没有定义的单元地址是没有意义的。例如:

4.以寄存器间接地址为目的操作数的指令

这组指令有如下3条:

这组指令的功能是把源操作数传送到以Ri的内容作为地址的片内RAM单元中(即Ri作指针)。间接寻址方式可以访问片内RAM的低128个单元(00H~7FH)和高128个单元(80H~FFH),但不能用于访问SFR特殊功能寄存器。

【例3-3】 假设单片机片内RAM单元(40H)=30H,(30H)=20H,(20H)=10H,(P1)=5AH,分析下面一段程序执行后各单元及寄存器的内容是什么?

上述指令执行后,自下向上得出的最后结果为(P1)=1FH,(40H)=5AH,(30H)=20H,(20H)=1FH,(A)=10H,(B)=10H,(R0)=20H,(R1)=40H,(P2)=5AH。

5.外部数据存储器传送指令

这组指令有如下5条:

这组指令的功能是访问外部扩展的RAM存储器或I/O端口。STC单片机对外部扩展的RAM存储器或I/O端口进行数据传送时,必须使用寄存器间接寻址。间接寻址寄存器可以是DPTR、R0和R1,由累加器A作为数据中转,每次传送一字节数据。数据传送实际要通过P0、P2口来完成,即片外地址总线的低8位由P0口送出,高8位由P2口送出,数据由数据总线P0口传送(P0口分时复用,是双向口)。

MOV DPTR,#data16是唯一的一条16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。采用16位寄存器DPTR做间接寻址时,高8位地址(DPH)由P2口输出,低8位地址(DPL)由P0口输出,最大可寻址64KB片外数据存储器。例如:

采用工作寄存器R0或R1做间接寻址时,R0或R1存储低8位地址,8位地址和数据均由P0口传送,因此最大可寻址片外256B的数据存储器。当扩展的外部RAM空间不大(在256个单元以内)时,可以直接使用R0或R1做间接寻址。例如:

如果使用R0或R1间接寻址大于8位的外部RAM地址,也可选用P2口输出高8位的地址,低8位地址由R0或R1暂存,这样由P2 R0或P2 R1也可组成16位外部RAM寻址。例如,要读取外部2010H单元的内容,可采用以下指令:

用MOVX指令访问外部数据存储器单元,指令执行时,将从P3口输出WR、RD信号。对外部数据存储器单元读操作时,RD(P3.7)读信号有效;对外部数据存储器单元写操作时,WR(P3.6)写信号有效。

6.程序存储器数据表格传送指令

程序存储器数据表格只能读取到A,共有2条指令,又称为查表指令。它采取基址加变址的方式,把程序存储器中的数据表格读出来,并传送到累加器A中。指令形式如下:

指令的功能是把基址寄存器(PC、DPTR)的内容与变址寄存器A的内容进行16位无符号数的加法操作,得到程序存储器内的一个地址,把该地址单元中的内容读出并送到A。指令执行后,DPTR的内容保持不变,PC=(PC)+1。

以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加后得到一个16位的地址,把该地址指出的程序存储器单元的内容送到累加器A中。

【例3-4】 设(DPTR)=2100H,(A)=07H,分析下面程序段的结果:(www.xing528.com)

因此,MOVC A,@A+DPTR指令的执行结果只与指针DPTR和累加器A的内容有关,与该指令存储的地址及常数表格存储的地址无关,所以表格的大小和位置可以在64K程序存储器中任意安排,各个程序块可以共用一个表格。

对于MOVC A,@A+PC指令,是以PC作为基址寄存器,CPU在程序存储器取出该指令的操作码时PC会自动加1,指向下一条指令的首地址。因此,执行该指令时,当前的PC值已经增加了1,然后计算目的地址=(A)+(DPTR),即把A中的无符号整数与当前PC中的内容相加后得到一个16位的地址,把该地址指出的程序存储器单元的内容送到累加器A中。

另外,由于累加器A中的内容为单字节,最大值为255,使得该指令查表范围只能在PC+0~PC+255之间,即以当前PC值开始的256字节范围内,表格地址空间分配受到了限制。而且,编程时还需要进行偏移量的计算,偏移量是指MOVC A,@A+PC指令所在的下一条指令地址与存储表格的首地址之间相差的字节数,并且要用一条加法指令将偏移量加到A中进行地址调整。偏移量的计算公式为

偏移量=表格首地址-(MOVC指令所在地址+1)

【例3-5】 将0~9对应的平方值作表格,查表求04的平方值,分析下面程序段的结果:

以上程序段中,数据表格首地址为1038H,MOVC指令所在地址为1034H,因此根据计算公式得偏移量为03H,MOVC指令执行后,结果为(PC)=1035H,(A)=10H。

MOVC A,@A+PC指令的优点是不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数;缺点是表格只能存储在该条查表指令后面的256个单元之内,表格的大小受到限制,且表格只能被一段程序所利用。

以上两条指令是在MOV的后面加C,“C”是CODE的第一个字母,即代码的意思。MOVC指令执行时,要对((A)+(PC))指出的程序存储器地址单元的内容进行读操作。

7.堆栈操作指令

在STC单片机内部RAM中可以设定一个后进先出(Last In First Out,LIFO)的区域,称作堆栈,堆栈的栈顶位置由堆栈指针SP指出。堆栈操作有进栈和出栈操作,即压入数据和弹出数据,常用于保存数据或恢复现场。堆栈操作有如下2条指令:

(1)进栈指令PUSH direct

进栈操作时包含两个步骤:先将堆栈指针SP加1,即(SP)+1→SP;然后把direct中的内容送到堆栈指针SP指示的内部RAM单元中,即(direct)→((SP))。

【例3-6】当(SP)=6FH,(A)=30H,(B)=5CH,(40H)=9FH时,执行以下指令:

指令执行的最后结果为(70H)=30H,(71H)=5CH,(72H)=9FH,(SP)=72H。

(2)出栈指令POP direct

出栈操作时也包含两个步骤:先将堆栈指针SP指示的内部RAM单元中的内容送到di-rect地址,即((SP))→direct;然后把堆栈指针SP减1,即(SP)-1→SP。

【例3-7】 当(70H)=30H,(71H)=1CH,(72H)=9FH,(SP)=72H时,执行以下指令:

指令执行的最后结果为(30H)=9FH,(DPTR)=1C30H,(SP)=6FH。

【例3-8】 设在程序存储器的0600H开始的地址单元依次存储了一段表格数据,数据指针(DPTR)=12F0H,要求用查表指令取出0605H单元的数据,查表后DPTR的内容不变。分析下面程序:

程序执行结果:(A)=66H,(DPTR)=12F0H。可见,虽然在程序中改变了DPTR的内容,但利用PUSH和POP指令可对其进行保护和恢复。

8.数据交换指令

这组指令有如下5条:

这组指令中,前3条是字节交换指令,其指令功能是将源操作数的内容与累加器A的内容相互交换。源操作数可以使用直接寻址、寄存器寻址和寄存器间接寻址。

第4条是半字节交换指令,指令功能是将累加器A的低4位数与寄存器间址单元的低4位数相互交换,而各自的高4位数保持不变。

第5条是累加器半字节交换指令,指令功能是将累加器A中的低4位(低半字节)与高4位(高半字节)进行交换。

有了这些交换指令,使单片机处理数据更加高效、快捷,且保证数据的稳定可靠。

【例3-9】 设(A)=60H,(R5)=32H,(40H)=57H,(R0)=40H,分析下列指令执行结果:

因此,指令执行的最后结果为(A)=26H,(R5)=57H,(40H)=30H,(R0)=40H。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈