表 3-2 数据传送指令
操作码 |
目标操作数 |
可选择的源操作数 |
说 明 |
MOV |
A Rn direct @Ri DPTR |
Rn;direct;@Ri;# data A;direct;# dataA;Rn;direct;@Ri;# data A;direct;# data # data16 |
内部传送 内部传送 内部传送 内部传送 数据指针赋值 |
PUSH POP |
隐含(SP) direct |
direct 隐含(SP) |
压栈,只能用直接寻址 退栈,只能用直接寻址 |
XCH |
A |
Rn; direct; @Ri |
内部交换 |
XCHD SWAP |
A A |
@Ri 隐含A |
只交换低四位 A的高、低四位互换 |
MOVX |
A @Ri @DPTR |
@Ri; @DPTR A A |
A与外部数据存储器间传送 |
MOVC |
A |
@A+DPTR; @A+PC |
读外部程序存储器 |
MOV |
C bit |
bit C |
Cy与可寻址位间传送 |
1. 数据传送指令的一般性说明
ê 指令的一般格式: 操作码 目标操作数,源操作数
操作码 说明操作的性质
操作内容一般为 (目标操作数)←(源操作数)
ê 8位操作数的形式有A、Rn、direct、@Ri、# data 等五种
16位操作数的形式有DPTR 与 # data16
1位操作数的形式有 C 与 bit
ê 目标与源应同类型,且有规定的允许搭配,一般可逆。
A及direct可全搭配,@Ri、Rn不能相互搭配,# data只可作源.。
ê 传送指令一般不影响标志位。
直接改写PSW的情况除外,改写Acc影响P标志。
2. 内部数据传送指令(MOV)
ê 内部RAM、特殊功能寄存器(SFR)之间的数据传送。
ê 注意立即数 #XXH与直接地址XXH 的区别。
ê @Ri指针使用要点:①与循环配合,适用于连续数据区的操作。
②Ri应先赋确定值。i=0,1。
③是XCHD指令唯一的源操作数。
3. 外部数据传送(MOVX)
ê 以指针方式读、写外部数据存储器或I/O端口。
ê @DPTR提供16位地址指针,可访问总线扩展的整个64k空间。
ê @Ri只提供低8位地址指针,适用于256个地址的小规模总线扩展。
或者由P2口以I/O方式提供高8位(页) 地址,采用页访问模式。例如:
MOV P2,#30H ;由P2口提供高8位地址30H
MOV R0,#0 ;低8位地址为00H
MOVX A,@R0 ;读(3000H)单元
ê 应用例:将内部30H~40H单元的内容送外部数据存储器,从4000H单元开始存放。
MOV R0,#30H
MOV R2,#17
MOV DPTR,#4000H
LOOP: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R2,LOOP
;设置(内部)源指针初值
;设置循环计数器初值
;设置(外部)目标指针初值
;循环入口,读源数据
;写目标数据
;源指针下移
;目标指针下移
;循环计数器减一,不为0则继续循环
4. 读外部程序存储器(MOVC)
ê 读取外部程序存储器中的数据,用于查表。
ê MOVC A,@A+PC ;(A)←((A)+(PC)+1)
PC为本指令的地址,取指令后加一。
变址偏移量(A)是8位无符号数,因此查表的范围在(PC)+1 ~ (PC)+255。
ê MOVC A,@A+DPTR ;(A)←((A)+(DPTR))
DPTR是16位指针,因此查表的范围为全64k空间。
3000H MOV A,#表元素序号
3002H ADD A,#表头偏移量
3004H MOVC A, @A+PC
¼¼
ORG 30A0H
TABLE: DB 17,22,34,58,82,103
表头偏移量=表头地址-(MOVC指令地址+1)
转载须保留地址:http://www.51hei.com/mcu/280.html
5. 栈操作数据传送指令(PUSH / POP)
ê 堆栈在内部RAM区。
ê PUSH和POP的对象可以是内部RAM单元或SFR。
ê 寻址方式只能用direct。例如,
PUSH 30H ;(SP)←(SP)+1,((SP))←(30H)
POP DPH ;(DPH)←((SP)),(SP)←(SP)-1
6. 交换(XCH / XCHD /SWAP)
ê XCH 字节交换:A与内部RAM单元或SFR交换。例如
XCH A,R2 ;(A)«(R2)
ê XCHD 半字节交换:A与内部RAM单元进行低四位交换,只能用寄存器间址@Ri。例如
XCHD A,@R1 ;(A)D0- D 3 «((R1))D0- D 3
ê SWAP A ;(A)D0- D 3 «(A)D4- D 7
ê 应用例:拆字,将压缩BCD码扩展为单字节BCD码。
MOV R0, #30H ; 设立指针
MOV A, #0 ;(A)=0
XCHD A, @R0 ;(A)=0BH
MOV R4, A ;(R4)=0BH
XCH A,30H ;(A)=30H
SWAP A ;(A)=03H
MOV R3,A ;(R3)=03H