数据传送类指令是编程时使用最频繁的一类指令。一般数据传送类指令的助记符为“MOV”,通用的格式如下:
MOV,数据传送类指令是把源操作数传送到目的操作数。指令执行后,源操作数不改变,目的操作数修改为源操作数。所以数据传送类操作属“复制”性质,而不是“搬家”。
数据传送类指令不影响标志位,这里所说的标志位是指Cy、Ac和OV,但不包括检验累加器奇偶标志位P。
1.以累加器为目的操作数的指令
这组指令的功能是把源操作数的内容送人累加器A,源操作数有寄存器寻址、直接寻址、间接寻址和立即数寻址等方式,例如指令:
2.以Rn为目的操作数的指令
这组指令的功能是把源操作数的内容送入当前工作寄存器区的RO~R7中的某一个寄存器。
3.以直接地址direct为目的操作数的指令
这组指令的功能是把源操作数送入直接地址指定的存储单元。direct指的是内部RAM或SFR地址。
4.以寄存器间接地址为目的操作数的指令
这组指令的功能是把源操作数内容送入RO或Rl指定的存储单元中。
5. 16位数传送指令
这条指令的功能是把16位立即数送入DPTR,用来设置数据存储器的地址指针。AT89S51中设有两个DPTR,通过设置特殊功能寄存器AUXR1中的DPS位来选择。当DPS-I,则指令中的DPTR即为DPTR1,DPTRO被屏蔽,反之亦然。DPTR既是一个16位的数据指针,又可分为DPH和DPL两个8位寄存器进行操作,十分灵活、方便。设有两个DPTR后,可避免频繁地出入堆栈操作。
对于所有MOV类指令,累加器A是一个特别重要的8位寄存器,CPU对它具有其他寄存器所没有的操作指令。后面将要介绍的加、减、乘、除指令都是以A作为目的操作数的。Rn为CPU当前所选择的寄存器组中的RO~R7,直接地址指定的存储单元为内部RAM的OOH~7FH和特殊功能寄存器(地址范围为80H~FFH)。在间接地址中,用RO或Rl作为内部RAM的地址指针,可访问内部RAM的OOH~7FH共128个单元。
6.堆栈操作指令
在AT89S51的内部RAM中可以设定一个后进先出(LIFO,Last In First Out)的区域,称为堆栈。在特殊功能寄存器中有一个堆栈指针SP,它指定堆栈的栈顶位置。堆栈操作有进栈和出栈两种,因此,在指令系统中相应有两条堆栈操作指令。
(1)进栈指令
这条指令的功能是,首先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示的内都RAM单元中。
例如,当(SP)=60H,(A)=30H,(B)=70H时,执行下列指令
结果为(61H)=30H,(62H)=70H,(SP)=62H。
(2)出栈指令
这条指令的功能是,将栈指针SP指示的栈顶(内部RAM单元)内容送入direct字节单元中,栈指针SP减1。
例如,当(SP)=62H,(62H)=70H,(61H)=30H时,执行下列指令:
结果为(DPTR)=7030H,(SP)=60H。
7.累加器A与外部数据存储器RAM/IO传送指令
上述4条指令的助记符是在MOV的后面加“X”,“X”表示AT89S51单片机访问的是片外RAM存储器或I/O口,是读外部RAM存储器或I/O口中的一个字节的数据到累加器A中,或将累加器A中的一个字节的数据写入外部RAM存储器或I/O口中。所以在执行前两条指令时,RD(的反)(P3.7)有效;执行后两条指令时,WR(P3.6)有效。
采用16位的DPTR进行间接寻址,可寻址整个64KB片外数据存储器空间,高8位地址(DPH)由P2口输出,低8位地址(DPL)由PO口输出。
采用Ri(i=0.1)进行间接寻址,可寻址片外256个单元的数据存储器。8位地址由PO口输出,锁存在地址锁存器中,然后PO口再作为8位数据口。
8.查表指令
这类指令共两条,均为单字节指令,这是AT89S51指令系统中仅有的两条读程序存储器中表格数据的指令。由于对程序存储器只能读不能写,因此其数据的传送都是单向的,即从程序存储器中读出数据到累加器中。两条查表指令均采用基址寄存器加变址寄存器间接寻址方式。
这条指令以PC作为基址寄存器,A的内容作为无符号整数和PC的当前值(下一条指令的起始地址)相加后得到一个新的16位地址,把该地址指定的程序存储单元的内容送到累加器A。
例如:当(A)=30H时,执行地址1000H处的指令
该指令占用一个字节,下一条指令的地址为1001H,(PC)=1001H再加上A中的30H,得1031H,结果是将程序存储器中1031H的内容送入累加器A。
这条指令的优点是不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点是表格只能存放在该条查表指令所在地址的+256个单元之内,表格的大小受到限制,而且表格只能被一段程序所利用。
这条指令以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位地址,把由该地址指定的程序存储器单元的内容送到累加器A。
例如:(DPTR)=8100H,(A)=40H,执行指令
结果是将程序存储器中8140H单元内容送入累加器A中。
这条查表指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64KB程序存储器空间中任意安排,一个表格可以为各个程序块公用。
上述两条指令的助记符都是在MOV的后面加“C”,“C”是CODE的第一个字母,即表示程序存储器中的代码。执行上述两条指令时,单片机的PSEN引脚信号(程序存储器读)有效。
9.字节交换指令
这组指令的功能是将累加器A的内容和源操作数的内容相互交换。源操作数有寄存器寻址、直接寻址和寄存器间接寻址等方式。例如:
执行下列指令:
结果为(A)=OFH,(R7)=80H,(40H)=08H,(30H)=FOH。
10.半字节交换指令
这条指令的功能是,累加器的低4位与内部RAM低4位交换。例如:(RO)=60H,(60H)=3EH,(A)=59H,执行完“XCHD A,@RO”指令,则(A)=5EH,(60H)=39H。