3.3.1 数据传送指令
数据传送是最基本、最主要的操作,共有29条,可分为内部RAM数据传送、外部RAM数据传送、程序存储器数据传送、数据互换和堆栈操作5组。
1.内部RAM传送指令(16条)
该组指令用于单片机内部数据存储区和寄存器之间的数据传送,指令格式见表3-1。
表3-1 内部RAM传送指令
(续)
【例3-1】设片内RAM单元存放的数据是:(50H)=55H,(51H)=66H,(66H)=77H。分析以下指令顺序执行的目的操作数。
2.外部RAM传送指令(4条)
该组指令用于单片机外部数据存储区和寄存器之间的数据传送,指令格式见表3-2。
表3-2 外部RAM传送指令
这组指令采用了间接寻址方式,当采用16位数据指针DPTR间接寻址,完成DPTR所指定的片外数据存储器与A的数据传送时,可寻址范围达64KB。其中,低8位地址由P0口输出,高8位地址由P2口输出。当采用Ri(R0或R1)间接寻址,完成以R0或R1为间接地址的片外数据存储器与A的数据传送时,低8位地址由Ri指出,由P0口输出,高8位地址需要事先用指令“MOV P2,#data”指定。
【例3-2】以下程序实现把片内60H单元的数送到片外RAM的2000H单元。
解1:MOV A,60H
MOV DPTR,#2000H
MOV @DPTR,A
解2:MOV A,60H
MOV R0,#00
MOV P2,#20H
MOV @R0,A
3.程序存储器传送指令(2条)
该组指令用于从单片机内部ROM读取数据给累加器,指令格式见表3-3。
表3-3 程序存储器传送指令
这组指令又叫查表指令,属于变址寻址方式,是对存放于程序存储器中的数据表格进行查找传送。
第一条指令MOVC A,@A+DPTR,以DPTR作为基址寄存器,用来存放表的起始地址,它可以指向外部ROM的64KB范围内的任意一个地址单元,累加器A作为变址寄存器,在源操作数中作为数据表格起始地址的偏移地址。
第二条指令MOVC A,@A+PC,以PC作为基址寄存器,但指令中PC的地址是可以变化的,它随着指令在程序中位置的不同而不同,一旦指令在程序中位置确定以后,PC中内容也被给定,累加器A作为变址寄存器,在源操作数中作为当前PC值到数据表格中要访问数据的偏移字节,由于A的长度为一个字节,使用能够寻找的偏移地址应在FFH之内。
【例3-3】用查表指令把数据表TAB中第三个单元的数传给累加器A,比较使用两种查表指令的不同。
1)使用MOVC A,@A+PC
2)使用MOVC A,@A+DPTR
以上两段程序执行的结果,累加器A中的数都为TAB表第3个单元中的43H。
4.堆栈指令
“堆栈”就是在单片机内部SRAM中定义一块存储空间,对这块区间进行数据“先进出后”的操作,操作的单元由堆栈指针指定。堆栈操作有进栈(PUSH)和出栈(POP)两条,操作数由直接地址确定,属于直接寻址,指令格式见表3-4。
表3-4 堆栈指令
【例3-4】通过堆栈,交换两个单元的数据。设(30H)=#12H,(31H)=#34H。
5.字节交换指令(5条)
该组指令用于字节交换和半字节交换,指令格式见表3-5。
表3-5 字节交换指令
【例3-5】设A=60H,R6=A5H,(60H)=69H,顺序执行以下指令的结果。