2.5 数据传送类指令
CPU在进行算术和逻辑运算时,总需要有操作数。所以,数据的传送是一种最基本、最主要的操作。在通常的应用程序中,传送指令占有很大的比例。MCS-51单片机为用户提供了极其丰富的数据传送指令,功能很强。所谓传送是把源地址单元的内容传送到目的地址单元中,而源地址单元内容不变,或者源、目的单元的内容互换。
数据传送类指令是编程时使用最频繁的一类指令。一般数据传送类指令的助记符为“MOV”,通用格式如下:
MOV [目的操作数],[源操作数]
数据传送类指令不影响标志位,这里所说的标志位是指CY、AC、OV,但不包括检验累加器的奇偶标志位P。
1.以累加器为目的操作数的指令
这组指令的功能是把源操作数的内容送入累加器A,源操作数的内容不变。源操作数可以是寄存器、直接地址、间接地址和立即数,如指令
2.以Rn为目的操作数的指令
这组指令的功能是把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个工作寄存器。
例如,当(A)=42H时,执行指令MOV R0,A后,R0的内容为42H。
3.以直接地址direct为目的操作数的指令
这组指令的功能是把源操作数的内容送入直接地址单元。direct指的是内部RAM或SFR地址。
例如,当(43H)=12 H时,执行指令MOV 20H,43H后,20 H单元的内容为12 H。
4.以寄存器间接地址为目的操作数的指令
这组指令的功能是把源操作数内容送入R0或R1指定的存储单元。
例如,假设(A)=12H,(R0)=30H,执行指令MOV@R0,A后,结果为RAM中的(30H)=12H。MOV@R0,A在该条件下相当于MOV 30H,A。
MOV指令在片内存储器的操作功能如图2-18所示。
图2-18 MOV指令在片内存储器的操作功能
5.十六位数据传送指令
这是唯一的16位立即数传送指令,其功能是把16位常数送入DPTR。DPTR由DPH和DPL组成。这条指令执行的结果是,将高8位立即数data H送入DPH,低8位立即数data L送入DPL。在译成机器码时,高位字节在前,低位字节在后。例如,对于指令
其执行结果为(DPH)=12 H,(DPL)=34 H。
6.堆栈操作指令
在MCS-51单片机的内部RAM中可设置一个后进先出的区域,称为堆栈,通常设置在内部RAM的30H~7FH存储区中。堆栈遵循“后进先出”原则,数据压入堆栈时,堆栈区向地址增大的方向生长。堆栈的主要作用就是保护现场、保护断点。在特殊功能寄存器中有一个堆栈指针SP,它指向堆栈的栈顶位置。堆栈操作有进栈和出栈两种,因此,在指令系统中相应有两条堆栈操作指令。
(1)进栈指令
这条指令的功能是,首先将堆栈指针SP加1,然后把direct中的内容送到堆栈指针SP所指的内部RAM单元中。
例如,当(SP)=60 H,(A)=12 H,(B)=34 H时,执行下列指令
执行结果为(61H)=12 H,(62 H)=34H,(SP)=62 H。
(2)出栈指令
这条指令的功能是,将堆栈指针SP指示的栈顶内容送到direct字节单元中,堆栈指针SP减1。
例如,当(SP)=62 H,(62 H)=12H,(61H)=34 H时,执行下列指令
执行结果为(A)=12 H,(PSW)=34 H,(SP)=60H。
7.查表指令
这类指令共两条,均为单字节指令,这是MCS-51单片机指令系统中仅有的两条读程序存储器中表格数据的指令。由于对程序存储器只能读不能写,因此其数据的传送都是单向的,即从程序存储器中读出数据到累加器中。两条查表指令均采用基址加变址寄存器间接寻址方式。
(1)MOVC A,@A+PC
这条指令以PC作为基址寄存器,累加器A的内容作为无符号整数,和PC的当前值(下一条指令的起始地址)相加后得到一个新的16位地址,把该地址指定的程序存储单元的内容送到累加器A。
例如,当(A)=06H时,执行地址2000H处的指令
该指令占用一字节,下一条指令的地址为2001 H,(PC)=2001 H,再加上累加器A中的06 H,得到2007 H,执行结果是将程序存储器中的2007 H的内容送入累加器A。
这条指令的优点是不改变特殊功能寄存器及PC的状态,根据累加器A的内容就可以取出表格中的常数;缺点是表格只能存放在该条查表指令所在地址的+256个单元之内,表格的大小受限制,而且表格只能被一段程序所利用。
(2)MOVC A,@A+DPTR
这条指令以DPTR作为基址寄存器,累加器A的内容作为无符号数,和DPTR的内容相加得到一个16位地址,把由该地址指定的程序存储器单元的内容传送到累加器A。
例如,当(DPTR)=2000H,(A)=06H时,执行指令
执行结果是将程序存储器中2006H单元内容送入累加器A中。
这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此,表格的大小位置可以在64KB程序存储器空间中的任意位置,一个表格可以为各个程序块公用。
上述两条指令的助记符都是在MOV的后面加“C”,“C”是CODE的第一个字母,即表示程序存储器中的代码。执行上述两条指令时,单片机的引脚信号有效。
8.累加器A与片外RAM传送指令
在MCS-51单片机指令系统中,CPU对片外RAM的访问只能用寄存器间接寻址的方式,并且只能通过累加器A访问,指令只有四条:
第2条和第4条指令以DPTR为片外RAM 16位地址指针,寻址范围达64 KB。其功能是在DPTR所指定的片外RAM与累加器A之间传送数据。
第1条和第3条指令是用R0或R1作为低8位地址指针,高8位地址由P2口送出,此时,可寻址范围可达64 KB。
这两条指令完成以R0或R1为地址指针的片外RAM与累加器A之间的数据传送。
若片外RAM的地址空间上有I/O口,则上述4条指令就是MCS-51单片机的输入/输出指令。MCS-51单片机没有专门的输出指令,它只能用这种方式与外部设备进行交互。
9.字节交换指令
这组指令的功能是将累加器A中的内容与源操作数的内容进行互换。
例如,当(R0)=80H,(A)=20H时,执行指令XCH A,R0,执行结果为(A)=80H,(R0)=20H,如图2-19所示。
图2-19 指令XCH A,R0示意图
10.半字节交换指令
该指令的功能是将Ri间接寻址的单元内容与累加器A中内容的低4位互换,高4位内容不变。该操作只影响标志位P。
例如,当(R0)=30H,(30H)=67H,(A)=20H时,执行指令XCHD A,@R0,执行结果为(A)=27 H,(30 H)=60 H。
11.累加器半字节交换指令
该指令的功能是将累加器A的高4位和低4位互换。
例如,当(A)=56H时,执行指令SWAP A,执行结果为(A)=65H。